DBAtlas · 데이터베이스 운영 아틀라스

PostgreSQL streaming replication + 자동 페일오버

증상

목표: streaming replication으로 PostgreSQL의 hot standby를 구성하고 자동 페일오버를 위해 Patroni/repmgr를 추가한다.

1. primary에서 WAL 및 연결 파라미터를 설정한다

streaming replication을 위해 wal_level은 최소 'replica'여야 한다. max_wal_senders는 replica 수 + 백업 연결을 감당해야 하며, wal_keep_size나 replication slot으로 WAL의 조기 삭제를 막아야 한다. 변경에는 재시작이 필요하다.

PostgreSQL

ALTER SYSTEM SET wal_level = 'replica';
ALTER SYSTEM SET max_wal_senders = 10;
ALTER SYSTEM SET max_replication_slots = 10;
ALTER SYSTEM SET hot_standby = on;
-- To apply the postgresql.conf change:
-- systemctl restart postgresql

2. 복제 역할과 pg_hba 접근을 정의한다

standby가 연결할 REPLICATION 속성의 역할을 생성한다. pg_hba.conf에 standby IP에서 'replication' 데이터베이스 접근을 허용하는 줄을 추가하고 pg_reload_conf()로 reload한다.

PostgreSQL

CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'secret';
-- Add to pg_hba.conf:
-- host replication replicator 10.0.0.20/32 scram-sha-256
SELECT pg_reload_conf();

3. primary에 영구 replication slot을 생성한다

physical replication slot은 standby가 뒤처져도 primary가 필요한 WAL을 삭제하지 않게 한다. slot 관리는 wal_keep_size보다 안전하다. slot 이름은 standby 구성에서 사용한다.

PostgreSQL

SELECT pg_create_physical_replication_slot('standby1_slot');
SELECT slot_name, active, restart_lsn FROM pg_replication_slots;

4. standby 서버에서 pg_basebackup으로 base backup을 수행한다

standby의 데이터 디렉터리를 비운 상태에서 primary로부터 전체 사본을 가져온다. -R 플래그는 standby.signal 파일과 primary_conninfo를 자동으로 기록하며, -C는 slot도 생성할 수 있다. slot 이름은 -S로 전달한다.

PostgreSQL

pg_basebackup -h 10.0.0.10 -U replicator -D /var/lib/pgsql/data \
  -R -X stream -S standby1_slot -P -v

5. primary_conninfo와 hot_standby를 확인하고 standby를 시작한다

-R이 기록한 postgresql.auto.conf의 primary_conninfo(host, user, slot)를 확인한다. standby.signal 파일의 존재가 standby 모드를 결정한다. hot_standby=on이면 standby가 읽기 전용 쿼리를 받는다. 서비스를 시작한다.

PostgreSQL

-- Expected in postgresql.auto.conf:
-- primary_conninfo = 'host=10.0.0.10 user=replicator password=secret'
-- primary_slot_name = 'standby1_slot'
-- systemctl start postgresql
SELECT pg_is_in_recovery();  -- should return true on the standby

6. primary에서 복제 지연을 모니터링한다

primary에서 pg_stat_replication은 각 standby의 전송/재실행 LSN과 지연을 보여 준다. write/flush/replay lag는 작게 유지되어야 하며, 동기 replica를 사용하면 sync_state가 'sync'다.

PostgreSQL

SELECT client_addr, state, sync_state,
       pg_wal_lsn_diff(sent_lsn, replay_lsn) AS replay_lag_bytes,
       write_lag, flush_lag, replay_lag
FROM pg_stat_replication;

7. 자동 페일오버를 위해 Patroni 또는 repmgr를 추가한다

순수 streaming replication에는 수동 promote가 필요하다. 자동 페일오버에는 클러스터 관리자가 필요하다: Patroni(etcd/Consul 기반 리더 선출 + 자동 promote) 또는 repmgr(repmgrd를 이용한 모니터링/페일오버). 애플리케이션 측에는 HAProxy/pgBouncer로 단일 endpoint를 제공한다. 수동 promote가 필요하면: pg_ctl promote. promote 전에 이전 primary가 확실히 중지되었고 애플리케이션이 그곳에 쓸 수 없는지 확인한다(split-brain 위험). 이전 primary를 새 primary의 standby로 재합류시키려면 pg_rewind가 필요하며, 이를 위해 wal_log_hints = on 또는 data checksums가 활성화되어 있어야 한다.

PostgreSQL

-- Manual promote (if there is no cluster manager):
pg_ctl promote -D /var/lib/pgsql/data
-- or via SQL:
SELECT pg_promote();
-- With Patroni: patronictl -c /etc/patroni.yml switchover mycluster
DBAtlas에서 열기 →