- Postgres là một nền tảng hợp nhất có thể xử lý nhiều chức năng như tìm kiếm, vector, chuỗi thời gian, hàng đợi... trong một cơ sở dữ liệu duy nhất
- Cách dùng nhiều cơ sở dữ liệu chuyên biệt gây ra sự kém hiệu quả và rủi ro trong quản trị, bảo mật, sao lưu, ứng phó sự cố...
- Trong kỷ nguyên AI, cơ sở dữ liệu cần được sao chép, kiểm thử và xóa nhanh chóng, nên kiến trúc một hệ thống duy nhất bảo đảm tính đơn giản và sự linh hoạt
- Các phần mở rộng (extensions) của Postgres sử dụng cùng thuật toán như Elasticsearch, Pinecone, InfluxDB..., và hiệu năng cũng đã được chứng minh
- Với phần lớn doanh nghiệp (99%), chỉ một Postgres là đủ, còn kiến trúc phân tán phức tạp chỉ cần cho số rất ít doanh nghiệp quy mô cực lớn
Sự cần thiết của việc hợp nhất cơ sở dữ liệu
- Bài viết ví cơ sở dữ liệu như một ngôi nhà, và giải thích Postgres là cấu trúc hợp nhất nhiều chức năng dưới cùng một mái nhà
- Có thể xử lý nhiều mục đích như tìm kiếm, vector, chuỗi thời gian, hàng đợi... trong một hệ thống duy nhất
- Ngược lại, lời khuyên “hãy dùng đúng công cụ cho đúng việc” rốt cuộc dẫn đến việc vận hành song song nhiều cơ sở dữ liệu
- Đưa ra ví dụ 7 hệ thống: Elasticsearch, Pinecone, Redis, MongoDB, Kafka, InfluxDB, PostgreSQL
- Phải quản lý riêng truy vấn, sao lưu, bảo mật, giám sát, ứng phó sự cố cho từng hệ thống
- Kiến trúc phân tán như vậy khiến việc dựng môi trường kiểm thử và xử lý sự cố trở nên khó khăn, đặc biệt độ phức tạp tăng vọt khi phải xử lý sự cố lúc rạng sáng
Tính đơn giản trong kỷ nguyên AI
- AI agent cần tạo, xác minh và xóa cơ sở dữ liệu thử nghiệm thật nhanh
- Với một cơ sở dữ liệu duy nhất, có thể làm bằng một lệnh; nhưng với nhiều hệ thống thì cần đồng bộ snapshot và điều chỉnh cấu hình
- Việc quản lý đồng thời nhiều cơ sở dữ liệu đòi hỏi mức độ phức tạp như R&D
- Trong kỷ nguyên AI, tính đơn giản được nhấn mạnh là yếu tố bắt buộc
Huyền thoại về sự ‘vượt trội’ của cơ sở dữ liệu chuyên biệt
- Nhận thức rằng cơ sở dữ liệu chuyên biệt giỏi hơn trong một số tác vụ nhất định bị chỉ ra là hiệu ứng marketing bị thổi phồng
- Trên thực tế, các phần mở rộng của Postgres dùng các thuật toán tương đương hoặc tốt hơn
- Theo bảng so sánh, các phần mở rộng của Postgres tương ứng như sau
| Chức năng |
DB chuyên biệt |
Phần mở rộng Postgres |
Cùng thuật toán |
| Tìm kiếm toàn văn |
Elasticsearch |
pg_textsearch |
BM25 |
| Tìm kiếm vector |
Pinecone |
pgvector + pgvectorscale |
HNSW/DiskANN |
| Chuỗi thời gian |
InfluxDB |
TimescaleDB |
Phân vùng theo thời gian |
| Bộ nhớ đệm |
Redis |
UNLOGGED tables |
Lưu trữ trong bộ nhớ |
| Tài liệu |
MongoDB |
JSONB |
Lập chỉ mục tài liệu |
| Dữ liệu không gian |
GIS |
PostGIS |
Tiêu chuẩn ngành |
- pgvectorscale ghi nhận độ trễ thấp hơn 28 lần và chi phí thấp hơn 75% so với Pinecone
- TimescaleDB cho hiệu năng tương đương hoặc tốt hơn InfluxDB, còn pg_textsearch sử dụng cùng xếp hạng BM25 như Elasticsearch
Chi phí ẩn của việc phân tán cơ sở dữ liệu
- Khi vận hành nhiều hệ thống, mọi chi phí quản trị như sao lưu, giám sát, vá bảo mật, ứng phó sự cố đều tăng lên gấp 7
- Gánh nặng nhận thức: phải học nhiều ngôn ngữ khác nhau như SQL, Redis, Elasticsearch DSL, MongoDB, Kafka, InfluxDB...
- Vấn đề nhất quán dữ liệu: đồng bộ thất bại giữa Postgres và Elasticsearch gây ra data drift
- Suy giảm tính sẵn sàng: SLA của nhiều hệ thống bị nhân với nhau làm giảm tổng tỷ lệ uptime (ví dụ: 99.9% × 3 = 99.7%)
Stack Postgres hiện đại
- Các phần mở rộng của Postgres đã được kiểm chứng trong môi trường dịch vụ thực tế suốt nhiều năm
- PostGIS(2001), Full-text search(2008), JSONB(2014), TimescaleDB(2017), pgvector(2021)
- Hơn 48.000 doanh nghiệp như Netflix, Spotify, Uber, Reddit, Instagram, Discord... đang dùng PostgreSQL
- Các phần mở rộng cho kỷ nguyên AI
| Phần mở rộng |
Thay thế cho |
Đặc điểm |
| pgvectorscale |
Pinecone, Qdrant |
Thuật toán DiskANN, độ trễ thấp hơn 28 lần, giảm 75% chi phí |
| pg_textsearch |
Elasticsearch |
Triển khai trực tiếp xếp hạng BM25 trong Postgres |
| pgai |
Pipeline AI bên ngoài |
Tự động đồng bộ embedding khi dữ liệu thay đổi |
- Có thể xây dựng ứng dụng RAG bằng một Postgres duy nhất: một ngôn ngữ truy vấn, một hệ thống sao lưu, một môi trường kiểm thử
Ví dụ về các phần mở rộng chính
- pg_textsearch: thay thế Elasticsearch, hỗ trợ tìm kiếm dựa trên BM25
- pgvector + pgvectorscale: thay thế Pinecone, tìm kiếm vector dựa trên DiskANN
- TimescaleDB: thay thế InfluxDB, hỗ trợ nén dữ liệu chuỗi thời gian và SQL
- UNLOGGED tables: thay thế Redis, triển khai bảng cache
- pgmq: thay thế Kafka, cung cấp chức năng hàng đợi thông điệp
- JSONB: thay thế MongoDB, lưu trữ và lập chỉ mục dữ liệu dạng tài liệu
- PostGIS: hỗ trợ xử lý dữ liệu không gian
- pg_cron: tự động hóa tác vụ lập lịch
- pg_trgm: hỗ trợ tìm kiếm chịu lỗi gõ sai
- Recursive CTEs: triển khai chức năng duyệt đồ thị
Kết luận
- Postgres có cấu trúc như một ngôi nhà với nhiều căn phòng, tích hợp nhiều khả năng xử lý dữ liệu khác nhau
- Với phần lớn doanh nghiệp (99%), chỉ một Postgres là đủ; chỉ số rất ít (1%) mới cần hệ thống phân tán siêu quy mô
- Lời khuyên “đúng công cụ cho đúng việc” bị xem là logic marketing để bán cơ sở dữ liệu
- Nguyên tắc được đưa ra là hãy bắt đầu với Postgres, và chỉ thêm độ phức tạp khi thực sự cần
- Kết lại: năm 2026, cứ dùng Postgres là được
1 bình luận
Ý kiến trên Hacker News
Thật bất tiện khi khó nhúng Postgres vào ứng dụng local-first và còn phải bắt buộc cấu hình Docker
Nếu PGlite hỗ trợ nhiều kết nối writer thì sẽ hoàn hảo. SQLite cũng ổn, nhưng tôi muốn có extension của PG và hỗ trợ multi-writer song song thực sự
Sau một thời gian dài mới tìm hiểu lại về cơ sở dữ liệu, tôi thấy Postgres đúng là một hệ thống kỳ diệu
Chèn hàng chục triệu dòng vào nhiều bảng, chỉ cần đánh index hợp lý thì gần như mọi truy vấn đều phản hồi dưới 100ms
Khi phân tích execution plan, bạn có thể biết ngay cần thêm index nào, điều đó thật đáng kinh ngạc. DB hiện đại đúng là phép màu
Tất nhiên bây giờ nó tốt hơn nhiều, nhưng phần lớn tiến bộ nằm ở các tính năng truy vấn nâng cao hoặc tối ưu vận hành
Tôi là fan của Postgres, nhưng không đồng ý với lời khuyên “cứ dùng Postgres là được”
Xây dựng một stack đơn giản hóa quanh Postgres là tốt, nhưng điều đó không có nghĩa nó hiệu quả cho mọi workload
Thời ở Citus Data, tôi đã thấy nhiều trường hợp một đội chuyên gia Postgres phải liên tục tuning và vận hành toàn thời gian
Khi các use case AI tăng lên, xu hướng là áp dụng công nghệ chuyên dụng sớm hơn nhiều
Chi tiết đã được tổng hợp trong blog của ClickHouse
Tôi nghĩ cách tiếp cận tốt hơn là kết hợp tổng thể giữa Postgres và các công nghệ chuyên dụng
Khi một công nghệ trở thành tiêu chuẩn, lập trình viên sẽ biến thành linh kiện có thể thay thế. Giống như lập trình viên React vậy
Việc đồng nhất công nghệ là chiến lược giúp doanh nghiệp dễ thay người hơn. Cần giữ gìn sự đa dạng của công cụ
Tôi cũng dùng Postgres thường xuyên, nhưng đôi khi sự đơn giản mới là điều quan trọng hơn
Với khám phá dữ liệu hay công việc GIS thì Postgres.app là hoàn hảo, nhưng với máy chủ đơn giản thì đôi lúc SQLite lại tốt hơn
Ngay cả trong phân tích dữ liệu nhỏ, Postgres cũng nhanh hơn SQLite rất nhiều. Khác biệt về index và tính năng là rất lớn
Nhưng trong 99% trường hợp tôi dùng Postgres. Nó ổn định, dễ mở rộng và theo cảm nhận của tôi còn tốt hơn Oracle hay MySQL
GRANT ALL PRIVILEGESkhông phải lúc nào cũng hiệu quảPostgres miễn phí, nhanh và phù hợp cho ứng dụng dùng chung, còn SQLite lại tối ưu cho người phát triển một mình
Cuối cùng thì còn tùy use case
Trước đây chúng tôi dùng tìm kiếm dựa trên MariaDB, rồi chuyển sang Elasticsearch và thấy cả tốc độ lẫn độ đơn giản đều tốt hơn nhiều
Nhưng nếu chỉ là tìm kiếm đơn giản thì Postgres là đủ.
Tốt hơn là nên chờ trước khi chuyển sang công cụ mới, và chỉ chuyển khi thực sự cần mới hiệu quả
Các DB như Pinecone hay Redis trong một số mục đích nhất định có hiệu quả chi phí tốt hơn nhiều
Nhưng tùy tình huống, giải quyết bằng Postgres lại có thể tốt hơn.
Cuối cùng vẫn phải quyết định theo quy mô và việc có hay không có đội ngũ vận hành
Postgres là quá đủ cho hầu hết giai đoạn đầu, rồi sau khi lớn lên mới xem xét giải pháp khác
Gần đây tôi đang chuyển sang MySQL và SQLite thay vì Postgres.
Vacuum, bảo trì và các footgun của Postgres khá phiền
Tuy vậy, nếu thiết kế tốt clustered index thì range scan sẽ rất nhanh
Cần một storage engine không cần VACUUM. Xem wiki Zheap
Postgres rất tuyệt, nhưng có hai vấn đề mang tính nền tảng
Thứ nhất, Postgres không phải công cụ tích hợp mà là một bộ công cụ, nên khối lượng phải học rất nhiều
Thứ hai, Postgres là thiết kế dựa trên HDD, nên trong thời đại SSD có thể kém hiệu quả
Một RDBMS dành riêng cho SSD có khả năng đơn giản hơn và nhanh hơn
Việc cấu hình clustering (HA) cho Postgres quá phức tạp
Có các công cụ như Patroni, Spilo, timescaledb-ha, nhưng quản lý khó và tài liệu cũng thiếu
CloudNativePG là cách duy nhất thấy dễ dùng, nhưng lại phụ thuộc vào Kubernetes
Sẽ thật tốt nếu có thể cấu hình replica set đơn giản như MongoDB
Muốn vượt qua kiểm thử Jepsen thì cần thay đổi ở cấp cấu trúc (như Yugabyte, Neon)
Có ý kiến về việc dùng Postgres làm cache
Redis nhanh hơn nhiều, nhưng nếu quy mô nhỏ thì Postgres cũng đủ dùng
Xử lý hàng tỷ request mà vẫn chạy tốt không cần restart
còn nếu là kiến trúc máy chủ stateless thì Redis đáng để cân nhắc. Nếu là tiến trình dài hạn trên JVM thì cũng có thể dùng cache nội bộ
Nhưng khi tải tăng cao thì sẽ cần cache bên ngoài, và phải từ bỏ tính nhất quán giao dịch