본문 바로가기
Backend2025년 12월 12일5분 읽기

데이터베이스 마이그레이션 전략 — Blue-Green과 Rolling 비교

YS
김영삼
조회 358

데이터베이스 마이그레이션 전략

프로덕션 환경에서 데이터베이스 스키마를 변경하는 것은 가장 위험한 작업 중 하나입니다. 무중단 서비스를 유지하면서 안전하게 마이그레이션하는 전략을 살펴봅니다.

Blue-Green 배포 전략

두 개의 동일한 환경(Blue/Green)을 유지하고, 새 버전을 Green에 배포한 후 트래픽을 전환하는 방식입니다.

-- Blue-Green DB 마이그레이션 절차

-- 1단계: Green DB에 새 스키마 적용
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
CREATE INDEX idx_users_phone ON users(phone);

-- 2단계: 데이터 동기화 (CDC 또는 Trigger 활용)
CREATE OR REPLACE FUNCTION sync_to_green()
RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO green_db.users
  SELECT * FROM blue_db.users
  WHERE id = NEW.id
  ON CONFLICT (id) DO UPDATE SET ...;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

-- 3단계: 트래픽 전환
-- DNS 또는 로드밸런서에서 Green으로 전환
-- 4단계: 검증 후 Blue 정리

Rolling 업데이트 전략

점진적으로 하나씩 노드를 업데이트하는 방식으로, 전체 시스템의 가용성을 유지합니다.

-- Rolling 마이그레이션: 하위 호환성 유지가 핵심

-- Phase 1: 새 컬럼 추가 (기존 코드 호환)
ALTER TABLE orders ADD COLUMN status_v2 VARCHAR(30);

-- Phase 2: 양쪽 컬럼에 동시 쓰기 (듀얼 라이트)
-- 애플리케이션 코드 수정
UPDATE orders SET
  status = 'completed',
  status_v2 = 'COMPLETED'
WHERE id = $1;

-- Phase 3: 새 컬럼에서 읽기 전환
SELECT status_v2 FROM orders WHERE id = $1;

-- Phase 4: 이전 컬럼 제거 (모든 노드 업데이트 완료 후)
ALTER TABLE orders DROP COLUMN status;

전략 비교

항목Blue-GreenRolling
다운타임거의 없음 (전환 순간)없음
롤백 속도매우 빠름 (트래픽 전환)느림 (단계별 롤백)
리소스 비용2배 (두 환경 유지)기존과 동일
복잡도인프라 복잡코드 복잡
데이터 동기화필요 (CDC 등)불필요
적합한 경우대규모 스키마 변경점진적 변경

Expand-Contract 패턴

Rolling 마이그레이션의 핵심 패턴으로, 3단계에 걸쳐 안전하게 스키마를 변경합니다.

-- Expand: 새 구조 추가
ALTER TABLE products ADD COLUMN price_cents BIGINT;

-- Migrate: 데이터 이전 (배치)
UPDATE products SET price_cents = price * 100
WHERE price_cents IS NULL
LIMIT 10000; -- 배치 처리

-- Contract: 이전 구조 제거
ALTER TABLE products DROP COLUMN price;
ALTER TABLE products RENAME COLUMN price_cents TO price;

마이그레이션 자동화 도구

  • Flyway: 버전 기반 SQL 마이그레이션, Java/JVM 생태계
  • Liquibase: XML/YAML/SQL 지원, 롤백 자동화
  • gh-ost: GitHub의 MySQL 온라인 스키마 변경 도구
  • pt-online-schema-change: Percona의 대규모 테이블 변경 도구
  • Prisma Migrate: TypeScript 기반, 선언적 스키마 관리

안전한 마이그레이션 체크리스트

  • 마이그레이션 전 반드시 백업 수행
  • 스테이징 환경에서 프로덕션과 동일한 데이터 볼륨으로 테스트
  • 대규모 테이블 변경 시 배치 처리 적용
  • 하위 호환성 유지: 새 코드가 이전 스키마에서도 동작하도록
  • 롤백 계획 수립 및 테스트 완료 확인

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록