6.3 Rolling updates
PostgreSQL 이미지를 새 마이너 버전으로 올리거나, restart가 필요한 설정을 바꾸거나, Operator 자체를 업그레이드할 때 인스턴스를 다시 띄워야 합니다. 이때 모든 pod를 한꺼번에 내리면 서비스가 멈춥니다. CloudNativePG는 그 대신 rolling update로 인스턴스를 하나씩 교체해 서비스 중단을 최소화합니다.
핵심 원칙은 단순합니다. replica부터 하나씩 바꾸고, primary는 맨 마지막에 switchover로 넘깁니다. 읽기 트래픽은 살아 있는 다른 인스턴스가 받고, 쓰기 중단은 primary가 교체되는 짧은 switchover 순간으로 국한됩니다.
무엇이 rolling update를 부르나
다음 변화가 감지되면 Operator가 rolling update를 시작합니다.
imageName변경 (예: PostgreSQL 마이너 버전 업).spec.postgresql.extensionsstanza 변경- Image Catalog에 해당 major 버전의 새 이미지가 올라옴
- restart가 필요한 PostgreSQL 설정 변경
.spec.resources값 변경- Operator 업그레이드 (in-place instance manager 업데이트가 켜져 있지 않은 경우)
교체 순서
Operator는 serial 번호가 가장 높은 replica부터 한 번에 pod 하나씩 올려 나가고, primary는 가장 마지막에 처리합니다. pod는 삭제 후 재생성되지만 PVC는 그대로 유지되므로, 데이터를 다시 clone하지 않고 같은 CloudNativePG 신원을 유지한 채 이미지만 갈아 끼웁니다.
primaryUpdateStrategy: primary를 언제 넘길까
replica 교체가 끝난 뒤 primary를 어떻게 처리할지는 primaryUpdateStrategy가 정합니다.
unsupervised
unsupervised (기본값) — 전 과정이 자동입니다. replica 업그레이드가 끝나면 primaryUpdateMethod가 알아서 실행되어 primary까지 교체합니다. 대부분의 환경에 적합합니다.
supervised
supervised — replica 업그레이드까지만 하고 멈춘 뒤, primary 전환은 DBA의 수동 개입을 기다립니다. 전환 시점을 트래픽이 적은 시간대로 직접 고르고 싶을 때 씁니다.
primaryUpdateMethod: 재시작이냐 switchover냐
primary를 실제로 교체하는 방식은 primaryUpdateMethod가 정합니다.
restart(기본값): primary pod를 그 자리에서 재시작합니다. 재시작이 실패하면 switchover로 넘어갑니다.switchover: 가장 앞선 replica를 새 primary로 승격한 뒤 옛 primary pod를 내립니다.
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: cluster-example
spec:
instances: 3
primaryUpdateStrategy: unsupervised
primaryUpdateMethod: switchover
storage:
size: 1Gi
switchover를 쓸 때는 이미지 이름과 PostgreSQL 설정 파라미터를 동시에 바꿀 수 없습니다. 둘을 한 번에 바꾸려 하면 안 되고, 순서를 나눠 차례로 적용해야 합니다.
restart와 switchover, 언제 무엇을
restart는 primary가 재시작되는 동안 짧게 쓰기가 멈추지만 primary가 그대로 유지됩니다. switchover는 primary 역할이 다른 pod로 넘어가므로, 승격이 끝나는 순간 클라이언트가 새 primary로 다시 연결합니다. 둘 다 무중단을 지향하지만 쓰기가 끊기는 짧은 구간은 존재하므로, 애플리케이션은 연결 재시도(retry)를 갖춰 두는 편이 안전합니다.
여러 Cluster가 한 번에 대상이 될 때
Operator를 업그레이드하면 그 Operator가 관리하는 모든 Cluster의 인스턴스 매니저를 새 버전으로 맞춰야 하므로, 여러 Cluster가 동시에 rolling update 대상이 됩니다. 기본값에서는 모든 Cluster의 pod 교체가 함께 시작되어 노드 I/O가 몰리고, 여러 Cluster의 primary 재시작이 같은 시간대에 겹칩니다.
이 동시성은 Operator 설정(3.3)의 두 값으로 늦춥니다. 단위는 초, 기본값은 둘 다 0입니다.
| 설정 | 의미 |
|---|---|
CLUSTERS_ROLLOUT_DELAY | 한 Cluster의 rollout을 시작한 뒤 다른 Cluster를 시작하기까지 최소 대기. Cluster 간 시차 |
INSTANCES_ROLLOUT_DELAY | 한 Cluster 안에서 pod 하나를 교체한 뒤 다음 pod을 교체하기까지 최소 대기. 재시작한 인스턴스가 캐시를 다시 채울 시간 |
CLUSTERS_ROLLOUT_DELAY를 60으로 두면 Cluster들이 1분 간격으로 직렬화됩니다. 대기는 전체 업그레이드 시간을 늘리는 대신 한 시점에 흔들리는 Cluster 수를 하나로 줄입니다. 멀티 테넌트 클러스터라면 켜 두는 편이 안전합니다.
정리
rolling update는 replica부터 한 번에 하나씩 교체하고 primary를 마지막에 처리해 중단을 최소화합니다. 이미지·extension·restart 필요 설정·resource 변경·Operator 업그레이드가 이 과정을 촉발합니다.
primaryUpdateStrategy: primary 전환을 자동(unsupervised)으로 둘지 수동(supervised)으로 둘지primaryUpdateMethod: primary를 재시작(restart)할지 switchover할지 —switchover시 이미지와 설정 동시 변경은 금지