12.6 repmgr
repmgr는 EDB(전 2ndQuadrant)가 만든 PostgreSQL HA 도구입니다. Patroni보다 가볍고 단순 — DCS 없이 PostgreSQL 자체와 SSH로 클러스터 관리합니다. 옛 운영에서 표준이었고 지금도 많은 시스템이 사용 중. 구조·동작·Patroni와의 비교를 정리합니다.
구조
flowchart LR
subgraph N1["node1 (primary)"]
PG1["PostgreSQL"]
R1["repmgrd"]
end
subgraph N2["node2 (standby)"]
PG2["PostgreSQL"]
R2["repmgrd"]
end
subgraph N3["node3 (witness)"]
R3["repmgrd"]
end
PG1 -- "streaming" --> PG2
R1 <-->|libpq| PG1
R2 <-->|libpq| PG2
R3 <-->|libpq| PG1
R1 -. SSH .- R2
R2 -. SSH .- R3
R1 -. SSH .- R3
classDef pg fill:#ede9fe,stroke:#6d28d9,color:#3b0764
classDef d fill:#dbeafe,stroke:#1d4ed8,color:#1e3a8a
class PG1,PG2 pg
class R1,R2,R3 d
repmgrd데몬이 각 노드에서 동작- 메타데이터는 PostgreSQL의
repmgr스키마에 저장 — DCS 없음 - witness 노드(데이터 없는 노드)로 split-brain 방지
설치
sudo dnf install -y repmgr_17 # RHEL/Rocky (PGDG)
sudo apt-get install -y postgresql-17-repmgr # Debian/Ubuntu/etc/repmgr/17/repmgr.conf:
node_id=1
node_name=node1
conninfo='host=node1 user=repmgr dbname=repmgr connect_timeout=2'
data_directory='/var/lib/pgsql/17/data'
log_level=INFO
log_file='/var/log/repmgr/repmgrd.log'
failover='automatic'
promote_command='/usr/pgsql-17/bin/repmgr standby promote -f /etc/repmgr/17/repmgr.conf'
follow_command='/usr/pgsql-17/bin/repmgr standby follow -f /etc/repmgr/17/repmgr.conf --upstream-node-id=%n'
reconnect_attempts=6
reconnect_interval=10
monitoring_history=yes각 노드의 node_id·node_name·conninfo만 다름.
PostgreSQL 측
CREATE USER repmgr SUPERUSER LOGIN PASSWORD 'secret';
CREATE DATABASE repmgr OWNER repmgr;pg_hba.conf:
host repmgr repmgr 10.0.0.0/8 scram-sha-256
host replication repmgr 10.0.0.0/8 scram-sha-256postgresql.conf:
shared_preload_libraries = 'repmgr'
wal_level = replica
max_wal_senders = 10
max_replication_slots = 10
hot_standby = on클러스터 구성
# primary 노드에서
sudo -u postgres repmgr -f /etc/repmgr/17/repmgr.conf primary register
# 새 standby (이미 primary에서 base 받았다고 가정)
sudo -u postgres repmgr -h node1 -U repmgr -d repmgr \
-f /etc/repmgr/17/repmgr.conf standby clone --dry-run
sudo -u postgres repmgr -h node1 -U repmgr -d repmgr \
-f /etc/repmgr/17/repmgr.conf standby clone
sudo systemctl start postgresql-17
# standby로 등록
sudo -u postgres repmgr -f /etc/repmgr/17/repmgr.conf standby registerrepmgr standby clone은 내부적으로 pg_basebackup을 호출합니다.
repmgrd 자동 failover
sudo systemctl enable --now repmgr-17repmgrd가 각 노드에서 동작하며:
- 자기 PostgreSQL과 upstream PostgreSQL 상태 polling
- primary 응답 없음 + N회 재시도 실패 → standby 중 하나 promote
- 다른 standby는 새 primary를 follow
# 명시적 failover
sudo -u postgres repmgr -f /etc/repmgr/17/repmgr.conf standby promote
# 클러스터 상태
sudo -u postgres repmgr -f /etc/repmgr/17/repmgr.conf cluster show ID | Name | Role | Status | Upstream | Location | Priority | Timeline | LSN_lag
----+---------+---------+-----------+----------+----------+----------+----------+---------
1 | node1 | primary | * running | | default | 100 | 3 | -
2 | node2 | standby | running | node1 | default | 90 | 3 | 0 bytes
3 | node3 | witness | running | node1 | default | 0 | 3 | -witness 노드
witness는 실제 데이터는 없지만 repmgrd가 떠 있어 quorum 투표권을 갖습니다. split-brain 방지.
# 작은 인스턴스에 PostgreSQL 설치 + repmgr 등록
sudo -u postgres repmgr -f /etc/repmgr/17/repmgr.conf witness register --primary-server=10.0.0.1운영 권장: primary + 2 standby + 1 witness 같은 구성.
Patroni vs repmgr
| 측면 | Patroni | repmgr |
|---|---|---|
| 외부 의존성 | DCS (etcd 등) | 없음 (PostgreSQL 자체) |
| 동기화 메타 | DCS | repmgr 스키마 |
| split-brain 방지 | DCS quorum | witness 노드 + SSH |
| 자동 failover 속도 | ||
| pg_rewind 통합 | 자동 | repmgr node rejoin --force-rewind |
| 동기 복제 | 통합 | 가능, 수동 설정 |
| k8s 친화 | 매우 좋음 | 약함 |
| 운영 인기 | 신규 ↑ | 안정 운영 ↑ |
| 라이선스 | MIT | GPLv3 |
신규 도입은 Patroni 권장합니다. 기존 repmgr 운영은 그대로 안정.
자주 쓰는 명령
# 클러스터 점검
repmgr cluster crosscheck # 모든 노드 간 연결 확인
repmgr cluster matrix # 노드 매트릭스
# 노드 관리
repmgr standby switchover --siblings-follow # 계획된 switchover
repmgr standby follow # 새 primary로 follow
repmgr standby unregister
repmgr node rejoin --force-rewind # 죽었다 살아난 옛 primary 합류
# 백업
repmgr standby clone --upstream-conninfo=...SSH 의존성
repmgrd가 다른 노드의 PostgreSQL을 SSH로 점검·관리하므로 SSH 키 설정이 필요합니다.
# repmgr OS 사용자 (또는 postgres) 간 SSH 키 교환
sudo -u postgres ssh-keygen
sudo -u postgres ssh-copy-id postgres@node2운영 보안 측면에서 SSH가 다른 노드로 superuser로 접근 가능해야 한다는 점에 주의.
단점
| 단점 | 메모 |
|---|---|
| SSH 키 관리 필요 | 보안·자동화 부담 |
| k8s 환경 적합도 낮음 | Patroni가 더 자연스러움 |
| 동적 설정 변경 도구 약함 | postgresql.conf 직접 |
| 운영 자동화 도구 적음 | 비교적 manual |
운영 안티패턴
| 안티패턴 | 위험 |
|---|---|
| witness 없는 2-노드 구성 | split-brain 위험 |
| SSH 키가 분산 안 됨 | failover 중 명령 실패 |
failover=manual 운영 | 자동 failover가 안 됨 — 알람만 |
| reconnect_attempts·interval 너무 작음 | 잠깐의 네트워크 끊김에 failover |
| 옛 primary 복귀 시 reinit 안 함 | timeline 충돌, replication 실패 |
정리
- repmgr = PostgreSQL HA의 옛 표준입니다. DCS 없이 SSH + PostgreSQL 자체로 관리
- witness 노드로 split-brain 방지
- 신규 도입은 Patroni 권장, 기존 운영은 그대로 OK
- pg_rewind는
repmgr node rejoin --force-rewind로 - k8s·DCS 환경엔 Patroni·pg_auto_failover가 더 자연스러움
다음 절(12.7)에서는 더 단순한 또 다른 대안 — pg_auto_failover를 봅니다.