Replication, partitioning và backup
High availability, scale và disaster recovery là ba bài toán khác nhau. Thiết kế đúng bắt đầu từ RPO/RTO, failure domains và quy trình đã được diễn tập, không bắt đầu từ việc bật một replica.
Physical streaming replication
Primary gửi WAL records tới standby; standby ghi và replay cùng physical changes. Physical replication phù hợp HA và read replicas có cùng major-version/storage compatibility, nhưng replica có thể nhìn dữ liệu trễ hơn primary.
| Chế độ | Commit acknowledgement | Trade-off |
|---|---|---|
| Asynchronous | Primary không chờ standby xác nhận. | Latency và availability tốt hơn, nhưng failover có thể mất transactions chưa tới standby. |
| Synchronous | Commit chờ một hay nhiều synchronous standbys theo cấu hình. | Giảm RPO cho acknowledged commits nhưng ghép latency và availability của write path với standby/network. |
| Cascading | Standby nhận WAL từ standby khác. | Giảm fan-out từ primary nhưng thêm một tầng lag và dependency. |
replication slot ngăn primary loại WAL mà consumer còn cần. Slot không hoạt động hoặc consumer chết có thể giữ WAL vô hạn và làm đầy disk nếu không đặt giới hạn/alert phù hợp. Theo dõi byte lag, replay timestamp, slot state và WAL retention thay vì chỉ kiểm tra process còn sống.
Failover là một workflow phân tán
detect primary failure
=> prove failure and choose candidate
=> fence old primary
=> promote newest safe standby
=> redirect clients / update service discovery
=> verify writes and replication topology
=> rewind or rebuild old primary before rejoin
Promote standby chỉ tạo primary mới; orchestration còn phải xử lý health consensus, client routing, timeline history và rejoin. Nếu primary cũ vẫn nhận write sau promotion, hai phía diverge thành split brain. Fencing có thể là power/network isolation, storage lease hoặc cơ chế failover manager chứng minh node cũ không còn phục vụ writes.
Logical replication
Logical replication publish row-level changes của các tables được chọn rồi apply tại subscriber. Nó hữu ích cho migration, selective replication, integration hoặc topology mà physical replication không phù hợp. Subscriber có schema riêng; DDL/schema changes không được tự động đồng bộ đầy đủ, sequence state cần chú ý và tables phải có replica identity thích hợp cho UPDATE/DELETE.
Conflicts có thể dừng apply worker và cần xử lý vận hành. Logical replication truyền thay đổi dữ liệu, không truyền business intent như “OrderPaid”; vì vậy nó không thay outbox/event model khi downstream cần semantic event, ordering key hay contract version.
Declarative partitioning
Range, list và hash partitioning chia một logical table thành physical partitions. Giá trị chính đến từ partition pruning, lifecycle theo time window, bounded maintenance và data placement. Query phải có predicate tương thích partition key; quá nhiều partitions làm tăng planning time, catalog overhead và complexity.
| Kiểu | Use case điển hình | Rủi ro thiết kế |
|---|---|---|
| Range | Events theo ngày/tháng, numeric ranges. | Thiếu future partition gây insert failure; skew theo thời gian. |
| List | Region, tenant tier hoặc category hữu hạn. | Default partition phình to; category mới cần rollout. |
| Hash | Phân bố đều khi không có natural range/list key. | Lifecycle/range query kém tự nhiên; đổi modulus khó. |
Primary key hoặc unique constraint trên partitioned table phải gồm toàn bộ partition key để PostgreSQL có thể bảo đảm uniqueness mà không có global index. Partitioning không tự làm query nhanh hơn: nếu workload đọc hầu hết partitions hoặc index/schema không đúng, nó chỉ thêm overhead. Tạo partition trước thời hạn, kiểm tra pruning bằng EXPLAIN và giám sát default partition.
Backup, restore và point-in-time recovery
Physical base backup kết hợp continuous WAL archiving cho phép point-in-time recovery (PITR) tới một timestamp, transaction ID hoặc named restore point trong retention window. Logical dump phù hợp portability, chọn object và migration chọn lọc, nhưng dump/restore database lớn có thể chậm và không thay physical recovery strategy.
| Artifact | Bảo vệ tốt | Không tự bảo vệ |
|---|---|---|
| Standby replica | Node failure, read scaling, fast promotion. | Drop/corruption/operator error có thể replicate ngay. |
| Base backup + WAL archive | Cluster recovery và PITR. | Restore chưa được diễn tập, archive gap hoặc credential hỏng. |
| Logical dump | Object-level restore, portability và inspection. | Low-RTO restore ở dataset lớn, WAL-level PITR. |
Backup phải được mã hóa, immutable hoặc protected khỏi cùng blast radius, có retention/legal policy và restore test tự động. Kiểm tra không chỉ file tồn tại: restore vào môi trường cô lập, replay WAL, chạy integrity checks và đo thời gian tới khi application dùng được.
Partitioning không phải sharding
Partitioning chia một logical table bên trong một PostgreSQL cluster; queries, transactions và constraints vẫn đi qua cùng database system. Sharding chia ownership qua nhiều database nodes, nên phải thêm routing, rebalancing, cross-shard query/transaction, global uniqueness và failure handling. Replication tạo copies; nó cũng không chia write ownership như sharding.
Không shard sớm khi indexing, query redesign, archival/partitioning, connection control hoặc vertical scaling vẫn giải quyết workload. Khi phải shard, chọn key từ access pattern và tenant/hotspot distribution, rồi định nghĩa rõ resharding cùng cross-shard invariants trước migration.
RPO, RTO và recovery runbook
RPO là lượng dữ liệu tối đa có thể mất; RTO là thời gian tối đa để khôi phục dịch vụ. Hai con số này quyết định sync/async replication, archive cadence, topology, backup frequency, compute capacity và mức tự động hóa. “Zero RPO” qua synchronous replication vẫn không bảo vệ khỏi logical corruption hoặc thao tác xóa được replicate.
- Định nghĩa service tier, RPO/RTO và failure domains: process, node, zone, region, operator.
- Chọn topology và backup retention đáp ứng từng scenario.
- Viết runbook có owner, quyền truy cập, decision point, verify và rollback.
- Diễn tập zone loss, lagged standby, corrupt backup, missing WAL, expired credential và split-brain prevention.
- Đo actual data loss và time-to-service; sửa thiết kế nếu vượt objective.