본문으로 건너뛰기

12.7 pg_auto_failover

pg_auto_failover는 Microsoft Citus 팀이 만든 PostgreSQL HA 도구입니다. 별도 모니터 노드가 leader election과 상태 머신을 관장하며, DCS 대신 PostgreSQL 인스턴스 자체를 monitor로 씁니다. Patroni·repmgr 대비 가장 단순한 설정이 강점입니다.

구조

  • 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-quorum

quorum이 안 되면 fallback은 secondary를 우선하는데, 이때는 손실이 가능한 트레이드오프입니다.

Patroni·repmgr와의 비교

측면Patronirepmgrpg_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-write

target_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가 SPOFmonitor 자체도 HA 필요 (monitor의 stream 백업)
동기 multi-node 약간 약함Patroni가 더 유연
운영 도구 생태계 작음Patroni·repmgr에 비해 자료 적음
k8s 통합 약함Patroni가 표준

운영 안티패턴

안티패턴위험
monitor를 운영 데이터와 같은 호스트호스트 사고 시 monitor·data 둘 다
2-node + 동기 모드secondary 죽으면 primary 멈춤
pg_autoctl이 system service 등록 안 됨노드 재부팅 후 합류 실패
명시적 maintenance 안 풀음자동 failover 안 됨