- Tiện ích mở rộng sao chép active-active dành cho PostgreSQL do AWS phát triển và công bố
- Khi cần ghi và sửa dữ liệu trên nhiều phiên bản PostgreSQL, thay vì mô hình active-standby truyền thống chỉ cho một phiên bản duy nhất nhận thay đổi, có thể xây dựng một kiến trúc cho phép thay đổi đồng thời và sao chép giữa nhiều phiên bản
- Phù hợp với các kịch bản như cấu hình cơ sở dữ liệu tính sẵn sàng cao trên nhiều region, giảm thiểu độ trễ ghi, cập nhật blue/green cho ứng dụng, và di chuyển dữ liệu hai chiều
- Tận dụng logical replication để hỗ trợ phát hiện xung đột, xử lý xung đột khi ghi, chuyển đổi định dạng cơ sở dữ liệu đích, v.v.
Khái niệm sao chép active-active
- Sao chép (Replication) là công nghệ đồng bộ hóa các thay đổi giữa các cơ sở dữ liệu
- Cấu trúc active-standby truyền thống của PostgreSQL chỉ cho một phiên bản nhận thay đổi, còn các phiên bản khác ở dạng chỉ đọc, nên một nơi sẽ đóng vai trò là nguồn dữ liệu duy nhất
- pgactive cung cấp topology sao chép active-active, cho phép ghi dữ liệu đồng thời trên nhiều phiên bản
- Cách tiếp cận này phù hợp với các môi trường cần nhiều điểm ghi, ví dụ như triển khai đa region hoặc di chuyển dữ liệu hai chiều
- Trong mô hình active-active, cần quản lý riêng các vấn đề như xung đột, độ trễ và một số giới hạn tính năng
Công nghệ cốt lõi: logical replication
- Logical Replication truyền dữ liệu theo định dạng mà các hệ thống bên ngoài có thể diễn giải được
- Thông qua logical replication, có thể triển khai nhiều tính năng bổ sung trên cơ sở dữ liệu đích như phát hiện xung đột, xử lý xung đột khi ghi, chuyển đổi truy vấn, v.v.
- PostgreSQL đã giới thiệu logical replication cơ bản từ phiên bản 10 vào năm 2017, nhưng sao chép active-active đòi hỏi thêm các tính năng bổ sung
- Do đặc tính thiết kế của PostgreSQL, các chức năng này có thể được phát triển và áp dụng dưới dạng extension
- Cộng đồng phát triển PostgreSQL cũng đang dần bổ sung các tính năng tương ứng vào dự án cốt lõi
1 bình luận
Ý kiến trên Hacker News
Bản ra đời sớm nhất và đến nay vẫn là mã nguồn mở là BDR1 (liên kết), và pgactive được xây dựng dựa trên đó
BDR2 là bản viết lại BDR1 dưới dạng mã nguồn đóng, và cuối cùng đã bị loại bỏ
pglogical v1 và v2 (đều là mã nguồn mở, liên kết) đã được phát hành, trong đó v1 được chỉnh sửa lớn và hợp nhất vào Postgres 10
Dựa trên kinh nghiệm với tính năng logical replication của Postgres 10, 2nd Quadrant bắt đầu phát triển pglogical v2, và từ đây pgEdge cũng xuất hiện
Sau đó 2nd Quadrant tạo ra pglogical v3 và BDR v3 ở dạng mã nguồn đóng, rồi hợp nhất hai thứ này thành BDR v4
Sau đó tên sản phẩm BDR được đổi thành Postgres Distributed(PGD, liên kết)
Sau khi 2ndQuadrant được EDB mua lại, EDB đã phát hành PGD v6
Khi xảy ra xung đột, giá trị được ghi sau cùng theo timestamp sẽ là giá trị cuối cùng được áp dụng
Lịch sử các xung đột được lưu trong một bảng đặc biệt tên là pgactive_conflict_history, nên có thể xem lịch sử và xử lý thủ công nếu cần
Xem thêm chi tiết và tài liệu tại đây
Nếu tính năng đó có thể chính thức được đưa vào Postgres thì sẽ khá thú vị
Ví dụ muốn đọc dữ liệu từ production hoặc staging, nhưng chỉ sửa được ở local, và kết quả đó không bị đẩy ngược lên upstream trong một cơ sở dữ liệu thứ cấp
Hiện tại đa phần vẫn là định kỳ chạy script (cron v.v.) để dump dữ liệu hoặc bắn truy vấn tạo snapshot, lưu lên S3 rồi kéo về local để khôi phục dữ liệu
Cách này phần lớn hiệu quả, nhưng đôi khi thời gian build index quá lâu
Do các vấn đề pháp lý và đạo đức khá lớn nên đa số công ty không khuyến nghị cách làm này
Như vậy có thể sửa bảng local mà không ảnh hưởng tới primary
Khuyến nghị lệnh
createdb --templateKhông nghĩ ra được một chiến lược merge nào dùng được cho mọi tình huống
Replica không bị chặn ghi, chỉ là kết quả đó không lan sang nơi khác
Tốt nhất là thiết kế kiến trúc sao cho không có vùng dữ liệu ghi nào bị chồng lấn giữa các instance active
Trong trường hợp như vậy, các công cụ như pgactive sẽ hữu ích
Hoặc dùng hẳn cơ sở dữ liệu phân tán ngay từ đầu (như Yugabyte)
Tất cả master đều đọc được mọi schema, nhưng khi ghi thì mỗi bên chỉ phụ trách phần của mình
Tò mò liệu ngoài schema ra thì partition v.v. có thể dùng để phân chia trách nhiệm hay không
Không dễ hình dung họ sẽ trực tiếp dùng tính năng này trong sản phẩm của mình ở đâu
RDS dùng block replication, còn Aurora dùng SAN replication riêng
Đoán có thể họ định tận dụng nó trong DMS gì đó
Trong một cơ sở dữ liệu quan hệ ACID mạnh, thật khó hiểu vì sao lại cần làm thế này
Nhưng 1 tháng trước có tin họ chính thức công bố mã nguồn mở cho cộng đồng (thông báo chính thức)
Muốn ngủ ngon ban đêm thì tốt nhất là tránh nó tối đa
Thấy nhiều người khuyên dùng tổ hợp patroni+etcd+haproxy, và nhìn cách những người đã dùng thực tế hào hứng đề xuất thì chắc hẳn có lý do
Tuy vậy, khi xem file ví dụ bằng docker compose thì vẫn thấy hơi nặng nề
Còn pgpool thì có vẻ đơn giản vì chỉ cần đặt nó phía trước từng postgres
Muốn nghe khuyến nghị hoặc kinh nghiệm thực tế từ những người thực sự yêu thích Postgres trong môi trường production
Mục tiêu là dựng cụm dựa trên docker compose càng đơn giản càng tốt, nhưng vẫn có độ sẵn sàng cao, (ít nhất) không mất dữ liệu, và có point-in-time recovery
<i>Pgactive: Active-Active Replication Extension for PostgreSQL on Amazon RDS</i>
Bài trên Hacker News (bài tháng 10 năm 2023, có 1 bình luận)
Tức là tùy tình huống mà mỗi bên phải chấp nhận ưu và nhược điểm riêng