데이터베이스 마이그레이션 전략
프로덕션 환경에서 데이터베이스 스키마를 변경하는 것은 가장 위험한 작업 중 하나입니다. 무중단 서비스를 유지하면서 안전하게 마이그레이션하는 전략을 살펴봅니다.
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-Green | Rolling |
|---|---|---|
| 다운타임 | 거의 없음 (전환 순간) | 없음 |
| 롤백 속도 | 매우 빠름 (트래픽 전환) | 느림 (단계별 롤백) |
| 리소스 비용 | 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