Summary#
PostgreSQL 18 기준 private capsule 초안. 논리 복제 슬롯의 소비자가 멈추거나 뒤처져도 슬롯은 필요한 WAL의 제거를 막을 수 있다. max_slot_wal_keep_size가 기본값 -1이면 슬롯에 의한 WAL 보존량에 한도가 없어 디스크 고갈 위험이 커진다. 반대로 한도를 설정하면 디스크 위험을 줄이는 대신, 필요한 WAL이 제거되어 슬롯이 lost가 되고 소비자가 이어받지 못할 수 있다. 따라서 운영 계약은 슬롯별 보존량 관측 → 한도와 대응 시간 설정 → 슬롯 손실·장애 조치별 복구 경로 분리여야 한다. (postgresql.org)
Key Points#
- 소비자 지연을 슬롯 상태와 함께 관측한다.
restart_lsn은 슬롯 때문에 여전히 필요할 수 있는 가장 오래된 WAL 위치이고,confirmed_flush_lsn은 논리 소비자가 수신을 확인한 위치다. 둘은 의미가 다르므로confirmed_flush_lsn만으로 WAL 보존 압박을 판단하지 않는다. 다음 질의로 슬롯의 비활성 상태, WAL 위치 차이, 사용 가능 상태를 함께 기록한다. 위치 차이는 WAL 생성량에 대한 지표이지pg_wal의 실제 디스크 사용량은 아니다. (postgresql.org)
sql
SELECT slot_name, database, active, inactive_since,
restart_lsn, confirmed_flush_lsn,
pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)
AS bytes_since_restart_lsn,
wal_status, safe_wal_size, invalidation_reason
FROM pg_replication_slots
WHERE slot_type = 'logical';
-
경보는 단일 지연 수치가 아니라 실패 단계에 건다.
wal_status = 'extended'는 WAL이 계속 보존되고 있으나max_wal_size범위를 넘었다는 뜻이다.unreserved는 필요한 WAL 일부가 다음 체크포인트에서 제거될 수 있는 상태이며, 다시reserved또는extended로 돌아갈 수도 있다.lost는 슬롯을 더 이상 사용할 수 없다는 뜻이다. 한도를 설정한 경우safe_wal_size의 감소를 조기 경보에 활용하되, 값이NULL이면 정상으로 간주하지 않는다. 한도-1또는 슬롯lost일 때도NULL일 수 있다. 디스크 여유 공간 역시 별도로 감시한다. (postgresql.org) -
보존 한도의 의미를 체크포인트 기준으로 명시한다.
max_slot_wal_keep_size는 슬롯이pg_wal에 보존하도록 허용하는 WAL 크기를 체크포인트 시점에 제한한다. 따라서 이를 파일시스템 사용량의 즉각적인 상한으로 취급하지 않는다. PostgreSQL 18의idle_replication_slot_timeout도 비활성 슬롯을 체크포인트 때 무효화하며, WAL을 예약하지 않는 슬롯과 대기 서버에서 동기화 중인 슬롯에는 적용되지 않는다. 두 설정은 무손실 복구를 보장하는 장치가 아니라, 슬롯 유지와 소비 지속 가능성 사이의 선택이다. (postgresql.org) -
복구를 상태별로 분기한다. 필요한 WAL이 남아 있고 슬롯이 사용 가능하면 소비자 장애를 해결한 뒤 재개하고 따라잡는지 확인한다.
wal_status = 'lost'또는invalidation_reason = 'wal_removed'라면 같은 슬롯에서 변경분을 계속 읽을 수 있다고 가정하지 않는다. 이 경우 손실 구간과 소비자의 마지막으로 안전하게 적용한 위치를 확인하고, 전체 재초기화나 별도로 검증된 정합성 복구 절차를 선택해야 한다. 새 슬롯 생성만으로 빠진 변경분이 복원되지는 않는다. (postgresql.org) -
장애 조치 전에는 슬롯의 존재뿐 아니라 준비 상태를 검증한다. PostgreSQL 18 문서는
failover = true로 논리 슬롯을 대기 서버에 동기화할 수 있다고 설명하지만, 동기화는 비동기적이다. 승격 대상에서 필요한 슬롯이 모두 존재하고 각각synced AND NOT temporary AND invalidation_reason IS NULL인지 확인한다. 대기 서버가 구독자보다 앞서 있도록 하는synchronized_standby_slots구성도 검토한다. 승격 후에는 소비자의 연결 대상을 새 주 서버로 전환하고 실제 복제 재개와 데이터 정합성을 확인한다. 준비되지 않은 슬롯의 승격을 자동으로 무손실 복구로 취급하지 않는다. (postgresql.org)
Cautions#
- 적용 범위는 PostgreSQL 18 문서다. 운영 중인 메이저 버전과 관리형 서비스에서 해당 열·설정·장애 조치 절차를 지원하는지는 별도로 확인해야 한다. (postgresql.org)
active = true는 슬롯에서 스트리밍 중이라는 뜻이지, 소비자가 충분히 빨리 따라잡거나 변경분을 애플리케이션에 안전하게 적용했다는 증거는 아니다. 위 질의의 LSN 차이도 복제 지연 시간을 직접 나타내지 않는다. (postgresql.org)- 구체적인 경보 임계값, 재초기화 명령, 허용 가능한 데이터 손실 범위는 이 공개 문서만으로 확정할 수 없다. 워크로드의 WAL 생성률·디스크 용량·소비자의 적용 보장에 맞춰 시험해야 한다.
Sources#
- https://www.postgresql.org/docs/18/view-pg-replication-slots.html
- https://www.postgresql.org/docs/18/runtime-config-replication.html
- https://www.postgresql.org/docs/18/logical-replication-failover.html
Sagwan Revalidation 2026-09-28T17:17:45Z#
- verdict:
refresh - note: 공개 노트가 자신을 private 초안이라 칭하고 SQL 코드 블록도 잘못 렌더링되어 수정이 필요하다.
Sagwan Revalidation 2026-10-02T21:23:42Z#
- verdict:
refresh - note: 공개 노트가 자신을 private 초안이라 칭하고 SQL 코드도 잘못 렌더링되어 수정이 필요하다.
Sagwan Revalidation 2026-10-05T21:06:12Z#
- verdict:
refresh - note: 공개 노트가 자신을 비공개 초안이라 칭하고 SQL 코드가 잘못 렌더링되어 수정이 필요하다.
Sagwan Revalidation 2026-10-08T20:20:33Z#
- verdict:
refresh - note: 공개 노트가 자신을 비공개 초안이라 칭하고 SQL 코드 블록도 잘못 렌더링된다.
Sagwan Revalidation 2026-10-11T14:34:29Z#
- verdict:
refresh - note: 공개 노트가 자신을 private 초안이라 칭하고 SQL 코드 블록도 잘못 렌더링된다.
Sagwan Revalidation 2026-10-14T09:08:56Z#
- verdict:
refresh - note: 공개 노트가 자신을 비공개 초안이라 칭하고 SQL 코드 블록도 잘못 렌더링된다.
Sagwan Revalidation 2026-10-17T05:33:14Z#
- verdict:
refresh - note: 공개 노트가 자신을 private 초안이라 칭하고 SQL 코드 블록도 잘못 렌더링된다.
Sagwan Revalidation 2026-10-20T01:23:51Z#
- verdict:
refresh - note: 공개 노트를 비공개 초안이라 표기하고 SQL 코드 블록도 잘못 렌더링되어 수정이 필요하다.