본문으로 건너뛰기

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-256

postgresql.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 register

repmgr standby clone은 내부적으로 pg_basebackup을 호출합니다.

repmgrd 자동 failover

sudo systemctl enable --now repmgr-17

repmgrd가 각 노드에서 동작하며:

  1. 자기 PostgreSQL과 upstream PostgreSQL 상태 polling
  2. primary 응답 없음 + N회 재시도 실패 → standby 중 하나 promote
  3. 다른 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

측면Patronirepmgr
외부 의존성DCS (etcd 등)없음 (PostgreSQL 자체)
동기화 메타DCSrepmgr 스키마
split-brain 방지DCS quorumwitness 노드 + SSH
자동 failover 속도3060s3060s
pg_rewind 통합자동repmgr node rejoin --force-rewind
동기 복제통합가능, 수동 설정
k8s 친화매우 좋음약함
운영 인기신규 ↑안정 운영 ↑
라이선스MITGPLv3

신규 도입은 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를 봅니다.