DBAtlas · 데이터베이스 운영 아틀라스

GitOps 및 blue-green / 무중단 배포

증상

목표: 다운타임 없이 스키마와 애플리케이션 변경을 배포한다. expand-contract 마이그레이션, blue-green 환경, feature flag, 자동 롤백으로 무중단에 근접한다.

1. GitOps: Git을 단일 진실 공급원으로 만든다

인프라, 스키마 마이그레이션, 애플리케이션 버전을 Git에 정의한다. 배포는 저장소로의 merge로 트리거된다(GitOps). reconciler(Argo CD/Flux 또는 CI/CD)가 원하는 상태를 실제 환경에 적용한다. 그러면 모든 변경은 감사 가능하고 반복 가능하며 필요시 이전 커밋으로 되돌릴 수 있다.

PostgreSQL

# repo/
#   migrations/  (Vxxx__*.sql)
#   k8s/         (Deployment, Service)
#   flags/       (feature flag config)

2. 스키마를 하위 호환되게 변경한다(expand-contract)

무중단을 위해 스키마를 한 번에 깨지는 방식으로 바꾸지 말고 두 단계로 나눈다. EXPAND: 구 코드와 신 코드가 동시에 실행될 수 있도록 새 구조(새 컬럼/테이블)를 추가한다(nullable 컬럼, 기본값 포함, 이중 쓰기). 애플리케이션이 새 구조로 이전한 후 CONTRACT: 더 이상 쓰지 않는 이전 컬럼/테이블을 별도 마이그레이션에서 삭제한다. 그러면 배포 중 구·신 애플리케이션 버전이 문제없이 나란히 실행된다.

PostgreSQL

-- EXPAND (V5): backward-compatible addition
ALTER TABLE customer ADD COLUMN email text;

-- for a while the code writes/reads both columns

-- CONTRACT (V9): drop the old column
ALTER TABLE customer DROP COLUMN mail_old;

3. 위험한 동작은 feature flag 뒤에 둔다

새 코드 경로(예: 새 컬럼 읽기)를 feature flag 뒤에서 조건부로 실행한다. 스키마가 준비되면 flag를 켜고, 문제가 생기면 배포를 건드리지 않고 끈다. flag는 코드 배포(deploy)와 기능 활성화(release)를 분리한다. expand 단계는 배포되지만 동작 변경은 통제된 방식으로 활성화되며 빠르게 되돌릴 수 있다.

PostgreSQL

-- application layer (pseudocode)
-- if flag('new_email_field'):
--     SELECT email FROM customer ...
-- else:
--     SELECT mail_old FROM customer ...

4. blue-green 환경을 구성한다

동일한 두 환경을 유지한다: 'blue'(운영)와 'green'(새 버전). 새 애플리케이션 버전을 green에 배포하고 실제 트래픽을 받기 전에 검증한다. 준비되면 라우터/트래픽을 green으로 전환한다. 핵심: 데이터베이스는 대개 공유되므로 스키마는 두 버전 모두와 호환되어야 한다(expand-contract가 이를 보장). 전환 시 연결 대상이 바뀌어도 스키마가 호환되므로 다운타임이 없다.

PostgreSQL

# traffic is switched to green (new version)
# shared DB: schema must be compatible with both blue and green

5. 모니터링으로 배포를 검증한다(canary/관찰)

전체 트래픽을 전환하기 전에 오류율, 지연, 데이터베이스 오류/락 수, 복제 지연 같은 지표를 모니터링한다. 선택적으로 트래픽의 일부(canary)를 green으로 보내 관찰한다. 상태 지표가 양호하면 트래픽을 점진적으로 늘리고, 나쁘면 진행하지 않는다. 모니터링은 자동 롤백 결정의 입력이다.

PostgreSQL

-- live health queries
SELECT count(*) FROM pg_stat_activity WHERE wait_event_type='Lock';
SELECT * FROM pg_stat_replication;

6. 자동 롤백을 준비한다

지표가 임계값을 넘으면 배포는 자동으로 롤백되어야 한다: blue-green에서는 트래픽을 빠르게 blue(이전 버전)로 되돌린다. blue가 여전히 실행 중이므로 애플리케이션 롤백은 즉시 이루어진다. 스키마 측에서는 대개 롤백이 필요 없다: expand-contract 덕분에 새 스키마가 이전 코드와도 호환되므로 애플리케이션 롤백만으로 충분하다. 그래서 스키마 변경은 애플리케이션 배포와 독립적이어야 하며 항상 하위 호환되어야 한다.

PostgreSQL

# traffic instantly returns to blue (application rollback)
# schema is not rolled back: expand-contract is compatible with old code
# if truly needed: write a new corrective migration
DBAtlas에서 열기 →