Database Migration
개요
- 프로젝트 목적 : 데이터베이스 마이그레이션
- 프로젝트 기간 : 2025.09 ~ 2025.10
마이그레이션 방안
1. Dump -> Load
- 데이터 베이스 인스턴스(EC2)에서 데이터를 덤프하여 새로운 데이터 베이스 인스턴스(EC2)에 로드한다.
- 장점 : 메뉴얼로 진행하여 구현이 쉽다.
- 단점 : 데이터 베이스 인스턴스(EC2)에서 데이터를 덤프하여 새로운 데이터 베이스 인스턴스(EC2)에 로드하는 과정에서 데이터 손실이 발생할 수 있다.
2. Azure Database Migration Service
- CDC를 활용하여 실시간 데이터 베이스를 업데이트 후 원한는 시점에 DB주소를 변경하면 된다.
- 장점 : 짧은 시간 중단만으로도 서비스 재개가 가능하다.
- 단점 : 비용이 추가적으로 소요된다.
3. Dual write
- AWS, Azure에 데이터 베이스 모두에 write를 진행한다.
- 장점 : 데이터 손실이 없다.
- 단점 : 마이그레이션 중에 점검을 2번 실행 해야한다.
Azure Database Migration Service
1. CDC(Change Data Capture) 설정 및 동작 원리
2. AWS CDC 설정
Binary Log 확인
1
2
3
| -- Binary Log 활성화 확인
SHOW VARIABLES LIKE 'log_bin';
-- 결과: on 으로 출력 확인
|
Binlog Retention 설정
1
2
3
4
5
6
| -- 현재 설정 확인
CALL mysql.rds_show_configuration;
-- binlog retention hours가 NULL이 아닌 2일 이상인지 확인
-- Retention 기간 설정 (168시간 = 7일)
CALL mysql.rds_set_configuration('binlog retention hours', 168);
|
3. 마이그레이션 단계
1단계: Full Load (초기 복사)
1
2
3
4
5
6
7
| [AWS RDS MySQL]
↓
전체 테이블 스캔
↓
데이터 복사 (Dump & Restore 방식)
↓
[Azure MySQL]
|
2단계: CDC (실시간 변경 캡처) ⭐
1
2
3
4
5
6
7
8
9
| [AWS RDS MySQL]
↓
Binary Log 읽기 (binlog)
↓
INSERT/UPDATE/DELETE 이벤트 캡처
↓
변경사항만 실시간 전송
↓
[Azure MySQL]
|
3.1 Binary Log 동작 원리
1) 쿼리 실행 시 Binary Log 기록
AWS RDS에서 쿼리 실행:
1
2
| INSERT INTO users (name, email)
VALUES ('John', 'john@example.com');
|
Binary Log에 기록되는 내용:
1
2
3
4
5
6
| ### INSERT INTO `myapp`.`users`
### SET
### @1=1001 /* INT meta=0 nullable=0 */
### @2='John' /* STRING(255) meta=65535 nullable=1 */
### @3='john@example.com' /* STRING(255) meta=65535 nullable=1 */
### @4='2025-10-13 10:30:45' /* DATETIME meta=0 nullable=1 */
|
2) Binary Log 파일 확인
1
2
| -- Binary Log 파일 목록 조회
SHOW BINARY LOGS;
|
결과:
1
2
3
4
5
6
| +------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 154 |
| mysql-bin.000002 | 25836 |
+------------------+-----------+
|
3) Binary Log 이벤트 조회
1
2
| -- 특정 Binary Log 파일의 이벤트 확인
SHOW BINLOG EVENTS IN 'mysql-bin.000002';
|
3.2 DMS CDC 동작 과정(상세설정)
📌 상세 내용은 여기를 참고하세요.
1) Step 1: Binary Log 읽기
DMS가 AWS RDS의 Binary Log를 실시간으로 모니터링합니다.
1
2
| mysql-bin.000001
mysql-bin.000002 ← DMS가 이 로그들을 읽음
|
2) Step 2: 이벤트 파싱
Binary Log Event:
1
2
3
4
| - Timestamp: 2025-10-13 10:30:45
- Event Type: WRITE_ROWS_EVENT (INSERT)
- Table: myapp.users
- Data: {id: 1001, name: 'John', email: 'john@example.com'}
|
DMS가 이벤트를 분석:
“users 테이블에 INSERT가 발생했구나!”
3) Step 3: Azure에 적용
DMS가 Azure MySQL에 자동으로 쿼리 실행:
1
2
| INSERT INTO users (id, name, email, created_at)
VALUES (1001, 'John', 'john@example.com', '2025-10-13 10:30:45');
|
4) Step 4: 포지션 저장
DMS 내부 상태:
1
2
3
| - Current Position: mysql-bin.000002:25836
- Last Applied: 2025-10-13 10:30:45
- Latency: 0.5 seconds
|
장애 복구: 네트워크 장애 등으로 중단되어도 저장된 포지션부터 다시 시작 가능!