V1 → V2 Staging 마이그레이션 4차 리허설 결과 보고서 - 100-hours-a-week/KTB4-4th-wiki GitHub Wiki

목차

  1. 개요
  2. 마이그레이션 구성
  3. 리허설 타임라인
  4. MySQL 마이그레이션 검증
  5. PostgreSQL 마이그레이션 검증
  6. Write Gate 및 Cutover 자동화 검증
  7. k6 Pre-Cutover 조회 부하 테스트
  8. ALB 전환 및 최종 라우팅 검증
  9. Post-Cutover Smoke Test
  10. 로그인 및 V2 쓰기 검증
  11. Write Freeze 지속 시간 및 개선 효과
  12. 모니터링 및 관측성 검증
  13. 발견된 문제 및 원인 분석
  14. 한계 및 미검증 항목
  15. 5차 최종 리허설 개선 계획
  16. 최종 결론

1. 개요

1.1 목적

3차 리허설에서 확인된 수동 Cutover 절차의 시간적 한계를 개선하기 위해 GitHub Actions 기반 자동화 워크플로우를 적용한다.

V1에서 V2 Staging 환경으로의 데이터베이스 및 트래픽 전환 과정에서 데이터 정합성, 쓰기 차단, 서비스 가용성, 전환 소요 시간 및 전환 이후 정상 동작 여부를 검증한다.

주요 검증 목표는 다음과 같다.

  1. MySQL DMS Full Load + CDC 기반 데이터 이전 및 최종 동기화
  2. PostgreSQL Dump/Restore 기반 데이터 이전 및 복원 상태 확인
  3. GitHub Actions Preflight 및 Cutover 자동화 검증
  4. Write Gate ON/OFF 동작 및 Write Freeze 120초 이내 달성
  5. ALB Target Group 가중치 기반 V1 → V2 전환
  6. 전환 전후 k6 조회 API 정상 동작 확인
  7. 전환 이후 로그인 및 V2 데이터베이스 쓰기 기능 검증
  8. 실제 전환 과정의 문제점 도출 및 5차 최종 리허설 개선사항 정리

1.2 리허설 환경

항목 내용
수행 일자 2026-10-18
대상 V1 → V2 Staging
V1 EC2 + Nginx + MySQL + PostgreSQL
V2 ALB + ECS(FE/BE/AI) + RDS MySQL/PostgreSQL
MySQL 이전 AWS DMS Full Load + CDC
PostgreSQL 이전 pg_dump / pg_restore
쓰기 차단 Staging ALB Write Gate
트래픽 전환 ALB Target Group 가중치 변경
대상 도메인 staging.needu.gift
자동화 GitHub Actions Staging Migration Preflight / Cutover
부하 테스트 k6, 10 RPS / 5분
A 담당 Cindy — DMS, MySQL, PostgreSQL, ECS, 데이터 정합성
B 담당 Mond — k6, Cutover 실행, ALB/Write Gate 확인, Smoke Test

1.3 최종 검증 결과

검증 항목 결과 판정
Staging Preflight PASS PASS
Cutover Workflow Job Success PASS
MySQL DMS Full Reload 및 CDC 실행 확인 PASS
PostgreSQL Staging 복원 및 Preflight 통과 PASS
Write Gate ON/OFF 정상 실행 PASS
Write Freeze 59초 / 목표 120초 PASS
ALB Backend V1 0% / V2 100% PASS
ALB Frontend V1 0% / V2 100% PASS
Write Gate 최종 상태 OFF PASS
Pre-Cutover k6 3,001건, HTTP 실패율 0% PASS
Post-Cutover k6 4건, Checks 8/8 PASS
Frontend Smoke /login HTTP 200 PASS
로그인 SQL 수정 이후 정상 동작 확인 수정 후 PASS
최종 DB 데이터 정합성 최종 검증 상세 결과 미확보 확인 필요
실제 Cutover 중 읽기 서비스 중단 여부 지속 측정 미수행 미검증
RPO 0 성공한 쓰기 요청 전수 대조 미수행 미검증

종합 판정: Cutover 자동화 및 Write Freeze 목표 달성 / 전환 전후 FE·BE 검증 PASS / DB 최종 정합성 및 Cutover 중 가용성 추가 확인 필요


2. 마이그레이션 구성

2.1 V1 환경

  • 단일 EC2 기반 서비스
  • Nginx HTTP 라우팅
  • Frontend, Backend, AI Server 실행
  • MySQL 및 PostgreSQL 직접 설치
  • AWS DMS를 통한 MySQL CDC 소스
  • ALB Target Group을 통한 V1 트래픽 연결

