4 điểm bởi GN⁺ 2025-05-29 | 1 bình luận | Chia sẻ qua WhatsApp
  • Trình pooler giao dịch và quản lý sao chép logic cho PostgreSQL được phát triển bằng Rust, cung cấp mở rộng theo chiều ngang và tự động hóa sharding
  • Có thể shard cơ sở dữ liệu PostgreSQL dễ dàng mà không cần extension, được tối ưu để quản lý hàng trăm cơ sở dữ liệu và hàng trăm nghìn kết nối
  • bộ cân bằng tải DB hoạt động ở tầng ứng dụng (OSI 7), có thể tự động định tuyến SELECT tới replica và các truy vấn còn lại tới primary
  • Hỗ trợ pooling giao dịch/phiên như PgBouncer, đồng thời phân tích truy vấn để tự động định tuyến tới shardgộp kết quả
  • Sử dụng COPY và logical replication để tự động phân phối dữ liệu vào các shard hoặc shard cơ sở dữ liệu hiện có mà không gián đoạn
  • Cấu hình có thể được định nghĩa đơn giản bằng tệp TOML và hỗ trợ tái cấu hình lúc runtime
  • Khác với Citus dùng extension Postgres, đây là proxy bên ngoài DB nên có thể dùng cả trên RDS, Cloud SQL, v.v.

Giới thiệu dự án và giá trị chính

  • PgDog là giải pháp mã nguồn mở hỗ trợ mở rộng theo chiều ngang toàn diện cho cơ sở dữ liệu PostgreSQL, bao gồm sharding dễ dàng, logical replication, transaction pooling và cân bằng tải L7
  • Được phát triển bằng ngôn ngữ Rust để đảm bảo hiệu năng caođộ an toàn
  • Không cần cài extension, chỉ với một lần triển khai proxy duy nhất, PgDog có thể hiện thực sharding, phân tán dữ liệu, phục hồi sự cố và cân bằng tải linh hoạt
  • Khác với các sản phẩm cạnh tranh (ví dụ: PgBouncer, PgCat), điểm mạnh là hỗ trợ cả sharding tự động và logical replication, đồng thời cho phép thay đổi cấu hình khi đang vận hành và giám sát thời gian thực

Tính năng chính

Cân bằng tải (Load Balancer)

  • PgDog là proxy cấp ứng dụng ở tầng 7 OSI, phân phối truy vấn tới nhiều replica và node chính của PostgreSQL để tránh sự cố và quá tải
  • Cung cấp nhiều chiến lược phân phối như round-robin, ngẫu nhiên, ít kết nối nhất
  • Phân biệt loại truy vấn để gửi SELECT tới replica, còn các truy vấn ghi sẽ tự động được chuyển tới node chính
  • Thực hiện health check và tự động failover khi có sự cố, bảo đảm tính sẵn sàng ngay cả khi lỗi mạng hoặc hỏng hóc phần cứng

Transaction pooling

  • Giống như PgBouncer, PgDog hỗ trợ pooling giao dịch và phiên để quản lý tài nguyên kết nối hiệu quả, cho phép phục vụ hàng trăm nghìn client chỉ với một số ít kết nối backend

Sharding

  • Trực tiếp phân tích cú pháp truy vấn để trích xuất khóa shard và áp dụng thuật toán định tuyến tối ưu
  • Hỗ trợ cả truy vấn cross-shard giữa nhiều cơ sở dữ liệu shard, gộp kết quả trong bộ nhớ rồi truyền minh bạch tới client
  • Khi chạy lệnh COPY, hỗ trợ phân phối dữ liệu đa shard thông qua phân tích CSV, thuận tiện cho nạp dữ liệu khối lượng lớn
  • Dựa trên giao thức logical replication của PostgreSQL để đồng bộ nền không gián đoạn, cho phép thêm shard mới và mở rộng theo thời gian thực ngay trong lúc vận hành

Giám sát

  • Hỗ trợ cả cơ sở dữ liệu quản trị theo phong cách PgBouncer và endpoint OpenMetrics
  • Cung cấp ví dụ tích hợp giám sát và dashboard bên ngoài như Datadog

Cấu hình và runtime

  • Môi trường chính: Kubernetes (có Helm chart), Docker và môi trường cục bộ (build bằng Rust), có thể triển khai và kiểm thử dễ dàng
  • Thông thường chỉ cần viết 2 tệp cấu hình (pgdog.toml, users.toml) là có thể hoàn tất môi trường vận hành tối thiểu cho sharding và quản lý người dùng
  • Phần lớn giá trị cấu hình có thể chỉnh sửa theo thời gian thực và được áp dụng động mà không cần khởi động lại tiến trình

