PostgreSQL pg_wal 설정 최적화
pg_wal 주요 파라미터와 설정 영향, 성능과 복구 가능성 간 균형 조정 방법을 초보자도 이해하기 쉬운 기술자료
목차
개요
WAL(Write-Ahead Logging)은 PostgreSQL의 쓰기 내구성과 복구 메커니즘 핵심이다. pg_wal 디렉터리에 기록되는 로그는 장애 시 데이터 일관성을 보장한다. 다만 설정에 따라 디스크 사용량과 쓰기 성능이 크게 달라진다. 이 글은 WAL 관련 주요 파라미터를 설명하고, 성능과 안전성 사이 균형을 맞추는 실무적 접근을 제시한다.
왜 WAL 설정을 튜닝해야 하는가
기본값은 대부분의 환경에서 무난하다. 그러나 고속 쓰기 워크로드나 대용량 배치 작업이 있는 시스템에서는 성능 병목이 발생한다. 반대로 데이터 손실을 최소화해야 하는 환경에서는 더 강한 동기화가 필요하다. 설정 튜닝은 다음 목표를 위해 수행된다.
- 쓰기 처리량 증가
- 정지 시간 최소화
- 디스크 공간 관리
- 복구 시간 단축
핵심 파라미터와 의미
wal_level
wal_level은 기록되는 WAL의 상세도를 결정한다. 기본값은 보통 'replica'다. 스트리밍 복제나 PITR(포인트인타임복구)을 사용하면 최소 'replica'가 필요하다. 로컬 단일 서버라면 'minimal'로 낮춰 디스크 사용과 CPU 오버헤드를 줄일 수 있다. 단, 복제나 백업 정책에 제한이 생긴다.
synchronous_commit
트랜잭션 커밋 시 WAL을 디스크에 동기화할지 결정한다. 'on'이면 데이터 안전성이 높다. 'off' 또는 'local'로 설정하면 지연 시간이 줄고 처리량은 늘어난다. 장애 시 데이터 손실 가능성을 고려해 결정해야 한다.
wal_buffers
WAL 버퍼 크기를 조정하면 동시 트랜잭션이 몰릴 때 쓰기 효율이 개선된다. 기본값은 작은 편이다. 대량의 동시 쓰기가 있는 환경에서는 수 메가바이트로 늘리는 것이 도움이 된다. 단, 너무 크게 설정하면 메모리 낭비가 될 수 있다.
checkpoint_timeout, max_wal_size, checkpoint_completion_target
체크포인트 빈도는 성능에 직접적 영향을 준다. 체크포인트가 자주 발생하면 디스크 I/O가 증가한다. max_wal_size와 checkpoint_timeout을 조정해 체크포인트 간격을 늘리면 배치 작업 중 성능이 향상된다. checkpoint_completion_target를 0.7~0.9로 설정하면 체크포인트 완료를 부드럽게 분산시켜 피크 I/O를 완화한다.
wal_compression
대역폭과 디스크 사용을 줄이려면 wal_compression을 활성화한다. CPU 비용이 올라가므로 CPU 여유가 있는 환경에서 효과적이다. 큰 행을 자주 쓰는 시스템에서 유리하다.
archive_mode, archive_command
아카이브를 사용하면 PITR이 가능해진다. 아카이브 대상의 성능이 낮으면 WAL 생성이 블로킹될 수 있다. 비동기 전송이나 전용 네트워크, 빠른 스토리지를 사용하는 것이 바람직하다.
실무 설정 예제
아래 예제는 높은 쓰기 처리량 환경에서의 기본 가이드라인이다. 환경에 맞춰 값을 조정해야 한다.
# postgresql.conf 예시
wal_level = replica
synchronous_commit = off
wal_buffers = 16MB
max_wal_size = 4GB
min_wal_size = 1GB
checkpoint_timeout = 15min
checkpoint_completion_target = 0.8
wal_compression = on
archive_mode = on
archive_command = 'cp %p /var/lib/pgsql/wal_archive/%f'
설정 변경 후에는 reload 또는 restart가 필요하다. 대부분의 파라미터는 즉시 반영되지 않으므로 문서를 확인한다.
모니터링과 진단
튜닝 전후에 모니터링이 필수다. 주요 지표는 WAL 생성 속도, 체크포인트 발생 빈도, pg_wal 디렉터리 크기, 디스크 I/O 대기 시간이다. 간단한 SQL로 상태를 확인할 수 있다.
-- 현재 WAL 위치 확인
SELECT pg_current_wal_lsn();
-- 체크포인트 통계
SELECT checkpoints_timed, checkpoints_req, checkpoint_write_time, checkpoint_sync_time
FROM pg_stat_bgwriter;
-- WAL 보관 디렉터리 용량 확인 (리눅스)
du -sh /var/lib/pgsql/14/data/pg_wal
권장 절차
- 현재 워크로드와 복구 요구사항 문서화
- 기본값에서 한 번에 한 파라미터만 변경
- 변경 후 충분한 부하 테스트와 모니터링 수행
- 아카이브 및 복제 구성 시 네트워크와 스토리지 성능 고려
결론
pg_wal 설정은 성능과 내구성 사이의 균형이다. 각 파라미터의 의미를 이해하고, 워크로드 특성에 맞춰 신중히 조정하면 큰 성능 개선을 기대할 수 있다. 변경은 단계적으로 적용하고, 모니터링으로 효과를 검증하는 절차를 권장한다.