2.2 V2 Staging 환경

  • 공통 ALB 기반 트래픽 수신
  • ECS Frontend / Backend / AI Server
  • RDS MySQL 및 PostgreSQL
  • MySQL DMS Full Load + CDC
  • PostgreSQL Dump/Restore
  • Staging ALB Write Gate
  • GitHub Actions 기반 Preflight / Cutover 자동화

2.3 3차 대비 변경 사항

항목 3차 4차
Cutover 수동 단계별 실행 GitHub Actions 자동화
Preflight 수동 상태 확인 재사용 가능한 자동 검증
Write Gate 수동 제어 Cutover Workflow에서 제어
DMS 중지 수동 명령 자동 중지 및 상태 대기
MySQL 정책 변환 수동 SQL 실행 Cutover 자동화
ALB 전환 수동 자동
Gate OFF 수동 Target Health 확인 후 자동
Write Freeze 목표 초과 59초

2.4 자동화 워크플로우

관련 워크플로우는 다음과 같다.

  • Staging Migration Preflight
  • Staging Migration Cutover
  • Staging ALB Cutover
  • Staging Write Gate
  • Staging Runtime Control

4차에서는 Staging Migration Cutover 워크플로우를 실행했으며, Preflight PASS를 선행 조건으로 사용했다.


3. 리허설 타임라인

모든 시각은 KST 기준이다.

시각 단계 작업 및 결과
사전 준비 MySQL DMS Full Reload 완료 및 CDC 실행
사전 준비 PostgreSQL Staging RDS 복원 및 데이터 구조 검증
사전 준비 ECS V2 서비스 Healthy 확인
Cutover 이전 k6 10 RPS / 5분 조회 부하 테스트 완료
15:42:23 Preflight PASS
15:43:49 T0 Write Gate ON
15:43:49~15:44:48 Cutover V1 트랜잭션 확인, DMS 중지, MySQL 정책 변환, ALB 전환 및 Target Health 확인
15:44:48 T1 Write Gate OFF
Cutover 이후 Frontend / → /login, 최종 HTTP 200 확인
Cutover 이후 Backend k6 읽기 API 4건, Checks 8/8 성공
15:49경 로그인 로그인 문제 확인 및 원인 조사
15:52경 로그인 SQL 수정 후 정상 동작 확인
Cutover 이후 ALB FE/BE V2 100%, Write Gate OFF 확인

3.1 주요 소요 시간

측정 구간 소요 시간
Preflight 완료 → Gate ON 1분 26초
Gate ON → Gate OFF 59초
목표 Write Freeze 120초
목표 대비 여유 61초

Gate ON/OFF 시각은 GitHub Actions Job Summary 기준이다. 각 Cutover 내부 단계별 정확한 소요 시간은 별도 Step 로그가 필요하다.


4. MySQL 마이그레이션 검증

4.1 DMS Full Load 및 CDC

4차 리허설에서는 Staging MySQL 데이터를 초기화한 뒤 DMS Full Reload를 수행하고 CDC 복제를 유지했다.

Cutover 실행 이전에 DMS 상태 및 데이터 이전 조건을 점검했으며, Preflight가 PASS했다.

항목 결과
대상 DB V1 MySQL → V2 Staging RDS MySQL
마이그레이션 AWS DMS Full Load + CDC
대상 테이블 7개
Full Reload 완료 보고
CDC Cutover 이전 실행 확인
Preflight PASS
Cutover Job SUCCESS
DMS 최종 Validation 상세 값 별도 로그 확인 필요

4.2 Cutover 중 DMS 처리

Cutover 자동화에서는 다음 절차를 수행하도록 구성했다.

  1. Write Gate ON
  2. V1 MySQL 활성 트랜잭션 확인
  3. DMS 최종 CDC 및 Validation 상태 확인
  4. DMS 복제 작업 중지
  5. DMS Stopped 상태 대기
  6. V2 MySQL 정책 변환
  7. ALB 전환

전체 Cutover Job은 성공했다.

단, 개별 DMS Validation 수치 및 최종 소스·타깃 데이터 비교 결과는 Job 상세 로그와 DB 검증 결과를 통해 보완한다.

4.3 V2 MySQL 정책 변환

정책 변환은 Cutover 자동화 단계에서 실행하도록 구성했다.

  • 일반 사용자 ACTIVE → ONBOARDING
  • 일반 사용자 onboarding_completed / taste_analysis_completed 초기화
  • 테스트 사용자 ID 59~78은 ACTIVE 유지
  • 사용자 추천 및 분석 관련 데이터 초기화
  • 진행 중 AI 대화 상태 정리

Cutover Job은 성공했으나, 로그인 문제 발생 이후 MySQL 초기화 후 필수 SQL 실행 누락이 확인됐다.

