이 글에서 얻는 것
- “컷오버”를 단발성 이벤트가 아니라, 검증 가능한 전환 과정으로 설계할 수 있습니다.
- Shadow/Canary/키 기반 분할 같은 트래픽 전환 패턴을 상황별로 선택할 수 있습니다.
- 데이터 마이그레이션(Backfill, Dual-write, CDC)의 핵심 함정(중복/순서/충돌/롤백)을 이해하고 설계 포인트가 생깁니다.
0) 컷오버는 ‘스위치’가 아니라 ‘프로세스’다
전환은 두 가지가 동시에 필요합니다.
- 전환 중 문제가 생기면 즉시 되돌릴 수 있어야 하고(rollback),
- 전환이 성공했음을 지표로 증명할 수 있어야 합니다(validation).
이걸 만족하려면 “트래픽”과 “데이터”를 분리해서 봐야 합니다.
1) 트래픽 전환 패턴 4가지
1-1) Big Bang(일괄 전환)
- 장점: 단순
- 단점: 실패 시 충격이 크고, 원인 분리가 어렵다
가급적 “작은 기능/작은 도메인”에서만 권장됩니다.
1-2) Canary(비율/그룹 전환)
- 일부 사용자/트래픽만 새 경로로 전환하며 관측
- 실패 시 영향이 제한되고 롤백이 빠름
1-3) Shadow/Mirroring(미러링)
- 실제 트래픽을 새 시스템에도 보내되, 응답은 버리거나 비교만 함
- 안정성을 확인하기 좋지만, 쓰기(부작용)가 있는 요청은 조심해야 합니다
1-4) Key-based Split(키 기준 분할)
- 사용자/테넌트/리소스 키로 라우팅을 분할
- 특정 그룹을 “완전히” 새 시스템으로 옮기기 쉬움(이후 확대)
2) 안전한 컷오버의 전제 3가지
- 관측성: 요청 단위로 새/구 경로를 구분할 수 있어야 함(예: 라우팅 버전 태그, traceId)
- 비교: 결과가 같아야 한다면 비교 지표/샘플링 기준이 있어야 함
- 롤백 스위치: 라우팅을 즉시 되돌릴 수 있어야 함(피처 플래그/라우팅 룰)
3) 데이터 마이그레이션: 가장 흔한 3가지 조합
3-1) Backfill + Read switch(읽기 전환)
- 먼저 새 저장소에 데이터를 채운다(backfill)
- 읽기만 새 저장소로 전환한다
- 쓰기는 기존에 남겨두거나, 이후에 따로 전환한다
장점: 안전. 단점: “읽기 일관성”을 맞추려면 동기화 전략이 필요.
3-2) Dual Write(이중 쓰기)
동시에 두 저장소에 씁니다.
- 장점: 전환이 빠르고, 읽기 전환이 쉬움
- 단점: 실패/지연/중복/순서 문제를 반드시 다뤄야 함
실무에서는 “동일 트랜잭션에서 두 곳에 쓰기”가 어려운 경우가 많아, Outbox/이벤트 기반으로 일관성을 설계하는 케이스가 많습니다.
3-3) CDC(Change Data Capture)
DB 변경 로그(binlog/WAL 등)를 읽어 새 저장소로 반영합니다.
- 장점: 애플리케이션 코드 변경이 상대적으로 적음
- 단점: 스키마 변화/순서/재처리/운영 복잡도가 있음
4) 충돌/순서/중복: 전환에서 반드시 터지는 것들
전환 중에는 아래가 현실적으로 발생합니다.
- 같은 이벤트/요청이 두 번 처리된다(재시도, 네트워크)
- 순서가 뒤집힌다(비동기/큐)
- 한쪽은 성공하고 한쪽은 실패한다(부분 실패)
그래서 설계에서 자주 필요한 것:
- idempotency key(중복 처리 방지)
- 버전/타임스탬프 기반의 “마지막 쓰기 승리” 같은 충돌 전략
- 재처리(리플레이) 가능성(이벤트 로그/CDC 오프셋/재구동)
5) 롤백을 ‘데이터’까지 고려해 설계하라
트래픽 롤백은 보통 쉽습니다(라우팅을 되돌리면 됨). 하지만 데이터가 이미 새 저장소에만 쓰였으면 롤백이 어려워집니다.
그래서 전환 설계에서는:
- 일정 기간은 “구 시스템도 읽기 가능”하게 유지하거나,
- 데이터 브릿지(동기화)를 유지하거나,
- 전환 초기에 쓰기 기능을 제한하는 방식
같은 안전장치를 고민합니다.
6) 실행 런북(간단 템플릿)
- 사전: 백필 완료율/지연/에러율 지표 준비, 롤백 스위치 확인
- 전환: Shadow → Canary(1%→5%→25%) → Cutover(100%)
- 검증: 핵심 플로우 성공률, 데이터 정합성 샘플링, 지연/에러율
- 사후: 동기화 제거 시점 정의, 구 시스템/구 데이터 정리 계획
연습(추천)
- “사용자 프로필 저장소”를 예로 들어 Backfill + Read switch 시나리오를 설계해보기(지표/롤백 조건 포함)
- Dual-write가 필요한 상황을 가정하고, 중복/순서 문제를 어떤 키/버전으로 해결할지 정리해보기
- Shadow 트래픽에서 “응답 비교”를 어떻게 자동화할지(샘플링/비교 기준) 설계해보기
💬 댓글