[Cloud] 무중단 마이그레이션 계획서 - 100-hours-a-week/9-team-Devths-WIKI GitHub Wiki
현재 작성중인 문서입니다. V2 컨테이너화 전환 상황에, 트래픽 발생 중에도 무중단으로 마이그레이션 할 수 있도록 상황을 상정하여 전환 절차를 계획한 문서입니다.
개요
단일 인스턴스에서 운영중인 전체 서비스(Nginx, BE, FE, AI, DB)를 무중단으로 컨테이너(Docker) 및 Managed DB(RDS)로 마이그레이션 하는 것을 목적으로 하는 계획서를 작성한다.
조건
마이그레이션 조건은 아래와 같다.
- 무중단으로 진행한다.
- 서비스의 중단으로 인해 사용자가 영향을 받지 않고 이용할 수 있어야 한다.
- 안정성을 우선으로 한다.
- 무중단 마이그레이션 진행으로 인해 데이터 누락, 오류, 과도한 응답 지연 등이 발생하지 않아야한다.
- 실시간으로 변경되는 데이터까지 유실 없이 이관되어야한다.
- 트래픽 전환은 기존 요청을 끊지 않고 완료 후 진행하도록 한다.
- 전환 직전에 요청을 보낸 사용자는 요청이 누락되어 UX가 저하된다.
순서
위 조건을 충족시키는 마이그레이션을 진행하기 위해 다음과 같은 순서로 마이그레이션 절차를 진행한다.
- 서비스 별 마이그레이션 계획 수립
- 계획에 대한 피드백 및 수정
- 개발 및 스테이징 서버 대상 순차적 마이그레이션 진행
- 문제 해결 및 보완
- 최종 운영서버 대상 마이그레이션 진행
서비스 별 마이그레이션 계획 수립
인프라 아키텍처
인프라
- 현재 트래픽 흐름은
Route53 → EC2구조. 변경 후 구조는Route53 → ALB → EC2로 전환 필요. - DNS 변경은 전파 시간(TTL)이 걸리므로, 일시적으로 중단 발생 가능성.
- 따라서 마이그레이션 이전에 인프라 변경 필요.
- ALB 선행 도입
- SSL/TLS 인증서 이관
네트워크
- 트래픽 전환을 시킬 주체
- 기존에는 Route53 → EC2 인스턴스 → Nginx → 개별 서비스 로 분산되는 구조
- 트래픽 분배를 위한 ALB 도입 필수
- Strangler Fig 패턴을 통해 네트워크 앞단을 먼저 교체 한 후 뒷단을 교체하는 방식
DB
- 컨테이너화(Docker) 및 추후 다중 인스턴스 적용을 위해 DB 분리 최우선 시행
- 즉시 트래픽을 전환하지 않고 데이터 정합성 유지 방안 필요
- CDC(실시간 복제) 툴 사용 (AWS DMS 등)
- PostgreSQL은 WAL(Write-ahead Logging)에 모든 변경작업을 기록
- DB 연결이 바뀌기까지 CDC 이벤트를 DMS 등에 넣어 큐 역할을 하고 일관성을 유지
- PostgreSQL의 pub/sub 기능을 이용하여 EC2 → RDS 로 Native Replication
Dump & Restore: 일시적으로 중단이 불가피하므로 부적절하다 판단.
- CDC(실시간 복제) 툴 사용 (AWS DMS 등)
- Cut Over(전환) 시점
- 데이터 동기화 100% 완료 시점에 애플리케이션 배포를 통한 DB 주소 변경 필요
- 고려사항
- Sequence 동기화 필요:
AUTO_INCREMENT값을 맞추지 않고 데이터만 옮기면 전환 후 해당 컬럼 포함 테이블 관련 오류 발생(Primary Key Duplicated) ( https://github.com/100-hours-a-week/9-team-Devths-WIKI/issues/206) - 로컬 PostgreSQL 버전과 RDS 버전을 확인 후 일치시켜 이슈 발생 방지
- 보안 그룹 설정 필수
- Sequence 동기화 필요:
애플리케이션
- 개별 실행으로 EC2 상에서 돌아가던 서비스(BE, FE, AI)를 컨테이너로 묶어 진행
- 컨테이너화 계획은 해당 문서(https://github.com/100-hours-a-week/9-team-Devths-WIKI/wiki/Docker) 참고
- 컨테이너 오케스트레이션 방식
- Docker Compose(선택)
- AWS ECS
- 이미지 저장소
- ECR 사용
- 어플리케이션 별 컨테이화 배포 점검 포인트
- BE
- 환경변수 정상 주입 확인
- JWT를 사용하므로 별도의 온메모리 DB 등의 세션 저장 로직 필요 없음
- FE
- 컨테이너화 빌드 시점에 필요한 환경변수 포함 확인
- AI
- 모델 포함 및 볼륨 마운트 고려 (컨테이너 실행 시점에 AI 모델 다운로드 시 부팅 오래 걸릴 가능성)
- EC2 상에 해당 의존성 미리 다운로드 후 Docker 실행 시점에 마운트 필요(S3에 업로드 후 컨테이너 시작 시 Entrypoint에서 다운로드)
- 추후 다중 인스턴스 전환 시 EFS 등을 사용하여 확장성 확보 가능
- DB
- 마이그레이션 중 생성된 데이터가 누락되지 않도록 별도 로직 추가 필요
- BE
로그 및 파일 관리
- 로그: 파일로 출력 후 외부 로깅 시스템으로 비동기 전송 및 모니터링
- 파일: 서비스에 필요한 파일 대부분 S3로 저장중. 고려사항 없음
모니터링
트래픽 전환
전환 계획
- 트래픽 전환
- 점진적 롤아웃을 통해 단계적 확대를 진행 할 필요성
- 전환 시나리오:
Target Group A(기존 EC2): 100% /Target Group B(새 컨테이너): 0%Target Group B헬스 체크 통과 확인.Target Group A: 90% /Target Group B: 10% (로그 모니터링, 에러율 확인)- 안정화 및 모니터링을 통한 검증
Target Group A: 0% /Target Group B: 100%Target Group A제거 (Draining).
Fall Back 계획
- 무중단 마이그레이션 시 언제든지 되돌릴 수 있다는 대 원칙을 전제.
- 전환 배포 실패 시 단순 DNS 롤백만으로는 점진적 전환 상황에서 에러 발생 가능. 전환 상황에 맞게 롤백 할 수 있도록 대응 필요
- Graceful Shutdown을 통해 진행중인 요청을 끊지 않고 종료해야 누락되는 정보 없이 처리 가능
- APP 이슈 시: ALB 가중치를 즉시 기존 EC2로 원복 하여 복구
- DB 이슈 시: RDS 전환 시 문제 발생한 경우 기존 DB로 변경하여 복구
- 복구 불능 지점: RDS로 전환 후 쓰기 트래픽이 발생 한 시점부터는 즉시 롤백 불가능. 중단 및 수정 후 배포 필요.
배포 진행 과정
사전 준비(인프라)
- RDS, ECR, ALB 생성 및 설정
- ALB에 SSL적용 및 Target Group 을 기존 EC2로 설정
- DNS 변경(Route53이 ALB를 가리키도록 변경)
- EC2 PostgreSQL 설정 변경 (
wal_level=logical,max_replication_slots확보) 및 재시작.
데이터 동기화(DB)
- EC2(Publisher) -> RDS(Subscriber) 논리적 복제 연결.(Native Logical Replication)
- 실시간 데이터 동기화 상태 모니터링.
환경별 전환 내용
개발 서버
- 별도의 무중단 계획을 실행하지 않고, 중단을 통해 개발 서버의 컨테이너화 진행. 개발자들이 컨테이너화 된 환경에서 개발 및 테스트를 진행할 수 있도록 지원
- 환경변수 주입, 빌드 레이어, 등 무중단을 위한 조건 검토 필수
- 중단 시점에 DB 데이터 이관 및 전환, 환경변수 수정, ALB 설정, 별도 환경 설정 진행
스테이징 서버
- 무중단 전환 배포 및 마이그레이션 계획이 정상적으로 동작하는지 점검하는 단계
- 실제 운영 환경에서 무중단 하는 것을 모사하는 상황을 상정하고 진행.
- 인위적으로 만들어진 트래픽을 주입하며 전환을 진행하여 데이터 및 트래픽 누락에 대한 정보 확인 필요
- 전환중에도 모니터링이 가능하도록 별도의 모니터링 서버 구축 필수
운영 서버
- 실제 운영 환경에도 컨테이너화 서버로 전환 배포 필요
Cut-Over(전환)프로세스
다중화
- 단일 인스턴스 컨테이너화 배포 이후 다중 인스턴스로 분리하여 서비스 유연성을 높일 수 있도록 수정