따라서 Cutover 성공 여부와 별도로 최종 사용자 상태 및 로그인 관련 데이터가 기대값을 만족하는지 검증해야 한다.

4.4 검증 판정

DMS 및 Cutover 자동 실행: PASS

MySQL 최종 데이터 정합성: 별도 검증 결과 확인 필요

4.5 모니터링 증빙

[Grafana/CloudWatch 캡처 ① — DMS CDC Latency]

  • 조회 구간: 2026-10-18 15:35~15:50 KST
  • 지표: CDCLatencySource, CDCLatencyTarget
  • 확인 목적: Cutover 이전 CDC 지연 상태 및 DMS 중지 전후 변화 확인

5. PostgreSQL 마이그레이션 검증

5.1 Dump 및 Restore

V1 PostgreSQL 데이터를 Staging RDS PostgreSQL로 복원했다.

기존 Catalog 및 Embedding 데이터를 대상으로 pgvector 확장과 주요 DB 구조를 검증했다.

항목 결과
이전 방식 pg_dump / pg_restore
대상 V2 Staging RDS PostgreSQL
복원 파일 needu-vector-v3.dump
복원 완료 보고
Preflight PASS
pgvector 차원 1024
HNSW 인덱스 Preflight 검증 대상

5.2 데이터 행 수

복원 및 사전 검증에서 확인한 테이블 행 수는 다음과 같다.

테이블 확인된 행 수
catalog_embedding_models 1
catalog_product_documents 20,289
catalog_products 7,969
catalog_sync_runs 0

4개 테이블의 복원 상태를 확인했으며, Preflight도 PASS했다.

다만 이 수치는 사전 복원 검증 기준이다. Cutover 이후 최종 데이터 변경 여부와 V1/V2 값 단위 정합성은 별도 검증 결과가 필요하다.

5.3 검증 판정

PostgreSQL 복원 및 사전 구조 검증: PASS

Cutover 이후 최종 데이터 정합성: 확인 필요


6. Write Gate 및 Cutover 자동화 검증

6.1 적용 방식

4차에서는 Staging ALB Listener Rule을 사용해 쓰기 요청을 차단했다.

Cutover Workflow에서 Write Gate를 활성화한 후 데이터베이스 최종 동기화 및 트래픽 전환을 진행하고, Target Health 확인 후 Gate를 해제했다.

6.2 자동화 실행 순서

  1. Preflight PASS 확인
  2. Cutover 사전 조건 확인
  3. MySQL 연결 및 SSM 터널 준비
  4. Write Gate ON
  5. V1 MySQL / PostgreSQL 트랜잭션 확인
  6. DMS CDC 최종 검증
  7. DMS 중지 및 Stopped 확인
  8. MySQL 정책 변환
  9. ALB Backend V2 전환
  10. ALB Frontend V2 전환
  11. Target Health 확인
  12. Write Gate OFF
  13. 실행 결과 Summary 기록

6.3 Write Gate ON/OFF 결과

이벤트 UTC KST
Gate ON 06:43:49 15:43:49
Gate OFF 06:44:48 15:44:48
지속 시간 59초 59초

판정: PASS

6.4 실패 시 안전 정책

Cutover Workflow는 Gate ON 이후 오류가 발생하면 무조건 이전 상태로 되돌리는 대신, ALB Gate, DMS, DB 및 Target Group 상태를 확인하도록 설계했다.

V2에서 신규 쓰기가 발생한 이후에는 단순 V1 롤백 시 데이터 불일치가 발생할 수 있기 때문이다.

이번 실행에서는 Cutover Job이 성공했으며 Gate OFF까지 완료했다.

6.5 자동화 증빙

[GitHub Actions 캡처 ② — Staging Migration Cutover]

  • Workflow: Staging Migration Cutover
  • Preflight: PASS
  • Cutover Job: SUCCESS
  • Write Gate ON: 15:43:49 KST
  • Write Gate OFF: 15:44:48 KST
  • Write Freeze: 59초

7. k6 Pre-Cutover 조회 부하 테스트

7.1 테스트 구성

항목 설정
도구 Grafana k6
대상 https://staging.needu.gift
테스트 시점 Cutover 이전
목표 RPS 10
지속 시간 5분
API 친구 목록, 친구 상세, 개인 추천, 선물 추천
테스트 유형 인증된 조회 API
결과 파일 results/20261018T063203Z/summary-export.json

7.2 테스트 결과

지표 결과
총 HTTP 요청 3,001건
HTTP 실패율 0%
Checks 6,002 / 6,002 성공
API 성공률 100%
Dropped iterations 0건
p95 27.798ms
p99 56.956ms
k6 종료 코드 0