Hiệu năng và giấy phép

  • PgDog là proxy mạng bất đồng bộ hiệu năng cao dựa trên Rust và Tokio, tập trung giảm thiểu di chuyển dữ liệu và hạn chế suy giảm hiệu năng
  • Tài liệu chính thức cung cấp kết quả benchmark để làm mốc tham chiếu hiệu năng
  • Áp dụng giấy phép mã nguồn mở AGPL v3, hoàn toàn mở cho mục đích sử dụng nội bộ doanh nghiệp và tùy biến riêng
  • Tuy nhiên, các doanh nghiệp cung cấp dịch vụ public cloud sẽ phải chia sẻ nội dung thay đổi mã nguồn nếu có sửa đổi mã

Tình trạng dự án và đóng góp

  • Hiện dự án vẫn ở giai đoạn đầu, khuyến nghị early adopter tự triển khai trước; độ ổn định theo từng tính năng đang tiếp tục được cải thiện qua các bản cập nhật
  • Việc kiểm thử và benchmark theo từng tính năng cũng đang được tiến hành liên tục
  • Hoan nghênh đóng góp từ cộng đồng mã nguồn mở, chi tiết xem trong Contribution Guidelines

Kết luận

  • PgDog mang lại giải pháp nổi bật cho các đội ngũ phát triển và doanh nghiệp cần khả năng mở rộng theo chiều ngang, tính sẵn sàng cao và sharding tự động cho PostgreSQL trong môi trường vận hành
  • Ưu điểm lớn là có thể áp dụng nhanh và tùy biến mà không cần extension riêng hay hạ tầng phức tạp

