PostgreSQL: WAL 증가로 디스크 포화가 발생했을 때의 대응과 예방
문제 정의 — WAL 증가가 디스크를 채우는 상황과 영향
PostgreSQL의 WAL(Write-Ahead Log)은 트랜잭션 변경 내용을 순차적으로 기록해 일관성 복구와 복제를 가능하게 하는 핵심 구성요소(예: pg_wal/pg_xlog 세그먼트)입니다. 평상시에는 아카이브되거나 오래된 세그먼트가 삭제되지만, 쓰기량 급증·장기 트랜잭션·복제 지연·아카이브 실패 등이 동시에 발생하면 WAL이 빠르게 쌓여 디스크를 포화시킬 수 있습니다. 이런 상황은 PostgreSQL WAL 증가로 디스크 포화 발생 시 대응이 필요함을 의미합니다.
- 가용성: pg_wal이 가득 차면 트랜잭션 커밋이 실패하고 데이터베이스 응답이 멈추며, 프로세스 오류로 서비스 장애가 발생할 수 있습니다.
- 복구: 필수 WAL 세그먼트가 사라지면 PITR(Point-in-Time Recovery)이나 장애 복구가 불완전해지고, 결과적으로 백업의 신뢰성이 떨어집니다.
- 복제: 스트리밍 복제나 레플리케이션 슬롯이 WAL을 계속 보관하면 프라이머리 디스크가 지속적으로 채워져 레플리카가 따라잡지 못하거나 장애가 전파될 수 있습니다. 체크리스트 예시 — 슬롯 사용 여부 확인, 아카이브 성공 여부 점검, 오래된 슬롯 제거 및 replica_lag 모니터링.
원인 진단 체크리스트 — WAL 급증의 흔한 원인
- 장기 트랜잭션 — 열린 트랜잭션이 xmin 상한을 막고 있는지 확인하세요:
SELECT pid, state, query_start, query FROM pg_stat_activity;각 데이터베이스의 oldest xmin/age도 함께 살펴보십시오. - 대용량 쓰기/배치 작업 — COPY, 대량 INSERT/UPDATE, 인덱스 재생성 등에서 WAL 생성이 급증할 수 있습니다. 최근 배치 스케줄과 작업 로그를 점검하세요.
- 아카이브 실패 —
archive_command실패로 WAL이 보관되어 누적될 수 있습니다. 아카이브 로그,archive_status디렉토리와 서버 로그를 확인하십시오. - 복제 슬롯 — 비활성 슬롯이 WAL을 보존해 디스크를 채울 수 있으니 확인이 필요합니다:
SELECT slot_name, active, restart_lsn FROM pg_replication_slots; - 설정·정책 —
SHOW wal_level;결과와archive_mode,max_wal_size,wal_keep_size설정, 그리고 백업 정책(증분/연속)을 점검하세요. - 예방 포인트 — autovacuum 동작 상태 확인, 고빈도 대형 트랜잭션을 쪼개기, 아카이브 신뢰성 확보, 불필요한 슬롯 제거 등을 검토하십시오. 실무 체크리스트 예: 가장 최근 24시간의 WAL 생성량, 활성/비활성 복제 슬롯 목록, archive_command 성공률을 우선 확인하여 우선순위를 정합니다. PostgreSQL WAL 증가로 디스크 포화 발생 시 대응 시에는 이 순서대로 점검하면 빠르게 원인을 좁힐 수 있습니다.
비상 플레이북 — 즉시 공간 확보와 서비스 안정화 절차
- 원인 파악(최우선) — WAL 사용량과 복제·아카이브 상태를 확인합니다:
SELECT pg_current_wal_lsn(), pg_last_wal_replay_lsn(). 복제 지연과archive_command실패 로그를 점검하고, 오래 열린 트랜잭션이나 대용량 COPY가 있는지 확인하세요. - 쓰기 제한·비필수 서비스 중단 — 애플리케이션 레이어에서 쓰기를 제한하거나 읽기 전용 모드로 전환합니다. 배치·비정기 작업을 중지하고, WAL을 대량 생성하는 장기 세션을 종료하세요.
- 임시 디스크 증설 — 클라우드 볼륨(또는 LVM)을 즉시 확장해 공간을 확보합니다. 가능하면 새 볼륨을 마운트한 뒤
pg_wal를 옮기되, 운영 중 이동은 주의하고 필요하면 PostgreSQL을 중지한 뒤 이동하세요. - 아카이브/복제 프로세스 재시작·체크포인트 강제 실행 — 아카이브 도구(wal-e/wal-g 등)를 재시작하고 스트리밍 복제를 복구합니다. 디스크 확보 후 DB에서
CHECKPOINT;를 실행해 WAL 파일의 재활용을 촉진하세요. - 주의 — WAL 파일 삭제는 반드시 아카이브·복제 상태를 먼저 확인한 뒤 진행합니다. 근본 원인(과도한 WAL 생성, 체크포인트 정책, autovacuum 설정 등)을 분석해 재발 방지 대책을 적용하세요. 실무 체크리스트 예: 아카이브 성공 여부 확인, 복제 지연 점검, 장기 트랜잭션 존재 여부 확인, 최근 대용량 작업 로그 검토. 위 절차는 PostgreSQL WAL 증가로 디스크 포화 발생 시 대응에 유용합니다.
근본 원인 해결 및 구성 개선 방안
PostgreSQL WAL 증가로 디스크 포화가 발생했을 때는 단기 복구뿐 아니라 근본 원인 차단이 더 중요합니다. 아래 항목을 점검하고 적용하세요.
- 아카이브 신뢰성 확보: archive_command를 안정적으로 설정하고, 아카이브 실패 시 자동 재시도·재전송을 지원하는 도구(pgbackrest, wal-g)를 도입하세요. archive_check 같은 검증 절차를 마련하고 아카이브 지연 발생 시 알람을 설정합니다.
- 복제 슬롯 관리: 사용하지 않는 논리·물리 슬롯은 제거하고, 장기간 유휴 슬롯이 WAL을 고정하지 않도록 정기 점검과 자동 정리 정책을 수립하세요.
- WAL 보존 관련 파라미터 튜닝: max_slot_wal_keep_size로 슬롯별 보존 상한을 설정하고, wal_keep_size는 스트리밍 대역폭을 고려해 조정합니다. max_wal_size와 min_wal_size는 체크포인트 주기 제어에 활용하세요.
- 체크포인트 최적화: checkpoint_timeout과 checkpoint_completion_target을 조정해 급격한 WAL 생성 폭주를 완화하고 I/O 스파이크를 분산합니다. wal_compression 적용 여부도 검토해 WAL 볼륨을 줄이세요.
- 백업·보존 정책 설계: 베이스백업과 WAL 보관 기간을 서비스의 RPO/RTO에 맞게 정의하고, pgbackrest 같은 도구로 자동 정리(retention)를 설정하세요.
- 모니터링·알림: archive lag, 슬롯 보존 상태, WAL 볼륨, 디스크 사용률 등을 실시간으로 모니터링하고 임계치를 정해 알림을 구성해 조기에 대응합니다.
- 실무 체크리스트 예: 일일 디스크 사용률 확인, archive lag 임계(예: 5분) 설정, 미사용 복제 슬롯 정리, 보존 정책(retention) 적용 여부 점검.
관찰성·알림·사후대응 — 재발 방지와 운영 문서화
관찰성은 PostgreSQL WAL 증가로 디스크 포화가 발생할 때를 조기에 탐지하고 대응 우선순위를 정하는 근거입니다. 다음 항목을 운영 문서에 빠짐없이 기록하세요.
- 모니터링 지표: WAL 사용량(GB, %), 활성 WAL 파일 수, 가장 오래된 WAL 파일의 생성 시각(age), replication lag(초·byte), archive queue 길이
- 경보 임계값(권장 예시): 디스크 사용 — 경고 70%, 치명 90%; WAL 파일 수 급증 — 평상시 대비 3배 이상; replication lag — 경고 30초, 치명 300초; archiver 지연 — 10분
- 알림 흐름: 경고는 on‑call에 통보하고, 치명 상황은 자동 확장이나 장애조치 워크플로를 트리거하며 관리자에게 긴급 호출을 합니다.
런북에는 단계별 대응(원인 확인, 임시 공간 확보, 아카이브 상태 점검, standby 상태 확인, 필요 시 프로모션/복구)과 책임자·연락처를 반드시 포함하세요. 실무 체크리스트(예): 디스크 여유 확보 → 아카이브 큐 상태 확인 → replication lag 및 standby 상태 점검 → 필요 시 아카이브 재시작이나 임시 공간 확보. 검증 주기: 지표 리뷰는 주간, 런북 모의복구·테스트는 월간, 문서·임계값 갱신은 분기별로 수행하고 모든 변경 사항은 RCA와 함께 기록합니다.
문제 정의 — WAL 증가가 디스크를 채우는 상황과 영향
PostgreSQL의 WAL(Write-Ahead Log)은 트랜잭션 변경 내용을 순차적으로 기록해 일관성 복구와 복제를 가능하게 하는 핵심 구성요소(예: pg_wal/pg_xlog 세그먼트)입니다. 평상시에는 아카이브되거나 오래된 세그먼트가 삭제되지만, 쓰기량 급증·장기 트랜잭션·복제 지연·아카이브 실패 등이 동시에 발생하면 WAL이 빠르게 쌓여 디스크를 포화시킬 수 있습니다. 이런 상황은 PostgreSQL WAL 증가로 디스크 포화 발생 시 대응이 필요함을 의미합니다.
- 가용성: pg_wal이 가득 차면 트랜잭션 커밋이 실패하고 데이터베이스 응답이 멈추며, 프로세스 오류로 서비스 장애가 발생할 수 있습니다.
- 복구: 필수 WAL 세그먼트가 사라지면 PITR(Point-in-Time Recovery)이나 장애 복구가 불완전해지고, 결과적으로 백업의 신뢰성이 떨어집니다.
- 복제: 스트리밍 복제나 레플리케이션 슬롯이 WAL을 계속 보관하면 프라이머리 디스크가 지속적으로 채워져 레플리카가 따라잡지 못하거나 장애가 전파될 수 있습니다. 체크리스트 예시 — 슬롯 사용 여부 확인, 아카이브 성공 여부 점검, 오래된 슬롯 제거 및 replica_lag 모니터링.
경험에서 배운 점
PostgreSQL WAL 증가로 디스크 포화 발생 시 대응에서 가장 중요한 순서는 서비스 중단 없이 안전하게 공간을 확보한 뒤, WAL이 왜 삭제되지 않는지 근본 원인을 파악하는 것입니다. 먼저 긴급 완화를 수행하세요. 예를 들어 읽기 전용 스냅샷이나 로그 백업으로 일부 로그를 외부로 옮기거나 비핵심 로그·아카이브를 임시 이동해 디스크 여유를 만드는 식입니다. 동시에 pg_stat_replication, pg_stat_activity, pg_stat_archiver 등을 확인해 복제 지연, 장기 트랜잭션, 아카이브 실패나 replication slot 보존 설정이 문제인지 점검해야 합니다. 실무에서 흔히 저지르는 실수는 DB 프로세스 밖에서 WAL 파일을 임의로 삭제해 데이터 손상을 초래하거나, 원인을 해결하지 않은 채 단순히 디스크 용량만 늘리는 것입니다.
재발 방지를 위한 실무 체크리스트: 1) archive_mode와 archive_command, 그리고 백업 파이프라인의 정상성 확인 및 실패 알림 설정; 2) replication slot과 복제 지연 모니터링, 불필요한 슬롯의 자동 정리 정책 도입; 3) max_slot_wal_keep_size/wal_keep_size 같은 보존 한계 설정과 wal-e/wal-g 등 백업 툴의 보존 정책 연동; 4) 장기 트랜잭션과 대용량 쓰기 작업은 쪼개거나 배치 처리로 설계; 5) WAL 성장률·pg_wal 디렉터리 사용량·디스크 잔여량·archive 실패 건수에 대한 경보와 Runbook(복제 재연결, 아카이브 재시도, 안전한 WAL 이동/삭제 절차 포함) 작성; 6) 정기 복원 테스트로 아카이브/백업 체계의 실효성 검증. 실무 예: replication slot이 급격히 증가해 디스크를 잠식할 경우, 해당 슬롯의 소비량을 자동 경고로 잡고 복제 대상이 복구되지 않으면 슬롯 정리 절차를 실행하는 워크플로를 미리 마련해 두면 실제 대응 시간이 크게 단축됩니다.
댓글
댓글 쓰기