판정: PASS

7.3 결과 분석

Cutover 이전 Staging 조회 API에서 3,001건의 요청이 정상 처리됐으며, HTTP 실패와 Dropped iterations는 발생하지 않았다.

p95는 27.798ms, p99는 56.956ms로 측정됐다.

따라서 Cutover 이전 서비스의 조회 기능이 정상적으로 동작하는 것을 확인했다.

단, 해당 테스트는 Cutover 이전에 종료됐으므로 실제 Gate ON~OFF 구간의 서비스 가용성을 입증하지는 않는다.

7.4 모니터링 증빙

[Grafana 캡처 ③ — Pre-Cutover k6 HTTP RPS]

  • 조회 구간: Cutover 이전 5분
  • 지표: HTTP RPS
  • 목적: 10 RPS 부하 유지 여부 확인

[Grafana 캡처 ④ — k6 HTTP p95/p99 및 실패율]

  • 조회 구간: Cutover 이전 5분
  • 지표: p95, p99, HTTP 실패율
  • 목적: 전환 이전 조회 성능 및 오류 여부 확인

8. ALB 전환 및 최종 라우팅 검증

8.1 전환 방식

4차에서는 DNS 변경 대신 Staging ALB Listener Rule의 Target Group 가중치를 변경하는 방식을 적용했다.

8.2 Backend 라우팅

