12.7 pg_auto_failover
pg_auto_failover는 Microsoft Citus 팀이 만든 PostgreSQL HA 도구입니다. 별도 모니터 노드가 leader election과 상태 머신을 관장하며, DCS 대신 PostgreSQL 인스턴스 자체를 monitor로 씁니다. Patroni·repmgr 대비 가장 단순한 설정이 강점입니다.
구조
flowchart LR
subgraph M["monitor"]
MON["pg_auto_failover<br/>state machine"]
end
subgraph N1["node 1 (primary)"]
K1["pg_autoctl"]
PG1["PostgreSQL"]
end
subgraph N2["node 2 (standby)"]
K2["pg_autoctl"]
PG2["PostgreSQL"]
end
PG1 -- "streaming" --> PG2
K1 -- "report state" --> MON
K2 -- "report state" --> MON
MON -- "promote 명령" --> K1
MON -- "promote 명령" --> K2
classDef mon fill:#fed7aa,stroke:#c2410c,color:#7c2d12
classDef pg fill:#ede9fe,stroke:#6d28d9,color:#3b0764
classDef ctl fill:#dbeafe,stroke:#1d4ed8,color:#1e3a8a
class MON mon
class PG1,PG2 pg
class K1,K2 ctl
- monitor = 별도 PostgreSQL 인스턴스, 클러스터 상태 머신 보관
- pg_autoctl = 각 데이터 노드의 데몬, monitor와 통신
설치
sudo dnf install -y pg_auto_failover_17모니터 구성
# monitor 노드에서
sudo -u postgres pg_autoctl create monitor \
--hostname monitor.example.com \
--pgdata /var/lib/pgsql/17/monitor
sudo systemctl enable --now pgautofailover@monitor데이터 노드 구성
# primary
sudo -u postgres pg_autoctl create postgres \
--monitor 'postgres://autoctl_node@monitor.example.com/pg_auto_failover' \
--hostname node1.example.com \
--pgdata /var/lib/pgsql/17/data \
--name node1 \
--auth scram-sha-256
# standby (다른 노드에서)
sudo -u postgres pg_autoctl create postgres \
--monitor 'postgres://...' \
--hostname node2.example.com \
--pgdata /var/lib/pgsql/17/data \
--name node2 \
--auth scram-sha-256각 노드에서:
sudo systemctl enable --now pgautofailover상태 머신
pg_auto_failover의 강점 — 명시적 상태 머신으로 모든 전이를 추적합니다.
single → wait_primary → primary
secondary → catchingup → primary (failover)
demoted → catchingup → secondary각 노드는 자기 상태를 monitor에 보고. monitor가 목표 상태를 지시. 운영자가 어느 단계에서 멈췄는지 즉시 파악합니다.
sudo -u postgres pg_autoctl show state Name | Node | Host:Port | LSN | Reachable | Current State | Assigned State
------+--------+-----------------------+-----------+-----------+------------------+------------------
node1 | 1 | node1.example:5432 | 0/3A1F8E0 | yes | primary | primary
node2 | 2 | node2.example:5432 | 0/3A1F8E0 | yes | secondary | secondary자동 failover
monitor가 일정 시간 동안 primary 응답을 받지 못하면 secondary를 promote합니다.
# 명시적 failover
sudo -u postgres pg_autoctl perform failover --formation default
# 명시적 switchover
sudo -u postgres pg_autoctl perform switchover --formation default동기 vs 비동기
기본은 2-node에서 sync 안 됨 (single secondary는 quorum 불가). PG 14+의 pg_auto_failover 1.6+에서 3-node 동기 quorum 지원합니다.
pg_autoctl create postgres --replication-quorumquorum이 안 되면 fallback은 secondary를 우선하는데, 이때는 손실이 가능한 트레이드오프입니다.
Patroni·repmgr와의 비교
| 측면 | Patroni | repmgr | pg_auto_failover |
|---|---|---|---|
| 외부 의존 | DCS (etcd 등) | 없음 | monitor PostgreSQL |
| 설치 복잡도 | 중간 | 중간 | 낮음 |
| 상태 가시화 | DCS 조회 | repmgr cluster show | 명시적 상태 머신 |
| 멀티 노드 cascading | 가능 | 가능 | 단순 |
| 동기 quorum | 강력 | 가능 | 1.6+ |
| 운영 인기 | 매우 높음 | 안정 운영 | 작지만 증가 |
| k8s 친화 | 매우 좋음 | 약함 | 보통 |
선택 기준:
- 새 단순 운영, 학습 시간 줄이기 → pg_auto_failover
- 큰 운영, 동기 quorum + k8s → Patroni
- 옛 운영 유지 → repmgr
connection string failover
pg_auto_failover는 클라이언트가 multi-host conninfo를 쓰면 자동 failover 인식합니다.
postgres://app@node1.example.com:5432,node2.example.com:5432/app_main?target_session_attrs=read-writetarget_session_attrs=read-write는 읽기·쓰기 가능한 노드만 선택. PG 12+ libpq 기능. HAProxy 없이도 동작합니다.
운영 명령
# 노드 상태
pg_autoctl show state
# 노드 정보
pg_autoctl show settings
# 모니터로부터 명령 받지 않게 일시 정지
pg_autoctl enable maintenance
# 정상 모드 복귀
pg_autoctl disable maintenance
# 모니터에서 노드 drop
pg_autoctl drop node --name node3한계
| 한계 | 메모 |
|---|---|
| monitor가 SPOF | monitor 자체도 HA 필요 (monitor의 stream 백업) |
| 동기 multi-node 약간 약함 | Patroni가 더 유연 |
| 운영 도구 생태계 작음 | Patroni·repmgr에 비해 자료 적음 |
| k8s 통합 약함 | Patroni가 표준 |
운영 안티패턴
| 안티패턴 | 위험 |
|---|---|
| monitor를 운영 데이터와 같은 호스트 | 호스트 사고 시 monitor·data 둘 다 |
| 2-node + 동기 모드 | secondary 죽으면 primary 멈춤 |
| pg_autoctl이 system service 등록 안 됨 | 노드 재부팅 후 합류 실패 |
| 명시적 maintenance 안 풀음 | 자동 failover 안 됨 |