나의 잡다한 노트 및 메모
PostgreSQL Replication slot 본문
PostgreSQL에서 Replication Slot은 WAL(Write Ahead Log) 로그 손실 방지 및 동기화 관리를 위한 메커니즘입니다. 기본적으로 물리적/논리적 복제 환경에서 슬레이브(또는 구독자)가 필요한 WAL 데이터를 잃지 않도록 보장하는 역할을 합니다.
1. Replication Slot이란?
- Replication Slot은 서버 측에 생성되는 객체로, 특정 복제 클라이언트(standby, logical subscriber)가 어디까지 WAL을 읽었는지를 추적합니다.
- 이를 통해 Postgres는 해당 슬롯이 소비되기 전까지 WAL 파일을 재활용하거나 삭제하지 않음으로써, 슬레이브가 뒤처져 있어도 데이터 손실이 발생하지 않도록 합니다.
2. 동작 방식
- 슬롯 생성
- physical slot → standby 노드에서 사용.
- logical slot → logical decoding/CDC(Change Data Capture) 시스템에서 사용.
SELECT * FROM pg_create_physical_replication_slot('slot_name');SELECT * FROM pg_create_logical_replication_slot('slot_name', 'pgoutput');
- WAL 보존
- 슬롯이 만들어지면, PostgreSQL은 해당 슬롯의 restart_lsn(Log Sequence Number)을 기억합니다.
- 해당 LSN 이후의 WAL 파일은 슬롯이 소비될 때까지 보존됩니다.
- 클라이언트 동기화
- standby나 logical subscriber가 접속하면, 자신의 소비 위치를 서버에 보고합니다.
- 서버는 confirmed_flush_lsn을 업데이트하면서, 그 시점 이전의 WAL을 삭제할 수 있게 됩니다.
3. 종류
- Physical replication slot
- 스트리밍 리플리케이션(standby)에서 사용.
- standby가 오래 죽어 있어도 WAL 유실 방지.
- Logical replication slot
- 논리적 복제, Debezium/CDC, Kafka connector 등에서 사용.
- DML 이벤트 단위로 decoding을 제공.
언제 슬롯이 더 생기나?
물리 슬롯(physical)
- 새 스탠바이(standby)를 추가했을 때
- 스탠바이가 슬롯을 사용해 스트리밍하도록 구성하면, 그 스탠바이마다 1개씩 필요합니다.
- Patroni 사용 시 use_slots: true면 클러스터 멤버별 물리 슬롯을 Patroni가 자동 생성/정리합니다(스위치오버/프로모션 시 이름 변경·이관 포함). → 직접 만들 필요 거의 없음.
- 스트리밍 백업/수집 도구가 슬롯을 쓸 때
- 예: pgBackRest(streaming), barman, pg_receivewal, pg_basebackup --slot --create-slot 등
- 이런 툴을 붙이면 툴별로 추가 물리 슬롯이 생깁니다.
논리 슬롯(logical)
- **논리 복제(변경 데이터 캡처, CDC)**를 붙일 때 자동/수동 생성
- CREATE SUBSCRIPTION 하면 기본으로 퍼블리셔에 슬롯이 자동 생성됩니다(옵션으로 비활성화 가능: WITH (slot_name = 'none')).
- Debezium, Kafka Connect, pg_recvlogical, wal2json 등 논리 디코딩 클라이언트가 접속 시 논리 슬롯을 생성합니다.
수동으로 늘려줘야 하나?
- 클러스터 멤버(스탠바이)용 물리 슬롯: Patroni가 관리하므로 수동 생성 불필요합니다. 스탠바이를 Patroni로 join/remove 하면 슬롯도 따라 정리됩니다.
- 백업/외부 소비자 또는 논리 복제/CDC를 도입할 때:
- 해당 도구/워크로드에서 필요한 슬롯을 명시적으로 생성하거나(도구가 자동 생성하기도 함) 운영 정책에 맞춰 수동 관리합니다.
- 전제 조건: max_replication_slots 값(지금 20)이 필요 슬롯 수보다 충분히 커야 합니다. 부족하면 새 슬롯 생성이 실패합니다.
실무 체크리스트
- 현재 슬롯 현황
SELECT slot_name, slot_type, active, wal_status, restart_lsn, confirmed_flush_lsnFROM pg_replication_slots ORDER BY slot_type, slot_name;
- 사용 중이지 않은 슬롯 정리(주의)
-- 슬롯 소비자가 더 이상 존재하지 않으면 드롭SELECT pg_drop_replication_slot('obsolete_slot');
- WAL 누적 감시
- wal_status가 reserved/extended 상태로 오래 머무는 슬롯은 소비가 지연되는 중 → 디스크 압박 원인.
'DB > PostgreSQL' 카테고리의 다른 글
| PostgreSQL tablespace (0) | 2025.08.22 |
|---|---|
| PostgreSQL Subscription (0) | 2025.08.20 |
| PG의 2PC(2-Phase-Commit) (4) | 2025.08.11 |
| PG의 wal_level 설정 (3) | 2025.07.30 |
| PREPARE TRANSACTION (3) | 2025.07.30 |