항목 값
Listener HTTPS 443
Priority 5
Host staging.needu.gift
Path /api/v1/*
V1 Target Group needu-staging-v1
V1 Weight 0
V2 Target Group needu-staging-be
V2 Weight 100

8.3 Frontend 라우팅

항목 값
Listener HTTPS 443
Priority 20
Path /*
V1 Target Group needu-staging-v1
V1 Weight 0
V2 Target Group needu-staging-fe
V2 Weight 100

추가로 Backend Priority 10 규칙과 Default 규칙 역시 V2 Target Group으로 전달하도록 설정돼 있었다.

8.4 Write Gate 최종 상태

ALB HTTPS Listener Rule 조회 결과, 쓰기 API를 차단하는 fixed-response HTTP 503 규칙이 확인되지 않았다.

  • Backend V2 100%
  • Frontend V2 100%
  • Write Gate OFF

판정: PASS

8.5 모니터링 증빙

[Grafana 캡처 ⑤ — V2 ALB RequestCount]

  • 조회 구간: 2026-10-18 15:35~16:00 KST
  • 지표: RequestCount
  • 대상: V2 ALB 및 Target Group
  • 목적: Cutover 이후 V2로 요청이 유입됐는지 확인

[Grafana 캡처 추가]

[Grafana 캡처 ⑥ — ALB/Target 5xx]

  • 조회 구간: 2026-10-18 15:35~16:00 KST
  • 지표: HTTPCode_ELB_5XX_Count, HTTPCode_Target_5XX_Count
  • 목적: Cutover 전후 ALB 및 애플리케이션 오류 확인

9. Post-Cutover Smoke Test

9.1 Frontend Smoke Test

Cutover 이후 staging.needu.gift에 요청을 전송했다.

요청 결과
GET / HTTP 307
Redirect Location /login
GET /login HTTP 200
최종 URL https://staging.needu.gift/login

로그인 페이지까지 정상적으로 접근되는 것을 확인했다.

판정: PASS

9.2 Backend Smoke Test

Cutover 이후 k6로 인증된 조회 API를 검증했다.

항목 결과
Iterations 4 / 4
HTTP 요청 4건
HTTP 실패율 0%
Checks 성공 8
Checks 실패 0
API 성공률 100%
Dropped iterations 0
k6 종료 코드 0
결과 파일 results/20261018T064717Z/summary-export.json

판정: PASS

9.3 결과 분석

전환 이후 Frontend 로그인 페이지가 정상적으로 응답했고, Backend 조회 API 4건도 모두 성공했다.

따라서 전환 후 FE/BE 기본 접근 및 조회 기능은 정상적으로 동작했다.

다만 Smoke Test는 제한된 요청 수의 기능 검증이므로 전체 API 및 서비스 가용성을 보장하지 않는다.


10. 로그인 및 V2 쓰기 검증

10.1 로그인 문제 발생

Cutover 이후 로그인 기능에서 문제가 보고됐다.

15:49 KST경 Cindy가 로그인 실패 현상을 확인하고 원인을 조사했다.

10.2 원인 및 조치

Cindy 확인 결과, MySQL 초기화 이후 필요한 SQL 실행이 누락된 것으로 파악됐다.

해당 SQL을 적용한 이후 로그인 기능이 정상 동작한다고 보고됐으며, Mond도 로그인 정상 동작을 확인했다.

항목 결과
로그인 초기 상태 실패 현상 보고
추정 원인 MySQL 초기화 후 필수 SQL 실행 누락
조치 누락된 SQL 적용
수정 이후 로그인 정상 확인
5차 반영 필수 SQL 실행 및 검증 절차 추가

10.3 쓰기 검증 범위

로그인 성공은 인증 흐름이 동작한다는 근거다.

그러나 V2 RDS MySQL의 auth_sessions 신규 INSERT나 다른 테이블의 실제 쓰기 결과를 확인한 SQL 증빙은 아직 확보되지 않았다.

PostgreSQL에 대한 신규 쓰기 검증 결과도 별도 확인이 필요하다.

판정: 로그인 수정 후 PASS / DB 직접 쓰기 검증은 확인 필요


11. Write Freeze 지속 시간 및 개선 효과

11.1 4차 측정 결과

항목 결과
Write Gate ON 15:43:49 KST
Write Gate OFF 15:44:48 KST
Write Freeze 59초
목표 120초 이내
목표 대비 여유 61초
목표 시간 사용률 약 49.2%

판정: PASS

11.2 3차 대비 개선

3차에서는 수동 Cutover 절차로 인해 Write Freeze 목표를 초과했다.

4차에서는 Preflight와 Cutover를 자동화해 Gate ON 이후 수행해야 하는 작업을 순차적으로 처리했다.

그 결과 Write Freeze를 59초로 단축했다.

단, 3차의 정확한 Gate ON 시각이 확인되지 않아 단축률을 정밀하게 계산하지 않는다.

11.3 개선 원인

주요 개선 요소는 다음과 같다.

  • Preflight를 Gate ON 이전에 수행
  • V2 ECS 및 PostgreSQL 사전 준비
  • DMS 최종 확인 및 중지 자동화
  • MySQL 정책 변환 자동화
  • ALB Target Group 전환 자동화
  • Target Health 확인 후 Gate OFF 자동화

11.4 실제 서비스 중단 시간과의 차이

Write Freeze 59초는 ALB Write Gate ON~OFF 사이의 시간이다.

이는 쓰기 차단 구간을 의미하며, Frontend 또는 읽기 API 전체가 중단된 시간과 동일하지 않다.

Cutover 중 지속적으로 실행된 k6 조회 테스트 결과가 없으므로 실제 읽기 서비스 중단 여부는 별도 검증이 필요하다.


12. 모니터링 및 관측성 검증

12.1 모니터링 목적

4차 리허설에서는 Cutover 자동화 실행 시점과 인프라 상태를 비교하기 위해 Grafana 및 CloudWatch 지표를 활용한다.

주요 확인 대상은 다음과 같다.

  1. DMS CDC 지연 및 중지 상태
  2. ALB RequestCount 및 5xx
  3. ALB Target Group Healthy 상태
  4. ECS Running/Pending Task
  5. V1 Nginx HTTP 요청량 및 상태 코드

조회 기준 구간은 2026-10-18 15:35~16:00 KST로 설정한다.

기준 이벤트는 다음과 같다.

이벤트 시각(KST)
Preflight PASS 15:42:23
Write Gate ON 15:43:49
Write Gate OFF 15:44:48

12.2 DMS CDC Latency

12.2.1 확인 지표

  • CDCLatencySource
  • CDCLatencyTarget
  • DMS Replication Task 상태

조회 구간: 2026-10-18 15:35~15:50 KST

12.2.2 확인 목적

Write Gate 적용 이전 MySQL CDC 지연이 안정적으로 유지됐는지 확인한다.

또한 Gate ON 이후 최종 CDC 동기화 및 DMS 중지 시점의 변화를 확인한다.

12.2.3 관측 결과

항목 결과
CDC Source Latency Grafana 확인 필요
CDC Target Latency Grafana 확인 필요
Cutover 직전 지연 상태 확인 필요
DMS 중지 시점 Workflow 로그와 대조 필요
Cutover Job SUCCESS

[Grafana/CloudWatch 캡처 ⑦ — DMS CDC Latency]

판정: Cutover 자동화 성공 확인 / 세부 지표 확인 필요

12.3 ALB RequestCount 및 5xx

12.3.1 확인 지표

  • RequestCount
  • HTTPCode_ELB_5XX_Count
  • HTTPCode_Target_5XX_Count

조회 구간: 2026-10-18 15:35~16:00 KST

12.3.2 확인 목적

Cutover 전후 ALB로 유입된 요청량과 오류 발생 여부를 확인한다.

특히 ALB 자체에서 발생한 5xx와 Backend Target에서 발생한 5xx를 구분한다.

12.3.3 관측 결과

항목 결과
Cutover 이전 RequestCount 확인 필요
Cutover 이후 RequestCount 확인 필요
ALB 5xx 확인 필요
Target 5xx 확인 필요
ALB 최종 라우팅 V2 100% 확인

[Grafana 캡처 ⑧ — ALB RequestCount]

[Grafana 캡처 ⑨ — ALB/Target 5xx]

ALB가 Write Gate로 직접 반환한 fixed-response 503은 Target 5xx로 집계되지 않는다. 따라서 ALB/Target 5xx 그래프만으로 쓰기 차단 요청 수를 정확히 확인할 수는 없다.

판정: ALB 라우팅 전환 PASS / 요청량 및 오류 지표 확인 필요

12.4 ALB Target Health

12.4.1 확인 지표

  • HealthyHostCount
  • UnHealthyHostCount

대상 Target Group:

  • needu-staging-fe
  • needu-staging-be

조회 구간: 2026-10-18 15:35~16:00 KST

12.4.2 확인 목적

Cutover 이전 V2 Target Group이 Healthy 상태였는지 확인한다.

또한 트래픽 전환 과정에서 Healthy Target이 유지됐는지 검증한다.

12.4.3 관측 결과

항목 결과
FE HealthyHostCount 확인 필요
BE HealthyHostCount 확인 필요
FE UnHealthyHostCount 확인 필요
BE UnHealthyHostCount 확인 필요
Cutover Workflow Target Health 검증 후 SUCCESS

[Grafana 캡처 ⑩ — ALB Target Group Health]

판정: Workflow 검증 PASS / 시계열 지표 확인 필요

12.5 ECS Running/Pending Task

12.5.1 확인 지표

  • RunningTaskCount
  • PendingTaskCount
  • CPUUtilization
  • MemoryUtilization

대상:

  • Staging Frontend ECS Service
  • Staging Backend ECS Service
  • Staging AI ECS Service

조회 구간: 2026-10-18 15:35~16:00 KST

12.5.2 확인 목적

Cutover 과정에서 ECS Task가 정상적으로 유지됐는지 확인한다.

또한 트래픽 전환으로 인한 Task 재시작, Pending 증가 및 리소스 사용량 변화를 관측한다.

12.5.3 관측 결과

항목 결과
FE RunningTaskCount 확인 필요
BE RunningTaskCount 확인 필요
AI RunningTaskCount 확인 필요
PendingTaskCount 확인 필요
CPUUtilization 확인 필요
MemoryUtilization 확인 필요

[Grafana 캡처 ⑪ — ECS Running/Pending Task]

[Grafana 캡처 추가]

판정: 시계열 지표 확인 필요

12.6 V1 Nginx RPS 및 HTTP 상태 코드

12.6.1 확인 지표

  • HTTP RPS
  • HTTP 2xx
  • HTTP 4xx
  • HTTP 5xx

조회 구간: 2026-10-18 15:35~16:00 KST

12.6.2 확인 목적

ALB V1 → V2 전환 전후 V1 Nginx에 유입되는 요청량 변화를 확인한다.

또한 Cutover 중 HTTP 503 발생 여부를 확인해 쓰기 차단과 실제 서비스 오류를 구분한다.

12.6.3 관측 결과

항목 결과
Cutover 이전 V1 RPS 확인 필요
Cutover 이후 V1 RPS 확인 필요
HTTP 5xx 확인 필요
Write Gate 관련 503 ALB 및 Nginx 로그 구분 필요

[Grafana 캡처 ⑫ — V1 Nginx RPS 및 HTTP 상태 코드]

ALB에서 직접 반환한 503은 V1 Nginx까지 전달되지 않으므로 Nginx Access Log에 기록되지 않을 수 있다.

판정: Grafana 및 로그 확인 필요

12.7 관측성 검증 요약

모니터링 항목 검증 목적 현재 상태
DMS CDC Latency 최종 동기화 상태 세부 지표 확인 필요
ALB RequestCount V2 트래픽 유입 최종 라우팅 확인, 지표 확인 필요
ALB/Target 5xx 전환 중 오류 여부 확인 필요
ALB Target Health Healthy Target 유지 Workflow PASS, 지표 확인 필요
ECS Running/Pending Task 정상 유지 확인 필요
Nginx RPS/HTTP Code V1 트래픽 변화 확인 필요
Write Gate ON/OFF 쓰기 차단 지속 시간 59초, PASS

13. 발견된 문제 및 원인 분석

13.1 MySQL 초기화 후 SQL 실행 누락

13.1.1 현상

Cutover Workflow는 성공했지만, 전환 이후 로그인 실패 현상이 발생했다.

13.1.2 원인

MySQL 초기화 이후 필요한 SQL 실행이 누락된 것으로 확인됐다.

현재 확인된 내용만으로는 누락된 SQL이 리허설 사전 준비용인지, 실제 Cutover 과정에서 필수적으로 실행해야 하는 SQL인지 구분되지 않는다.

13.1.3 조치

누락된 SQL을 적용한 뒤 로그인 정상 동작을 확인했다.

13.1.4 개선 방향

  • MySQL 초기화 및 필수 SQL 실행 순서 명문화
  • 리허설 사전 준비용 SQL과 Cutover 정책 변환 SQL 구분
  • Preflight에서 필수 데이터 및 사용자 상태 검증
  • SQL 실행 누락 시 Cutover 진행 차단
  • Cutover 이후 별도 수동 수정 없이 로그인 정상 동작 확인

13.2 k6 Threshold 판정 문제

13.2.1 현상

k6 Summary에서 Threshold 판정이 false로 출력됐다.

그러나 실제 측정값은 다음과 같았다.

항목 결과
Pre-Cutover HTTP 실패율 0%
Pre-Cutover Checks 6,002/6,002
Post-Cutover HTTP 실패율 0%
Post-Cutover Checks 8/8
Dropped iterations 0
k6 종료 코드 0

13.2.2 분석

실제 측정 지표와 Threshold 판정 결과가 일치하지 않았다.

현재 결과만으로 Threshold false의 정확한 원인을 확정할 수 없다.

13.2.3 개선 방향

  • k6 Threshold 정의 확인
  • k6 실행 버전 및 Summary JSON 구조 확인
  • Threshold 판정 로직 검증
  • 원본 측정값과 자동 PASS/FAIL 결과 비교

13.3 Cutover 중 서비스 가용성 측정 부족

13.3.1 현상

Cutover 이전과 이후의 k6 테스트는 정상적으로 완료됐다.

하지만 Gate ON~OFF 구간에서 지속적으로 조회 요청을 발생시킨 테스트 결과가 없다.

13.3.2 영향

Write Freeze 59초는 확인됐지만, 실제 읽기 서비스가 중단됐는지 여부는 판단할 수 없다.

13.3.3 개선 방향

5차에서는 Cutover 시작 이전부터 완료 이후까지 k6 조회 부하를 지속 실행한다.

다음 지표를 수집한다.

  • HTTP 요청 성공률
  • HTTP 5xx 발생 건수
  • p95/p99 응답시간
  • 실패 발생 시각
  • 연속 실패 지속 시간
  • 의도적인 쓰기 차단 503과 실제 읽기 장애 구분

13.4 관측성 증빙 부족

13.4.1 현상

GitHub Actions Job Summary와 k6 Summary는 확보했지만, Cutover 시점의 Grafana 지표는 추가 확인이 필요하다.

13.4.2 개선 방향

  • Grafana에 Gate ON/OFF 시각 표시
  • DMS CDC Latency 및 ALB 5xx 그래프 확보
  • ALB Target Group별 HealthyHostCount 확인
  • ECS Task 수 및 리소스 사용량 비교
  • k6 Summary와 Grafana 지표 대조

14. 한계 및 미검증 항목

14.1 RPO 0 미확정

DMS 및 PostgreSQL 복원 검증을 수행했지만, V1에서 성공 응답을 받은 모든 쓰기 요청과 V2 저장 결과를 전수 대조하지 않았다.

따라서 RPO 0은 확정할 수 없다.

14.2 Cutover 중 읽기 서비스 가용성

Pre-Cutover 및 Post-Cutover k6 결과는 정상이다.

그러나 Gate ON~OFF 동안 지속적으로 읽기 요청을 발생시킨 테스트가 없어 실제 서비스 전체 중단 여부를 확정할 수 없다.

14.3 Write Gate 차단 완전성

ALB Write Gate ON/OFF 자동화와 최종 OFF 상태는 확인했다.

다만 대표 POST/PUT/PATCH/DELETE 요청에 대해 차단 중 HTTP 503을 반환했는지에 대한 개별 증빙은 확보되지 않았다.

14.4 DB 최종 데이터 정합성

MySQL DMS 및 PostgreSQL 복원은 사전 검증을 통과했다.

그러나 Cutover 이후 최종 데이터 정합성 및 실제 신규 쓰기 반영 결과는 별도 확인이 필요하다.

14.5 롤백 제한

V2에서 신규 쓰기가 발생한 이후에는 단순히 ALB 가중치를 V1로 되돌리면 데이터 불일치가 발생할 수 있다.

롤백 여부는 DMS 상태, V1/V2 데이터 차이 및 신규 쓰기 발생 여부를 확인한 후 결정해야 한다.


15. 5차 최종 리허설 개선 계획

15.1 개선 항목

개선 항목 적용 방향 검증 기준
Prod 인프라 Prod 환경 설정 및 사전 검증 ECS/RDS/ALB Healthy
Prod Workflow Preflight/Cutover 자동화 각 단계 PASS
MySQL 초기화 필수 SQL 실행 및 검증 자동화 누락 없이 로그인 성공
PostgreSQL 최종 데이터 및 구조 검증 테이블·구조 정합성
Write Freeze Gate ON/OFF 자동 계측 120초 이내
ALB 전환 V1 0% / V2 100% FE/BE 전환 확인
Cutover 중 조회 부하 k6 지속 실행 실제 5xx 및 중단 구간 측정
쓰기 차단 대표 쓰기 API별 검증 Gate ON 차단 확인
쓰기 재개 실제 API 및 DB 반영 검증 Gate OFF 이후 INSERT/UPDATE 성공
로그인 별도 수동 수정 없는 인증 성공 로그인 정상
k6 Threshold 판정 로직 수정 Summary와 판정 일치
모니터링 Grafana/CloudWatch 지표 확보 Cutover 시점별 증빙
롤백 V2 쓰기 전후 정책 분리 데이터 유실 방지

15.2 Prod 환경 및 워크플로우 구성

4차 Staging Cutover 자동화 검증 결과를 바탕으로 Prod 환경을 구성한다.

Prod 환경에 적용할 주요 항목은 다음과 같다.

  1. Prod ECS/RDS/ALB 설정 검증
  2. Prod Preflight Workflow 구성
  3. Prod Cutover Workflow 구성
  4. Prod Write Gate 및 ALB 전환 절차 검증
  5. Prod DMS 및 DB 접근 권한 검증
  6. 최종 리허설 후 운영 전환 승인

Prod 전환을 위한 최종 리허설에서는 운영 DB와 운영 도메인에 영향을 주지 않는 격리된 환경에서 동일한 절차를 검증해야 한다.

15.3 5차 최종 리허설 종료 기준

다음 조건을 모두 만족해야 최종 PASS로 판정한다.

  • Preflight PASS
  • DMS CDC 최종 동기화 확인
  • PostgreSQL 복원 및 데이터 정합성 확인
  • Write Freeze 120초 이내
  • ALB FE/BE V2 100% 전환
  • Write Gate OFF 확인
  • Cutover 중 읽기 API 가용성 측정 완료
  • 로그인 및 핵심 기능 정상 동작
  • V2 DB 신규 쓰기 반영 확인
  • 별도 수동 수정 없이 Cutover 완료
  • 최종 데이터 정합성 검증 완료

16. 최종 결론

2026년 10월 18일 진행한 V1 → V2 Staging 마이그레이션 4차 리허설에서는 GitHub Actions 기반 Preflight 및 Cutover 자동화의 정상 실행을 확인했다.

Preflight는 15:42:23 KST에 완료됐으며, Write Gate는 15:43:49 KST에 활성화되고 15:44:48 KST에 해제됐다.

이에 따라 Write Freeze는 59초로 측정돼 목표인 120초 이내를 달성했다.

ALB Listener Rule 조회 결과 Backend와 Frontend 모두 V1 0%, V2 100%로 전환됐으며, Write Gate OFF 상태를 확인했다.

Pre-Cutover k6 테스트에서는 총 3,001건의 요청이 모두 성공했고 p95 27.798ms, HTTP 실패율 0%를 기록했다.

Post-Cutover Backend Smoke Test에서는 4건의 요청과 Checks 8건이 모두 성공했으며, Frontend는 /login 페이지의 HTTP 200 응답을 확인했다.

Cutover 이후 MySQL 초기화 후 SQL 실행 누락에 따른 로그인 문제가 발생했으나, SQL 적용 후 정상 동작을 확인했다.

다만 Cutover 중 읽기 서비스 가용성, MySQL·PostgreSQL 최종 정합성, RPO 0 및 대표 쓰기 API의 차단·재개 여부는 추가 검증이 필요하다.

최종 판정: Cutover 자동화 PASS / Write Freeze 59초로 목표 달성 / FE·BE Smoke Test PASS / 로그인 문제 수정 완료 / DB 최종 정합성 및 서비스 중단 여부 추가 검증 필요

5차 최종 리허설에서는 Prod 환경과 워크플로우를 준비하고, 이번에 발견된 SQL 실행 누락 및 Cutover 중 가용성 측정 문제를 개선한 후 실제 운영 전환을 검토한다.