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은 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을 봅니다.