12.2 복제 슬롯
Replication slot은 primary가 이 slot이 도달하지 못한 WAL은 절대 잘리지 않는다는 보장을 제공합니다. standby가 잠시 끊겨도 재연결 시 누락 없이 이어 받을 수 있습니다. 그러나 잘못 운영하면 primary pg_wal/이 가득 차 클러스터 정지를 부릅니다.
두 종류
| 종류 | 용도 |
|---|---|
| Physical slot | 스트리밍 복제용 |
| Logical slot | logical 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 < 1GB | OK |
| 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_slots에 xmin 또는 catalog_xmin을 가질 수 있습니다.
SELECT slot_name, xmin, catalog_xmin
FROM pg_replication_slots;이 값들이 고정되어 있으면 vacuum이 그 트랜잭션 이후의 dead tuple을 못 지움. logical replication이 멈춰 있으면 운영 클러스터가 BLOAT으로 망가지는 표준 사고 패턴입니다.
슬롯의 운영 패턴
안전 패턴
- 슬롯 사용 +
max_slot_wal_keep_size안전망 + 모니터링 알람 - 슬롯 없이
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가 끊겼을 때
- lag 확인 —
pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn) - 상태 확인 —
wal_status가lost면 standby 재구축. 아니면 그냥 재연결 - 재연결 — standby의
primary_conninfo·네트워크 점검 - monitoring 강화 — 같은 사고 재발 방지
운영 안티패턴
| 안티패턴 | 위험 |
|---|---|
max_slot_wal_keep_size = -1 운영 | primary pg_wal 폭주 |
슬롯 미사용 + wal_keep_size = 0 | standby 한 번 끊기면 재구축 |
pg_replication_slots 모니터링 없음 | lost·BLOAT 누적까지 모름 |
| 옛 slot 삭제 안 함 | catalog_xmin 정체 → 클러스터 BLOAT |
| failover 후 slot 정리 안 함 | 옛 primary의 slot이 새 primary에 그대로 잔존 |
알람 임계
| 지표 | WARN | CRIT |
|---|---|---|
slot restart_lsn lag | 1GB | 10GB |
wal_status | extended | unreserved/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를 봅니다.