본문으로 건너뛰기

12.2 복제 슬롯

Replication slot은 primary가 이 slot이 도달하지 못한 WAL은 절대 잘리지 않는다는 보장을 제공합니다. standby가 잠시 끊겨도 재연결 시 누락 없이 이어 받을 수 있습니다. 그러나 잘못 운영하면 primary pg_wal/이 가득 차 클러스터 정지를 부릅니다.

두 종류

종류용도
Physical slot스트리밍 복제용
Logical slotlogical replication·CDC용 (다음 절)

Physical slot 만들기

-- primary에서
SELECT pg_create_physical_replication_slot('standby1');

standby postgresql.conf 또는 recovery.conf(PG 11-):

primary_slot_name = 'standby1'

또는 pg_basebackup 시:

pg_basebackup -D /data -X stream -R --slot=standby1

슬롯 없는 standby — wal_keep_size

기본은 슬롯 없이도 동작합니다. primary는 wal_keep_size 만큼의 WAL을 보존.

wal_keep_size = 1GB
시나리오결과
standby lag < 1GBOK
standby lag > 1GB + 슬롯 없음WAL 잘림 → standby 재구축 필요
standby lag > 1GB + 슬롯 있음WAL 보존 → primary pg_wal/ 자람

트레이드오프: 슬롯은 안전하지만 디스크가 폭발할 위험이 있고, wal_keep_size는 디스크는 안전하지만 standby 재구축을 감수해야 합니다.

슬롯 상태 모니터링 — 매우 중요

SELECT slot_name, slot_type, active,
       pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) AS lag,
       wal_status, safe_wal_size
  FROM pg_replication_slots;
wal_status의미
reserved정상 — max_slot_wal_keep_size
extended정상 — 초과했지만 아직 보존 중
unreserved곧 잘릴 위험 (PG 13+)
lost이미 WAL 잘림 — slot 무효

lost가 되면 standby는 다시 base 백업부터.

max_slot_wal_keep_size (PG 13+)

슬롯이 잡고 있는 WAL의 상한을 설정해 slot이 primary를 죽이지 않게 안전망:

max_slot_wal_keep_size = 50GB
동작
-1 (기본)슬롯이 잡은 WAL은 무한 보존 — 위험
양수그 값 초과하면 slot을 lost 상태로

운영 권장은 반드시 양수로 설정하는 것입니다. pg_wal/ 디스크 크기의 50~70% 정도로 잡습니다.

슬롯 정리 — 매우 중요

사용 안 하는 슬롯은 즉시 삭제합니다. 잊혀진 슬롯이 xmin horizon을 잡으면 vacuum이 멈추고, BLOAT이 폭증하며, 끝내 pg_wal까지 차오르는 4단 콤보로 이어집니다.

SELECT pg_drop_replication_slot('old_standby');

월 점검 항목:

SELECT slot_name, active, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) AS lag
  FROM pg_replication_slots
 WHERE NOT active;

NOT active 슬롯이 있으면 누가 만든 슬롯인지 확인 후 정리합니다.

xmin / catalog_xmin

logical slot은 pg_replication_slotsxmin 또는 catalog_xmin을 가질 수 있습니다.

SELECT slot_name, xmin, catalog_xmin
  FROM pg_replication_slots;

이 값들이 고정되어 있으면 vacuum이 그 트랜잭션 이후의 dead tuple을 지우지 못합니다. logical replication이 멈춰 있을 때 운영 클러스터가 BLOAT으로 망가지는 표준 사고 패턴입니다.

슬롯의 운영 패턴

안전 패턴

  1. 슬롯 사용 + max_slot_wal_keep_size 안전망 + 모니터링 알람
  2. 슬롯 없이 wal_keep_size만 — standby 재구축을 운영 절차로 받아들임

비추천

  • 슬롯 + 무제한 (max_slot_wal_keep_size = -1) + 모니터링 없음 → 언젠가 pg_wal

동기화된 슬롯 (PG 17+)

PG 17에서 failover slot이 정식 도입. standby도 slot 상태를 동기화해, primary 장애 후 promote된 새 primary가 그대로 logical replication을 이어받음.

-- primary 측
SELECT pg_create_logical_replication_slot('sub1', 'pgoutput', false, true);
                                                       ^^^^^^   ^^^^
                                                       임시?    failover?

이전엔 logical slot이 failover 후 완전히 새로 만들어야 했습니다. PG 17이 이걸 자동화합니다.

실수로 standby가 끊겼을 때

  1. lag 확인pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)
  2. 상태 확인wal_statuslost면 standby 재구축. 아니면 그냥 재연결
  3. 재연결 — standby의 primary_conninfo·네트워크 점검
  4. monitoring 강화 — 같은 사고 재발 방지

운영 안티패턴

안티패턴위험
max_slot_wal_keep_size = -1 운영primary pg_wal 폭주
슬롯 미사용 + wal_keep_size = 0standby 한 번 끊기면 재구축
pg_replication_slots 모니터링 없음lost·BLOAT 누적까지 모름
옛 slot 삭제 안 함catalog_xmin 정체 → 클러스터 BLOAT
failover 후 slot 정리 안 함옛 primary의 slot이 새 primary에 그대로 잔존

알람 임계

지표WARNCRIT
slot restart_lsn lag1GB10GB
wal_statusextendedunreserved/lost
inactive slot 발견즉시
pg_wal 디스크 사용70%85%

정리

replication slot은 standby가 도달할 때까지 primary가 WAL을 보존하도록 보장합니다. 스트리밍용 physical과 CDC용 logical 두 종류가 있고, max_slot_wal_keep_size를 양수로 두어 slot이 primary를 죽이지 않게 막습니다. 사용하지 않는 slot은 즉시 삭제해야 하는데, 방치하면 xmin horizon이 클러스터 BLOAT을 부릅니다.

PG 17의 failover slot 덕분에 logical replication도 failover 뒤 안전하게 이어집니다. 모니터링은 pg_replication_slots의 lag·wal_status·xmin을 봅니다.