Khi kết hợp Patroni và Pgpool-II, bạn có một PostgreSQL HA stack đầy đủ không cần managed service hay cloud infrastructure. Điểm mấu chốt là hai tool này giải quyết hai vấn đề khác nhau — và bổ sung nhau mà không overlap.

Phân chia trách nhiệm

Applications
     │
     ▼
[ Pgpool-II :9999 ]          ← Connection pooling, read/write routing, load balancing
     │              │
     ▼              ▼
[ pg-node1 ]   [ pg-node2 ]  ← PostgreSQL instances
     │              │
     └──── etcd ────┘         ← Patroni dùng để consensus (Raft leader election)
LayerToolTrách nhiệm
Database HAPatroniLeader election, automatic failover, streaming replication management
ConsensusetcdDistributed state store — ai là primary, replication lag, cluster health
ProxyPgpool-IIConnection pooling, route writes → primary, distribute reads → any node
Proxy HApgpool watchdogVirtual IP, pgpool node failover (nếu triển khai multi-pgpool)

Tại sao không dùng mỗi một tool?

Chỉ Patroni (không Pgpool-II):

  • Application phải tự biết endpoint của primary → thường dùng HAProxy hoặc virtual IP riêng
  • Không có connection pooling → mỗi client connection = 1 PostgreSQL backend process
  • Không có read load balancing tự động

Chỉ Pgpool-II (không Patroni):

  • Pgpool-II có thể detect failover nhưng không tự orchestrate promote
  • Cần failover_command script thủ công trigger pg_ctl promote hoặc repmgr
  • Không có Raft consensus → split-brain risk nếu script chạy sai timing

Kết hợp cả hai: Patroni lo toàn bộ việc quyết định primary, Pgpool-II lo routing và pooling. Pgpool failover scripts chỉ cần log — không can thiệp vào quyết định của Patroni.

Luồng failover thực tế

  1. pg-node1 (primary) xuống
  2. Patroni trên pg-node2 detect: heartbeat của leader trong etcd hết TTL
  3. pg-node2 acquire etcd lock → promote PostgreSQL lên primary
  4. Pgpool-II sr_check phát hiện pg-node1 unreachable, pg-node2 giờ là primary
  5. Pgpool-II redirect writes tới pg-node2
  6. Applications kết nối qua Pgpool-II không thấy gì thay đổi (chỉ thấy latency spike ngắn)

Thời gian failover: ~10–30 giây (dominated bởi Patroni TTL, thường cấu hình ttl: 30).

So sánh với Trove PostgreSQL HA

Trove (OpenStack DBaaS) cũng cung cấp PostgreSQL HA nhưng theo hướng hoàn toàn khác:

Patroni + pgpool-IITrove PostgreSQL HA
InfrastructureBare metal / bất kỳ VMOpenStack mandatory
Replication seedingDirect pg_basebackupQua Swift backup/restore
FailoverAutomatic (Patroni/Raft)Manual (openstack database instance promote)
Connection routingPgpool-II proxyApplication tự quản lý endpoint
Timeline issue sau failoverKhông có vấn đềTimeline 2 backup fails
Operational complexitySetup phức tạp hơn lúc đầuĐơn giản hơn nếu đã có OpenStack

Trove phù hợp khi bạn đã có OpenStack và muốn managed experience. Patroni + pgpool phù hợp khi bạn muốn control nhiều hơn hoặc không có OpenStack.

Connections

Sources