나의 잡다한 노트 및 메모

PostgreSQL Replication slot 본문

DB/PostgreSQL

PostgreSQL Replication slot

peanutwalnut 2025. 8. 20. 17:05

PostgreSQL에서 Replication SlotWAL(Write Ahead Log) 로그 손실 방지 및 동기화 관리를 위한 메커니즘입니다. 기본적으로 물리적/논리적 복제 환경에서 슬레이브(또는 구독자)가 필요한 WAL 데이터를 잃지 않도록 보장하는 역할을 합니다.


1. Replication Slot이란?

  • Replication Slot은 서버 측에 생성되는 객체로, 특정 복제 클라이언트(standby, logical subscriber)가 어디까지 WAL을 읽었는지를 추적합니다.
  • 이를 통해 Postgres는 해당 슬롯이 소비되기 전까지 WAL 파일을 재활용하거나 삭제하지 않음으로써, 슬레이브가 뒤처져 있어도 데이터 손실이 발생하지 않도록 합니다.

2. 동작 방식

  1. 슬롯 생성
    • 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');
  2. WAL 보존
    • 슬롯이 만들어지면, PostgreSQL은 해당 슬롯의 restart_lsn(Log Sequence Number)을 기억합니다.
    • 해당 LSN 이후의 WAL 파일은 슬롯이 소비될 때까지 보존됩니다.
  3. 클라이언트 동기화
    • 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)이 필요 슬롯 수보다 충분히 커야 합니다. 부족하면 새 슬롯 생성이 실패합니다.

실무 체크리스트

  1. 현재 슬롯 현황
     
    SELECT slot_name, slot_type, active, wal_status, restart_lsn, confirmed_flush_lsn
    FROM pg_replication_slots ORDER BY slot_type, slot_name;
  2. 사용 중이지 않은 슬롯 정리(주의)
     
    -- 슬롯 소비자가 더 이상 존재하지 않으면 드롭
    SELECT pg_drop_replication_slot('obsolete_slot');
  3. 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