PostgreSQL 복제 슬롯 관리과 오래된 슬롯 해결
PostgreSQL 복제 슬롯의 개념과 모니터링 방법, 고아 슬롯(orphaned slot) 식별 및 안전한 삭제 절차를 통한 운영 안정성 확보 절차
목차
개요
PostgreSQL 복제 슬롯(replication slot)은 WAL(Write-Ahead Log)을 보관하여 복제 클라이언트가 데이터를 놓치지 않게 하는 장치다. 올바르게 관리하지 않으면 WAL이 쌓여 디스크를 채우고 성능에 영향을 준다. 이 글은 복제 슬롯 관리 방법과 오래된 슬롯, 즉 orphaned slot postgres 삭제 절차를 쉽게 설명한다.
복제 슬롯의 기본 개념
복제 슬롯은 두 종류로 나뉜다. 물리 복제(physical)와 논리 복제(logical)다. 물리 복제 슬롯은 복제 스트리밍에 사용된다. 논리 복제 슬롯은 테이블 단위 복제나 외부 도구와의 연동에 쓰인다. 슬롯이 활성화되어 있으면 해당 슬롯이 참조하는 WAL 파일을 서버가 삭제하지 않는다.
왜 슬롯 관리는 중요한가
- 비활성 슬롯이 있으면 WAL 보관량이 늘어난다.
- 디스크 공간 부족으로 인한 서비스 중단 위험이 있다.
- 모니터링 없이 방치하면 복구와 백업에 영향을 준다.
현재 슬롯과 연결 상태 확인
먼저 현재 생성된 슬롯과 연결 상태를 확인한다. 아래 쿼리는 기본 정보 확인에 유용하다.
SELECT slot_name, plugin, slot_type, active, restart_lsn
FROM pg_replication_slots;
SELECT pid, client_addr, state, sent_lsn, write_lsn, flush_lsn, replay_lsn
FROM pg_stat_replication;
첫 번째 쿼리로 모든 슬롯을 본다. 두 번째 쿼리는 실제로 연결된 백업 혹은 리플리케이션 프로세스를 보여준다. replication slot 관리 postgres 관점에서 두 결과를 비교하여 고아 슬롯을 찾는다.
오래된 슬롯(Orphaned slot) 판단 기준
오래된 슬롯을 판단하는 기준은 환경마다 다르다. 일반적으로 다음을 고려한다.
- pg_replication_slots에 존재하지만 pg_stat_replication에 연결 정보가 없는 슬롯.
- 마지막 사용 시점이 오래된 슬롯. 논리 슬롯의 경우 마지막 트랜잭션 적용 시점 확인.
- WAL 보존량이 급격히 늘어나는 원인으로 보이는 슬롯.
다음 쿼리로 오래된 슬롯을 좀 더 구체적으로 찾을 수 있다.
SELECT rs.slot_name, rs.slot_type, rs.active, ps.state, age(now(), pg_xact_commit_timestamp(rs.xmin)) AS last_change
FROM pg_replication_slots rs
LEFT JOIN pg_stat_replication ps ON rs.slot_name = ps.application_name;
-- 단, pg_xact_commit_timestamp 사용은 버전 및 설정에 따라 다를 수 있음
안전한 삭제 전 체크리스트
직접 삭제하기 전에 반드시 확인해야 할 항목은 다음과 같다.
- 해당 슬롯을 사용하는 복제 클라이언트가 더 이상 존재하지 않는지 확인.
- 필요한 백업이나 복제 데이터가 남아있는지 확인.
- 삭제 전 서버의 디스크 사용량과 WAL 보존 정책을 점검.
- 논리 복제 슬롯인 경우 slot_consumer(구독자) 상태 확인.
오래된 슬롯 삭제 절차
오래된 슬롯을 삭제할 때는 pg_drop_replication_slot 함수를 사용한다. 주의할 점은 슬롯을 삭제하면 복구가 불가능하므로 미리 백업해야 한다.
-- 예: 슬롯 안전하게 삭제하기
SELECT pg_drop_replication_slot('old_slot_name');
-- 물리적 복제 슬롯 삭제 전, 관련 replication 프로세스 종료 권장
-- 논리 슬롯 삭제 시에는 논리 복제 수신자가 없는지 재확인
실행 시 WAL 보관 상태가 해소되면 디스크 사용량이 줄어드는지 확인한다. 만약 즉시 디스크가 회복되지 않으면 누적된 WAL을 수동으로 정리하거나 서버 재시작을 고려한다.
자동화와 모니터링 권장 설정
장기적으로는 모니터링과 자동화가 중요하다. 다음 항목을 권장한다.
- 정기적으로 pg_replication_slots와 pg_stat_replication을 비교하는 스크립트 운영.
- Prometheus, Grafana 같은 모니터링 도구로 WAL 사용량과 슬롯 상태 시각화.
- max_slot_wal_keep_size 등 WAL 정책을 적절히 설정하여 슬롯으로 인한 무제한 증식을 방지.
예시: 간단한 검사 스크립트
-- 오래된 슬롯을 찾는 간단한 쿼리 예시
SELECT rs.slot_name, rs.slot_type, rs.active,
CASE WHEN ps.pid IS NULL THEN 'orphaned' ELSE 'active' END AS status
FROM pg_replication_slots rs
LEFT JOIN pg_stat_replication ps ON rs.slot_name = ps.application_name
WHERE rs.active = false OR ps.pid IS NULL;
문제가 생겼을 때 우회 방법
만약 슬롯 삭제가 어려운 경우 우회 방법이 있다. 예를 들어 논리 슬롯을 재사용하거나, 구독자를 다시 연결하여 정상 종료 후 삭제하는 방식이다. 물리 복제의 경우 새 슬롯을 만들어 복제를 재설정하는 것이 안전할 때가 있다.
요약 및 권장 작업 흐름
- 정기적으로 슬롯 목록과 연결 상태를 확인한다.
- orphaned slot postgres 삭제 전 꼼꼼히 확인한다.
- 삭제는 pg_drop_replication_slot로 수행하되 백업을 먼저 확보한다.
- 모니터링 도구로 WAL 증가를 감지하도록 설정한다.
이 절차를 따르면 replication slot 문제 해결과 복제 슬롯 관리 postgres 운영 안정성 확보에 큰 도움이 된다.