1 bình luận

 
GN⁺ 2025-05-29
Ý kiến Hacker News
  • Chào Lev và chia sẻ rằng hiện đang cân nhắc giữa PgDog và tự xây dựng để phân mảnh một cơ sở dữ liệu Postgres quy mô 40TB, đồng thời nhắc đến việc cần một giải pháp hoạt động giống Vitess for PostgreSQL; nhấn mạnh rằng ngoài tính năng scatter-gather còn cần quản lý cấu hình dựa trên thứ như etcd, tách shard, và các giao dịch best-effort để áp dụng thay đổi schema trên toàn bộ shard. Cũng hỏi về kinh nghiệm viết lại truy vấn bằng pg_query.rs, chia sẻ cảm nhận rằng việc viết lại khá khó do tính bất biến của các kiểu AST và thiếu deep clone, nên cuối cùng đang dùng crate sqlparser có hỗ trợ mẫu Visitor; đồng thời cho biết đang phát triển như một side project tính năng thay đổi schema online cho PG dựa trên shadow tables và logical replication

    • Vui vì có lời đề nghị hợp tác và chia sẻ thông tin liên hệ; giải thích rằng quản lý cấu hình đã có thể giải quyết bằng K8s hoặc nhiều công cụ CD khác nhau và có thể đồng bộ việc reload cấu hình của PgDog. Cho biết thay đổi schema trên toàn shard bằng giao dịch best-effort đã hoạt động, và dù thay đổi schema idempotent là tốt nhất thì khi thất bại, two-phase commit cũng là một phương án đang được cân nhắc. Nêu ví dụ rằng tách shard có thể thực hiện bằng logical replication, nhắc đến kinh nghiệm 10TB+ tại Instacart: sau khi mở replication slot thì phục hồi sang N instance, xóa dữ liệu có số shard không khớp rồi đồng bộ lại bằng logical replication. Cũng tiết lộ ý tưởng phân tách song song bằng cách dùng logical replication của Pg 17 trên streaming replica, đồng thời đang nghĩ tới cách COPY dữ liệu trực tiếp bằng foreign table. Nhấn mạnh rằng pg_query.rs giờ có vẻ đã hoạt động theo cách có thể biến đổi được, nên gần đây thực sự đang tích cực dùng nó để viết lại và sinh truy vấn; lợi thế quan trọng là nó dựa 100% trên parser của Postgres, và có rất nhiều chỗ hỗ trợ tính năng "deparse" nên khả năng xử lý tác vụ phức tạp là khá cao
  • Nếu có Vitess for Postgres thì chẳng phải Yugabyte đang đóng vai trò đó sao?

  • Nếu chỉ nhìn vào tính năng cốt lõi thì có vẻ nhỏ, nhưng cho rằng việc dùng PgDog để không phải sửa mã nguồn và tách đọc sang read replica, ghi sang primary là một lợi thế cực lớn. Vì nhiều ứng dụng không trực tiếp hỗ trợ tách R/W, nên xử lý ở tầng proxy từng mang lại cải thiện tốc độ rất lớn trong quá khứ; đồng thời khen ngợi dự án

    • Hướng dẫn rằng tính năng này đã có thể dùng trong pgcat và chia sẻ liên kết pgcat

    • Chia sẻ rằng tại Instacart từng dùng Makara để tách R/W, nhưng việc phải triển khai cùng một thứ lặp đi lặp lại trong nhiều môi trường ngôn ngữ như Python hay Go là khá phiền phức

  • Đánh giá dự án rất ấn tượng, đồng thời có chút dè dặt với việc sharding hoàn toàn tự động; giải thích rằng thông thường sharding diễn ra ở ranh giới tenancy và muốn có ma sát khi vượt qua ranh giới đó. Vì join liên shard khác với join nội shard về hiệu năng, bộ nhớ và CPU, nên cho rằng nên làm điều đó hiển thị rõ ràng hơn. Tuy vậy, không nghi ngờ gì về bản thân dự án và tin rằng sẽ có rất nhiều trường hợp sử dụng

    • Hỏi vì sao lại cố tình muốn có ma sát, đồng thời nói thêm rằng các vấn đề hiệu năng của join liên shard đa phần đều đã được hiểu khá rõ và có thể theo dõi bằng metric thời gian thực; cuối cùng cho rằng cả hai cách đều cần thiết, còn phương án join trong mã ứng dụng thì không mấy lý tưởng
  • Đang để mắt tới PgDog và đánh giá là rất ấn tượng, chúc mừng ra mắt và mong nó tiếp tục phát triển

    • Cho biết hành trình 15 năm giờ mới bắt đầu
  • Cho rằng sức hút cốt lõi nằm ở việc xử lý truy vấn phân tán trong khi vẫn duy trì tính minh bạch và tương thích ở tầng mạng; các giới hạn hiện có trong tài liệu là điều dễ hiểu và kỳ vọng sẽ cần những đánh đổi. Tò mò không biết sẽ giải quyết ra sao và đề nghị cùng tham gia thảo luận thêm nếu có

  • Nhắc rằng trong các giải pháp như PgDog, khó khăn lớn nhất là xử lý đúng phần 1% cuối cùng của các truy vấn phức tạp trên dữ liệu đã shard (hoặc phát hiện truy vấn bất thường), cũng như bảo đảm hoàn toàn tính cô lập và tính nhất quán

  • Vừa nhìn tài liệu đã kiểm tra ngay xem có hỗ trợ Unique Index hay không, nhưng phản hồi rằng hiện vẫn chưa hỗ trợ vì cần viết lại truy vấn và một execution engine riêng, điều này khá đáng tiếc; dù vậy vẫn thấy nhiều tiềm năng và rất kỳ vọng

    • Chia sẻ rằng như một phần thưởng nhỏ, việc tạo primary key duy nhất trên mọi shard đã được hỗ trợ và cung cấp liên kết tài liệu liên quan; đồng thời nói rằng việc triển khai unique index xuyên shard rất tốn kém vì phải kiểm tra trên mọi truy vấn, nên đang để ngỏ ý tưởng này
  • Nhấn mạnh đây là dự án Postgres thú vị nhất mà mình thấy trong nhiều năm; cho rằng benchmark được cung cấp có vẻ chỉ nói về connection pooling cơ bản, nên tò mò kết quả sẽ ra sao khi có parsing truy vấn hoặc join liên shard hoạt động

    • Giải thích rằng parser truy vấn được cache, nên khi dùng prepared query hoặc placeholder thì gần như không có chi phí ngoài thêm khóa và tra cứu hash; còn với join liên shard, chi phí xử lý truy vấn có thể tăng cao nếu bộ lọc không tối ưu, và khi tập kết quả lớn có thể cần paging ra đĩa. Cho biết hiện đang ưu tiên tập trung vào OLTP để pushdown join tối đa có thể, và dự đoán nhu cầu join liên shard cũng sẽ sớm tăng mạnh
  • Đánh giá đây là một đổi mới rất cần thiết cho khả năng mở rộng của Postgres và chúc mừng ra mắt

  • Dự án trông cực kỳ xuất sắc, chúc mừng ra mắt

    • Nhấn mạnh đây là kết quả của nhiều năm nỗ lực