[Cloud] 무중단 마이그레이션 계획서 - 100-hours-a-week/9-team-Devths-WIKI GitHub Wiki

현재 작성중인 문서입니다. V2 컨테이너화 전환 상황에, 트래픽 발생 중에도 무중단으로 마이그레이션 할 수 있도록 상황을 상정하여 전환 절차를 계획한 문서입니다.


개요

단일 인스턴스에서 운영중인 전체 서비스(Nginx, BE, FE, AI, DB)를 무중단으로 컨테이너(Docker) 및 Managed DB(RDS)로 마이그레이션 하는 것을 목적으로 하는 계획서를 작성한다.

조건

마이그레이션 조건은 아래와 같다.

  1. 무중단으로 진행한다.
    • 서비스의 중단으로 인해 사용자가 영향을 받지 않고 이용할 수 있어야 한다.
  2. 안정성을 우선으로 한다.
    • 무중단 마이그레이션 진행으로 인해 데이터 누락, 오류, 과도한 응답 지연 등이 발생하지 않아야한다.
    • 실시간으로 변경되는 데이터까지 유실 없이 이관되어야한다.
  3. 트래픽 전환은 기존 요청을 끊지 않고 완료 후 진행하도록 한다.
    • 전환 직전에 요청을 보낸 사용자는 요청이 누락되어 UX가 저하된다.

순서

위 조건을 충족시키는 마이그레이션을 진행하기 위해 다음과 같은 순서로 마이그레이션 절차를 진행한다.

  1. 서비스 별 마이그레이션 계획 수립
  2. 계획에 대한 피드백 및 수정
  3. 개발 및 스테이징 서버 대상 순차적 마이그레이션 진행
  4. 문제 해결 및 보완
  5. 최종 운영서버 대상 마이그레이션 진행

서비스 별 마이그레이션 계획 수립

인프라 아키텍처

인프라

  • 현재 트래픽 흐름은 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: 일시적으로 중단이 불가피하므로 부적절하다 판단.
  • 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 버전을 확인 후 일치시켜 이슈 발생 방지
    • 보안 그룹 설정 필수

애플리케이션

  • 개별 실행으로 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
      • 마이그레이션 중 생성된 데이터가 누락되지 않도록 별도 로직 추가 필요

로그 및 파일 관리

  • 로그: 파일로 출력 후 외부 로깅 시스템으로 비동기 전송 및 모니터링
  • 파일: 서비스에 필요한 파일 대부분 S3로 저장중. 고려사항 없음

모니터링

트래픽 전환

전환 계획

  • 트래픽 전환
    • 점진적 롤아웃을 통해 단계적 확대를 진행 할 필요성
  • 전환 시나리오:
    1. Target Group A (기존 EC2): 100% / Target Group B (새 컨테이너): 0%
    2. Target Group B 헬스 체크 통과 확인.
    3. Target Group A: 90% / Target Group B: 10% (로그 모니터링, 에러율 확인)
    4. 안정화 및 모니터링을 통한 검증
    5. Target Group A: 0% / Target Group B: 100%
    6. 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=logicalmax_replication_slots 확보) 및 재시작.

데이터 동기화(DB)

  • EC2(Publisher) -> RDS(Subscriber) 논리적 복제 연결.(Native Logical Replication)
  • 실시간 데이터 동기화 상태 모니터링.

환경별 전환 내용

개발 서버

  • 별도의 무중단 계획을 실행하지 않고, 중단을 통해 개발 서버의 컨테이너화 진행. 개발자들이 컨테이너화 된 환경에서 개발 및 테스트를 진행할 수 있도록 지원
  • 환경변수 주입, 빌드 레이어, 등 무중단을 위한 조건 검토 필수
  • 중단 시점에 DB 데이터 이관 및 전환, 환경변수 수정, ALB 설정, 별도 환경 설정 진행

스테이징 서버

  • 무중단 전환 배포 및 마이그레이션 계획이 정상적으로 동작하는지 점검하는 단계
  • 실제 운영 환경에서 무중단 하는 것을 모사하는 상황을 상정하고 진행.
  • 인위적으로 만들어진 트래픽을 주입하며 전환을 진행하여 데이터 및 트래픽 누락에 대한 정보 확인 필요
  • 전환중에도 모니터링이 가능하도록 별도의 모니터링 서버 구축 필수

운영 서버

  • 실제 운영 환경에도 컨테이너화 서버로 전환 배포 필요

Cut-Over(전환)프로세스

다중화

  • 단일 인스턴스 컨테이너화 배포 이후 다중 인스턴스로 분리하여 서비스 유연성을 높일 수 있도록 수정