Patroni là một HA agent cho PostgreSQL, chạy trên mỗi database node và chịu trách nhiệm duy nhất: đảm bảo cluster luôn có đúng một primary. Nó không tự mình quyết định — nó dùng một distributed consensus store (thường là etcd) để đồng thuận với các nodes khác về trạng thái cluster, tránh split-brain.

Cơ chế hoạt động

Patroni dùng Raft consensus thông qua etcd (hoặc Consul, ZooKeeper). Mỗi node Patroni liên tục:

  1. Heartbeat vào etcd để giữ leader lease
  2. Nếu primary mất heartbeat (TTL hết hạn), etcd xóa lock
  3. Các standby nodes race để acquire lock mới — winner promote thành primary
  4. Node thắng update cluster state trong etcd; các node còn lại đọc state và tự cấu hình làm replica

Đây là automatic failover không cần human intervention. Thời gian failover thường 10–30 giây tùy cấu hình ttlloop_wait.

Patroni vs pgpool Quorum

Pgpool-II cũng có khái niệm HA nhưng dùng quorum voting — các pgpool nodes vote cho nhau. Đây là mechanism khác về bản chất:

Patronipgpool Quorum
MechanismRaft consensus qua etcdMajority voting giữa pgpool nodes
Consensus storeetcd (external)Built-in giữa pgpool nodes
What it decidesAi là PostgreSQL primaryPgpool node nào active
ScopeDatabase-level HAProxy-level HA

Patroni giải quyết vấn đề ở tầng database; pgpool quorum giải quyết vấn đề ở tầng proxy. Chúng không thay thế nhau.

etcd dependency

etcd phải highly available riêng. Single-node etcd (như trong lab setup) là SPOF — nếu etcd down, Patroni không thể reach consensus và sẽ demote primary xuống read-only để tránh split-brain. Production setup cần etcd cluster 3 hoặc 5 nodes.

REST API

Patroni expose HTTP REST API (mặc định port 8008) cho health check và management:

  • GET / — cluster status (primary trả 200, replica trả 503 → dùng được làm health check cho load balancer)
  • POST /failover — manual failover
  • patronictl CLI wrap API này

Connections

Sources