본문으로 건너뛰기

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 = primary가 standby 도달까지 WAL 보존 보장
  • physical(스트리밍용)·logical(CDC용) 두 종류
  • 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

다음 절(12.3)에서는 standby의 read 활용과 query conflict — hot standby를 봅니다.