데이터베이스 마이그레이션 전략: 무중단(Zero-downtime), 롤백(Rollback) 및 테스트
요약
데이터베이스 마이그레이션 시 발생할 수 있는 다운타임과 데이터 손실 위험을 최소화하기 위한 전략을 다룹니다. 멱등성 확보, 하위 호환성 유지, Expand-Migrate-Contract 패턴 활용 등 안전한 운영을 위한 구체적인 가이드를 제공합니다.
핵심 포인트
- 멱등성을 보장하여 실패 시 안전한 재시도 가능하도록 설계
- 운영 데이터 클론을 활용한 사전 테스트 필수
- Expand-Migrate-Contract 패턴으로 하위 호환성 유지
- 테이블 잠금을 최소화하기 위한 단계적 컬럼 업데이트
- 명확한 롤백 계획 수립 및 문서화
데이터베이스 마이그레이션 전략: 무중단(Zero-downtime), 롤백(Rollback) 및 테스트
데이터베이스 마이그레이션(Database migrations)은 애플리케이션 개발에서 가장 위험한 작업 중 하나입니다. 잘못된 마이그레이션은 다운타임(Downtime), 데이터 손실 또는 성능 저하를 초래할 수 있습니다. 마이그레이션에 대한 체계적인 접근 방식은 이러한 위험을 최소화합니다.
멱등성(Idempotent)이 있는 마이그레이션을 작성하세요. 마이그레이션은 처음 실행하든 열 번째 실행하든 동일한 결과를 생성해야 합니다. 지원되는 경우 IF NOT EXISTS, IF EXISTS, CREATE OR REPLACE를 사용하세요. 이를 통해 실패 후에도 안전하게 재시도할 수 있습니다.
운영 데이터(Production data)의 복사본을 대상으로 마이그레이션을 테스트하세요. 개발 데이터베이스에서 통과한 마이그레이션이라도 예상하지 못한 데이터 패턴으로 인해 운영 환경에서는 실패할 수 있습니다. 익명화된 운영 데이터나 운영 환경의 클론(Clone)을 사용하여 테스트하세요.
하위 호환성(Backward-compatible)이 있는 스키마 변경을 구현하세요. 단일 마이그레이션에서 컬럼(Column)을 삭제하거나 테이블(Table)의 이름을 변경하지 마세요. 대신, 먼저 새 컬럼을 추가하고, 애플리케이션이 기존 컬럼과 새 컬럼 모두에 데이터를 쓰도록 업데이트한 다음, 이후 배포에서 기존 컬럼을 삭제하세요.
복잡한 변경에는 확장-마이그레이션-축소(Expand-migrate-contract) 패턴을 사용하세요. 1단계: 기존 모델과 새 모델을 모두 지원하도록 스키마를 확장(Expand)합니다. 2단계: 기존 데이터를 마이그레이션(Migrate)하고 모든 코드 경로를 업데이트합니다. 3단계: 기존 스키마 요소를 축소(Contract)하여 제거합니다. 각 단계는 별도의 배포로 이루어집니다.
필요한 경우에만 테이블 잠금(Lock)을 수행하세요. 기본값(Default value)이 있는 컬럼을 추가하는 것과 같은 일반적인 마이그레이션 작업은 PostgreSQL에서 테이블을 잠급니다. 기본값 없이 컬럼을 추가하고, 배치(Batch) 단위로 업데이트한 다음, 나중에 기본값을 설정하는 기술을 사용하세요.
고가용성(High-availability) 서비스의 경우 애플리케이션 시작 시점이 아닌 외부에서 마이그레이션을 실행하세요. 전용 마이그레이션 러너(Migration runner)를 사용하거나, 새 코드를 배포하기 전에 마이그레이션을 실행하는 배포 파이프라인(Deployment pipeline)을 사용하세요.
명확한 롤백(Rollback) 단계를 포함하여 마이그레이션 계획을 문서화하세요. 모든 마이그레이션에는 테스트된 롤백 스크립트가 있어야 합니다. 마이그레이션이 얼마나 걸릴지, 그리고 얼마나 많은 잠금(Lock)이 발생할지 파악하세요. 예정된 마이그레이션에 대해 팀과 소통하세요.
Rizwan Saleem | https://rizwansaleem.co
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기