PostgreSQL 마이너 버전 업데이트(패치)
PostgreSQL난이도: 중급소요 시간: 20–60분같은 메이저 버전 안에서의 마이너 업데이트(예: 17.4 → 17.x)입니다. release notes 확인, 백업, 롤백용 현재 RPM/deb 보관을 포함합니다. 단일 서버에서는 짧은 다운타임으로 진행하고, streaming replication 클러스터에서는 standby를 먼저 업데이트한 뒤 switchover로 primary를 업데이트합니다(rolling). Patroni 클러스터에서는 replica를 patronictl restart로, leader는 patronictl switchover 후에 업데이트합니다. 확장(extension) 업데이트, 검증, 롤백(downgrade) runbook도 포함합니다. 완료되면 모든 서버가 같은 새 마이너 버전으로 실행되고, 롤백용으로 이전 버전 파일이 남아 있습니다.
메이저 버전이 바뀌는 경우(예: 16 → 17)에는 이 가이드가 아니라 pg-major-upgrade를 사용합니다. Patroni 소프트웨어 자체의 업데이트는 pg-patroni에 있습니다.
구성: 서버 1대, primary + standby 또는 Patroni 클러스터
시나리오
- 마이너 업데이트 — 같은 메이저 버전 안에서 새 마이너 버전으로 전환(예: 17.4 → 17.6): 보안 및 버그 수정. 단일 서버는 짧은 다운타임, 클러스터는 rolling 방식.
- 롤백: 이전 마이너 버전으로 되돌리기(downgrade) — 새 마이너 버전에서 버그나 회귀가 발생한 경우, 저장해 둔 이전 버전 RPM/deb로 되돌립니다. 데이터 디렉터리는 변경되지 않습니다.
시작하기 전에
- PostgreSQL …가 PGDG 저장소에서 설치되어 실행 중입니다(pg-install). 업데이트는 같은 메이저 버전 안에서 진행합니다. … → 다른 메이저 버전으로 전환하려면 pg-major-upgrade 가이드를 사용하십시오.
- 현재 버전과 대상 버전 사이의 모든 마이너 버전 release notes를 읽었습니다. 특히 "Migration to Version …" 섹션에서 추가 작업(REINDEX, 설정 변경)이 요구되는지 기록해 두었습니다: https://www.postgresql.org/docs/release/
- 서버가 PGDG 저장소 또는 사내 미러에 접근할 수 있으며 미러가 최신 상태입니다.
- 유지 보수 시간이 승인되었고…(서비스가 수 초에서 수 분간 중단됨)…(switchover/restart 시점에 연결이 수 초간 끊김)… 애플리케이션 팀에 공지했습니다.
- 마지막 백업이 성공했고…(pgbackrest info status ok)… 서버의 VM/디스크 스냅샷을 생성할 수 있습니다.
- 모든 standby가 streaming 상태이며 지연이 없습니다.
- switchover 후 역할이 바뀌므로 모든 노드의 pg_hba.conf가 다른 노드의 replication 연결을 허용하고, … 비밀번호가 모든 노드에서 postgres 사용자의 ~/.pgpass 파일에 있습니다.
- 클러스터가 Patroni/repmgr 같은 HA 도구로 관리되지 않습니다. Patroni가 관리하면 토폴로지에서 Patroni를 선택하고, repmgr는 참고 사항을 보십시오. 이 경로의 수동 switchover 단계는 HA 도구의 판단과 충돌합니다.
- Patroni 클러스터가 정상입니다: Leader 하나, 모든 replica가 streaming, Lag가 작고 Maintenance mode가 꺼져 있습니다. …가 현재 leader이며 replica 이름은 Patroni 멤버 이름과 같습니다.
- 변경을 수행하는 patronictl 명령(restart, switchover)에는 REST API 인증이 필요합니다. 사용자/비밀번호는 모든 노드의 /etc/patroni/patroni.env 파일에 있습니다(pg-patroni 설치). 다른 구성을 사용한다면 patronictl이 -c로 읽는 파일에 restapi.authentication이 정의되어 있어야 합니다.
- 업데이트 전에 … 디렉터리에 이전 버전의 RPM/deb 파일을 저장했고, 이전 버전 번호는 …/prev-version.txt 파일에 있습니다. 저장본이 없으면 이전 버전을 저장소에서 다운로드해야 합니다(EL: PGDG가 이전 버전을 보관, Debian/Ubuntu: apt-archive.postgresql.org).
가이드 단계
- 사전 점검 — 현재 버전 기록 · 저장소의 버전 나열 · release notes 확인 · 설치된 확장 나열 · 장기 실행 트랜잭션과 prepared transaction 확인
- 백업 및 복귀 지점 — 백업(pgBackRest) · 백업(pg_dumpall + 스냅샷) · 현재 RPM/deb 파일 보관
- Patroni 클러스터: 사전 점검 — 클러스터 상태 및 역할 검증
- 업데이트 — Checkpoint 실행 · PostgreSQL 중지 · 소프트웨어 업데이트 · PostgreSQL 시작
- primary 업데이트(짧은 다운타임) — Checkpoint 실행 · primary 중지 · 소프트웨어 업데이트 · primary 시작
- Switchover 및 기존 primary 업데이트 — 복제가 최신 상태인지 검증 · 애플리케이션 쓰기 중지 · 기존 primary 정상 종료 및 마지막 checkpoint 기록 · …: WAL이 모두 도착했는지 검증 후 promote · 애플리케이션을 새 primary로 전환 · 기존 primary용 replication slot 생성 …
- Leader: switchover 및 기존 leader 업데이트 — 기존 leader: 소프트웨어 업데이트 · Switchover: …을(를) leader로 · 기존 leader(…) 재시작 · 클러스터 최종 상태 검증
- 확장 및 검증 — 확장 업데이트(ALTER EXTENSION … UPDATE) · 확장 업데이트(ALTER EXTENSION … UPDATE) · release notes의 추가 작업 적용 · 버전 및 상태 검증 · 로그에서 오류 검색 · 업데이트 후 백업 …
- 롤백(downgrade) — 이전 버전 확인 · …: 중지, 이전 버전 설치, 시작 · …: 이전 버전 설치 후 Patroni로 재시작 · Leader: 이전 버전 설치 · leader 넘기기 및 기존 leader 재시작 · …primary 중지…PostgreSQL 중지… …