PostgreSQL 업그레이드: pg_upgrade와 롤링 전략
pg_upgrade의 개념과 준비 사항, 실행 절차를 사례 중심으로 정리한 설명. 롤링 업그레이드와 무중단 전략, 점검 항목과 명령어 예시를 포함한 방법
목차
개요
PostgreSQL 버전 업그레이드는 성능 개선과 보안 패치 적용을 위해 필수적이다. 본문은 pg_upgrade 사용법과 롤링 업그레이드를 중심으로 무중단 전환을 위한 실무적 절차를 설명한다. 초보자도 이해할 수 있도록 개념부터 명령어 예시, 점검 항목까지 단계별로 정리한다.
pg_upgrade란 무엇인가
pg_upgrade는 기존 데이터 디렉토리를 직접 변환해 빠르게 버전을 올리는 도구다. 전체 데이터를 덤프하고 복원하는 방식보다 시간이 훨씬 짧다. 파일 포맷 변화가 있는 경우에도 효율적으로 마이그레이션할 수 있다.
장점과 단점
- 장점: 빠른 업그레이드, 데이터 재입력 불필요
- 단점: 바이너리 호환성 요구, 사전 준비와 테스트 필요
사전 준비
안전한 업그레이드를 위해 사전 점검이 필수다. 아래 항목을 확인한다.
- 백업: 전체 백업 또는 파일시스템 스냅샷 확보
- 버전 호환성: 설치된 확장(extension)과 모듈의 호환성 확인
- 디스크 공간: 새 데이터 디렉토리와 로그를 위한 충분한 여유 공간 확보
- 테스트 환경: 실제 환경과 동일한 테스트 시스템에서 리허설 수행
pg_upgrade 사용법
기본 과정은 기존 클러스터를 정지하고 새 버전의 바이너리로 변환하는 흐름이다. 낮은 리스크를 위해 먼저 테스트 환경에서 절차를 숙지한다.
주요 명령 예시
아래 예시는 간단한 로컬 업그레이드 절차다. 경로와 사용자 상황에 맞춰 조정한다.
export OLD_BINDIR=/usr/lib/postgresql/12/bin
export NEW_BINDIR=/usr/lib/postgresql/15/bin
export OLD_DATADIR=/var/lib/postgresql/12/main
export NEW_DATADIR=/var/lib/postgresql/15/main
# 기존 클러스터 정지
sudo systemctl stop postgresql@12-main
# 새 클러스터 초기화
sudo -u postgres $NEW_BINDIR/initdb -D $NEW_DATADIR
# pg_upgrade 실행
sudo -u postgres $NEW_BINDIR/pg_upgrade \
--old-bindir=$OLD_BINDIR --new-bindir=$NEW_BINDIR \
--old-datadir=$OLD_DATADIR --new-datadir=$NEW_DATADIR \
--jobs=4 --link
# 완료 후 검증 및 서비스 시작
sudo -u postgres $NEW_BINDIR/pg_ctl -D $NEW_DATADIR start
--link 옵션은 데이터 파일을 하드 링크로 연결해 디스크 사용을 줄인다. 다만 원본을 변경하므로 복구 계획을 반드시 확보한다.
롤링 업그레이드(무중단 전략)
롤링 업그레이드는 클러스터를 노드 단위로 순차 업그레이드해 서비스 중단을 최소화하는 방법이다. 일반적으로 스트리밍 복제나 Patroni, repmgr 같은 고가용성 도구와 함께 사용된다.
롤링 업그레이드 절차 개요
- 읽기 복제본에서 업그레이드 연습을 통해 호환성 확인
- 스탠바이 노드를 하나씩 끊고 업그레이드 후 재합류
- 최종적으로 프라이머리 전환(페일오버)을 수행하고 이전 프라이머리를 업그레이드
실무 팁
- 모니터링과 알람을 통해 지연(latency)과 복제 상태를 지속 확인
- 트래픽이 높은 시간대를 피해 순차 진행
- 마이그레이션 전후의 WAL 보존정책을 점검
검증과 문제 해결
업그레이드 후 다음 항목을 확인한다.
- 서비스 시작 여부와 로그 에러 유무
- 어플리케이션 연결 테스트 및 쿼리 성능 비교
- 확장(extension) 로드와 스키마 무결성 검사
문제가 발생하면 pg_upgrade가 생성한 로그와 검사 스크립트(analyze, regress 테스트 결과)를 검토한다. 필요하면 백업에서 복구하거나 테스트 환경으로 재현해 원인을 파악한다.
마무리 요약
pg_upgrade는 시간을 절약하는 효율적인 업그레이드 도구다. 롤링 업그레이드는 무중단을 지향하는 환경에서 유용하다. 핵심은 철저한 사전 준비와 테스트, 그리고 모니터링이다. 업그레이드 절차를 문서화하고 복구 계획을 항상 마련하면 리스크를 크게 줄일 수 있다.