본문으로 건너뛰기

AWS RDS MySQL와 카카오클라우드 MySQL 간 데이터 마이그레이션 및 복제 구성

AWS RDS MySQL과 카카오클라우드 MySQL 간의 데이터 이관 및 복제 방법을 설명합니다.

기본 정보
  • 예상 소요 시간: 60분
  • 권장 운영 체제: Windows, MacOS

시나리오 소개

이번 시나리오에서는 AWS RDS MySQL과 카카오클라우드 MySQL 간 데이터 마이그레이션 및 복제 구성을 단계별로 안내합니다. 이관과 복제 모두 지원하며, Primary 전환 절차도 포함되어 있습니다.

  • MySQL Workbench와 MySQL Dump를 활용해 데이터 이관
  • MySQL Replication을 이용해 데이터 복제

시나리오 아키텍처

시작하기 전에

1. 네트워크 환경 구축

카카오클라우드에서 MySQL의 데이터 이관 및 복제를 구축하기 전에 먼저 네트워크 환경 설정이 필요합니다. 이를 위해, 다중 가용 영역에서 NAT 인스턴스를 이용한 네트워크 구축 문서를 참조하여 프라이빗 서브넷에 존재하는 리소스들이 외부 통신이 가능하도록 구축하세요.

2. 보안 그룹 설정

보안 그룹 설정은 외부 불법 접근 차단과 필요한 트래픽 허용을 통해 데이터 안전성을 확보하고, 원활한 네트워크 통신을 위해 필요합니다.

보안 그룹: tutorial-bastion-sg
  1. 카카오클라우드 콘솔 > VPC > 보안 그룹 메뉴로 이동합니다. 아래 표를 참조하여 보안 그룹을 생성합니다.

    이름설명(선택)
    tutorial-bastion-sgBastion VM의 보안정책
  2. 하단의 [+ 추가하기] 버튼을 클릭 후, 인바운드 조건을 아래와 같이 설정하고 [적용] 버튼을 클릭합니다.

    나의 퍼블릭 IP 확인하기

    다음 버튼을 클릭하면 현재 사용 중인 나의 퍼블릭 IP를 확인할 수 있습니다.

    추가할 인바운드 규칙항목설정값
    bastion inbound policy 1프로토콜TCP
    패킷 출발지{사용자 퍼블릭 IP}/32
    포트 번호10000-10010
    정책 설명(선택)bastion inbound policy 1
    bastion inbound policy 2프로토콜TCP
    패킷 출발지{사용자 퍼블릭 IP}/32
    포트 번호81
    정책 설명(선택)bastion inbound policy 2
    bastion inbound policy 3프로토콜TCP
    패킷 출발지{사용자 퍼블릭 IP}/32
    포트 번호22
    정책 설명(선택)bastion inbound policy 3

3. Bastion VM 설정

Bastion VM는 클라우드 환경에서 데이터 이관 및 MySQL 접속을 위한 호스트로, 원격으로 클라우드 인스턴스에 안전하게 접근할 수 있는 게이트웨이 역할을 수행합니다.

  1. 카카오클라우드 콘솔 > Beyond Compute Service > Virtual Machine 메뉴로 이동합니다.
  2. 아래 표의 항목과 값을 참조하여 Bastion 호스트 역할을 할 VM 인스턴스를 생성합니다.
구분항목설정/입력값비고
기본 정보이름tutorial-bastion
개수1
이미지Ubuntu 20.04
인스턴스 타입m2a.large
볼륨루트 볼륨20
키 페어{USER_KEYPAIR}⚠️ 키 페어는 최초 1회 안전하게 보관해야 합니다.
잃어버린 키는 복구할 수 없으며, 재발급이 필요합니다.
네트워크VPCtutorial
서브넷main (10.0.0.0/20)
보안 그룹tutorial-bastion-sg

4. MySQL 데이터베이스 생성

데이터 마이그레이션을 위한 MySQL 인스턴스를 생성합니다. 카카오클라우드의 MySQL은 완전 관리형 데이터베이스 서비스로, 복잡한 설치 없이 콘솔에서 간편하게 MySQL 인스턴스를 프로비저닝할 수 있습니다. 또한, 논리적으로 분리된 네트워크에서 안전하게 사용할 수 있습니다.

  1. 카카오클라우드 콘솔 > Data Store > MySQL 메뉴로 이동합니다.

  2. 인스턴스 그룹 탭에서 [인스턴스 그룹 생성] 버튼을 클릭 후, 다음을 참고하여 인스턴스 그룹을 생성합니다.

    구분항목설정/입력값비고
    기본 설정인스턴스 그룹 이름tutorial-mysql
    설명선택
    MySQL 설정엔진 버전지정된 값을 사용
    MySQL 사용자 이름USER
    MySQL 비밀번호USER_PASSWORD
    인스턴스 가용성/개수단일 (Primary 인스턴스)
    인스턴스 타입m2a.large
    스토리지 타입/크기100
    로그 스토리지 타입/크기100
    네트워크 설정VPCtutorial
    보안 그룹인스턴스 그룹에 적용할 신규 보안 그룹 생성 또는 미리 생성된 보안 그룹 선택
    서브넷{VPC_ID}_sn_5 (10.0.64.0/20)⚠️ NAT 인스턴스 튜토리얼에서 생성한 서브넷을 사용합니다.
    자동 백업자동 백업 옵션미사용

MySQL 데이터 마이그레이션

MySQL 데이터 마이그레이션은 MySQL Dump를 활용하는 방법과 MySQL Workbench를 사용하는 방법으로 진행할 수 있습니다.

주의

데이터 이관은 모두 인터넷망을 통해 이루어지므로, 두 데이터베이스 인스턴스 간 외부 네트워크 통신 가능 여부를 반드시 확인하세요.

1. MySQL Workbench 활용

MySQL Workbench는 SQL 개발과 관리를 단일 개발 통합 환경에서 제공하는 비주얼 데이터베이스 설계하는 오픈소스 도구입니다. 이 튜토리얼에서는 Windows 인스턴스 기반으로 설명합니다.

Step 1. MySQL Workbench 설치 및 Bastion VM 연결

  1. Window 인스턴스 연결를 참고하여 Bastion VM에 RDP(Remote Desktop Protocol)로 원격 접속합니다.

  2. MySQL Workbench 다운로드 공식 홈페이지에서 설치 파일을 받아 설치합니다.

    MySQL Workbench

Step 2. Migration Wizard를 이용한 데이터 이관

  1. MySQL Workbench > Database > Migration Wizard 메뉴로 이동하여 데이터 마이그레이션을 시작합니다. 아래 항목을 순서대로 설정합니다.

    MySQL Workbench 데이터 마이그레이션 진행

    항목설정/입력값비고
    Source SelectionAWS RDS 접속 정보Test Connection으로 연결 확인 가능
    Target Selection카카오클라우드 MySQL 접속 정보Test Connection으로 연결 확인 가능
    Schemas Selection마이그레이션을 진행할 스키마 선택튜토리얼에서는 Library Schemas를 선택
    Source Objects이관할 테이블 및 객체 선택PROCEDURE 또는 FUNCTION 선택 가능
    Migration스크립트 생성 단계소스 기반 스키마 변환
    Target Creation Options타겟 데이터베이스에 스키마 생성 옵션 설정SQL 파일 생성 포함
    Create Schemas실제 테이블 생성 및 로그 확인
    Bulk Data Transfer최종 데이터 이관 완료 로그 확인
    안내

    위 항목은 필수 설정이며, 나머지 항목은 기본값으로 설정하여 진행합니다.

Step 3. Bastion VM에서 MySQL 연결 및 데이터 확인

  1. Bastion VM에서 MySQL Client를 이용하여 카카오클라우드 MySQL 인스턴스에 접속합니다.

    MySQL 인스턴스 연결 명령어
    mysql --user={USER} --password={USER_PASSWORD} --host {ENDPOINT} --port {PORT}
    항목설명
    user{USER}: MySQL 사용자 이름 (예: admin)
    password{USER_PASSWORD}: 해당 사용자 계정의 비밀번호
    host{ENDPOINT}: MySQL 인스턴스의 엔드포인트 주소
    port{PORT}: MySQL 인스턴스가 사용하는 포트 번호
  2. 카카오클라우드 MySQL에서 library 스키마에 있는 book 테이블의 데이터 정합성을 확인합니다.

    MySQL 인스턴스 명령어
    use library;
    Database changed

    select * from book;

2. MySQL Dump 활용

mysqldump는 MySQL 데이터베이스를 백업하거나 다른 인스턴스로 이관할 때 사용하는 명령줄 기반 유틸리티입니다.
이 단계에서는 AWS RDS MySQL의 읽기 전용 복제본에서 데이터를 덤프한 뒤, 카카오클라우드 MySQL로 가져오는 방법을 설명합니다.

Step 1. AWS RDS 데이터 덤프

카카오클라우드 VM에서 mysqldump 명령을 사용하여 AWS RDS MySQL Replica DB를 대상으로 덤프를 수행합니다. 덤프 수행전 Replica를 중지한 후 작업하는 것을 권장합니다.

# 1. AWS 읽기 전용 복제본 접속 (shell에서 실행)
mysql --user={USER} --password={USER_PASSWORD} \
--host={aws-rds-read-replica}.ap-northeast-2.rds.amazonaws.com --port=3306
-- 2. 읽기 전용 복제본에서 실행 (MySQL prompt)

CALL mysql.rds_stop_replication;

+-------------------------------+
| Message |
+-------------------------------+
| Slave is now down or disabled |
+-------------------------------+
1 row in set (3.01 sec)

Query OK, 0 rows affected (3.01 sec)

EXIT;
# 3. 읽기 전용 복제본 덤프 (shell에서 실행)

mysqldump -h {aws-read-replica}.ap-northeast-2.rds.amazonaws.com \
-u admin \
-p \
--port=3306 \
--routines \
--triggers \
--set-gtid-purged=OFF \
--databases {덤프_데이터베이스} > aws_source.sql
Enter password: {어드민 비밀번호 입력}
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events.
Warning: A dump from a server that has GTIDs enabled will by default include the GTIDs of all transactions, even those that were executed during its extraction and might not be represented in the dumped data. This might result in an inconsistent data dump.
In order to ensure a consistent backup of the database, pass --single-transaction or --lock-all-tables or --master-data.
# 4. 덤프 파일 생성 여부 확인
ls
# 출력 예: aws_source.sql
경고

덤프 중 출력되는 GTID 관련 경고는 일반적인 현상입니다. 데이터 일관성을 확보하려면 --single-transaction 옵션 추가를 권장합니다.

Step 2. 카카오클라우드 MySQL로 데이터 가져오기 및 복제 설정

카카오클라우드 VM에 생성된 덤프 파일을 사용하여 카카오클라우드 MySQL로 데이터를 가져옵니다.

# 카카오클라우드 MySQL 접속 (터미널에서 실행)
mysql --user={USER} --password={USER_PASSWORD} \
--host={KAKAOCLOUD_MYSQL_ENDPOINT} --port=3306
-- MySQL 프롬프트에서 실행
GRANT FLUSH_OPTIMIZER_COSTS, FLUSH_STATUS, FLUSH_TABLES, FLUSH_USER_RESOURCES ON *.* TO 'admin'@'%';
FLUSH PRIVILEGES;
EXIT;
# 덤프 파일 임포트 (터미널에서 실행)
mysql --user={USER} --password={USER_PASSWORD} \
--host={KAKAOCLOUD_MYSQL_ENDPOINT} --port=3306 < aws_source.sql

# 출력 예시
mysql: [Warning] Using a password on the command line interface can be insecure.

MySQL 데이터 Replication

카카오클라우드 MySQL에서 AWS RDS MySQL로 복제하는 과정(Chained Replication) 소개합니다.

시나리오 아키텍처

Step 1. 포트 포워딩

AWS RDS Replica-2에서 카카오클라우드 MySQL 복제를 설정하려면 Bastion VM을 사용하여 포트 포워딩(Port Forwarding) 환경을 구성해야 합니다.

사전 확인 사항
  • 외부 접속 포트 (예: 4306)
  • 내부 MySQL 포트 (예: 3306)
    • Nat 인스턴스를 통한 포트 포워딩 흐름: 외부 → 4306 → NAT 인스턴스 → 3306 → 카카오클라우드 MySQL
  • 카카오클라우드 VM의 퍼블릭/프라이빗 IP 확인 필요
  1. 카카오클라우드 MySQL Endpoint의 프라이빗 IP를 확인합니다.

    nslookup {KC_MySQL_ENDPOINT}
    # 결과 예시:
    # Address: {MySQL_PRIVATE_IP}
  2. Bastion VM에 접속합니다.

    ssh -i {PATH_TO_PRIVATE_KEY} {USERNAME}@{INSTANCE_IP}
  3. iptables 명령어를 사용하여 iptables-persistent를 설치하고 실행합니다. (Ubuntu 기준)

    sudo apt update
    sudo apt install iptables-persistent
    sudo systemctl start iptables
    sudo systemctl status iptables
    # Active 상태 확인
  4. ssh 환경을 설정합니다.

    sudo vi /etc/ssh/sshd_config
    # 아래 항목을 yes로 수정
    AllowTcpForwarding yes
    GatewayPorts yes

    # SSH 서비스 재시작
    sudo /etc/init.d/ssh restart
    Restarting ssh (via systemctl): ssh.service.
  5. 커널에서 포트 포워딩을 설정합니다.

    sudo vi /etc/sysctl.conf
    # 아래 항목 추가 또는 주석 해제
    net.ipv4.ip_forward=1

    # 설정 반영
    sudo sysctl -p /etc/sysctl.conf
    # 출력 값
    net.ipv4.ip_forward = 1
  6. NAT 인스턴스에 포트 포워딩을 설정합니다.

    # 외부 포트 4306 → 내부 MySQL 포트 4306로 포워딩
    sudo iptables -t nat -A PREROUTING -p TCP --dport 4306 -j DNAT --to-destination {KC_MySQL_ENDPOINT_IP}:3306

    # 응답 패킷의 소스 IP 설정 (SNAT)
    sudo iptables -t nat -A POSTROUTING -p tcp -d {KC_MySQL_ENDPOINT_IP} --dport 3306 -j SNAT --to-source {KC_VM_PRIVATE_IP}
  7. 설정된 값을 확인합니다.

    sudo iptables -t nat -nL --line-numbers
    #출력 예시:
    Chain PREROUTING (policy ACCEPT)
    num target prot opt source destination
    1 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:4306 to:{KC_MySQL_ENDPOINT_IP}:3306 <-- 확인

    Chain INPUT (policy ACCEPT)
    num target prot opt source destination

    Chain OUTPUT (policy ACCEPT)
    num target prot opt source destination

    Chain POSTROUTING (policy ACCEPT)
    num target prot opt source destination
    1 SNAT tcp -- 0.0.0.0/0 172.16.16.133 tcp dpt:3306 to:{KC_MySQL_ENDPOINT_IP} <-- 확인

Step 2. 카카오클라우드 MySQL 덤프 및 복제 설정

  1. 카카오클라우드 VM에서 mysqldump 명령을 이용하여 MySQL 덤프 파일을 생성합니다.

    mysqldump -h {KC_MySQL_ENDPOINT} \
    -u admin \
    -p \
    --port=3306 \
    --single-transaction \
    --routines \
    --triggers \
    --databases {dump_DATABASE} > kc_replica.sql
    # 실행 중 출력될 수 있는 경고 에시 (무시 가능)
    Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events.
  2. 카카오클라우드 VM에 생성된 덤프 파일을 사용하여 AWS RDS로 데이터를 임포트합니다.

    # AWS RDS로 접속
    mysql --user={USER} --password={USER_PASSWORD} --host {AWS_RDS_REPLICA_2_ENDPOINT} --port 3306

    # 권한 부여
    grant FLUSH_OPTIMIZER_COSTS, FLUSH_STATUS, FLUSH_TABLES, FLUSH_USER_RESOURCES on *.* to 'admin'@'%';
    Query OK, 0 rows affected (0.01 sec)

    FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.01 sec)

    exit
    Bye

    # 데이터 임포트
    mysql --user={USER} --password={USER_PASSWORD} --host {aws-rds-replica-2-endpoint} < kc_replica.sql
    [Warning] Using a password on the command line interface can be insecure.
  3. 카카오클라우드 MySQL 인스턴스에서 AWS RDS로 복제가 되도록 설정합니다.

    # AWS RDS에 접속
    mysql --user={USER} --password={USER_PASSWORD} --host {aws-rds-replica-2-endpoint} --port 3306

    # 복제 설정
    CALL mysql.rds_set_external_master_with_auto_position (
    '{KC_VM_PUBLIC_IP}' # <- KC VM Public IP
    , '4306' # <- KC VM Public에서 접속될 외부 포트
    , '{RDS_USER}' # <- rds 관리자 계정
    , '{RDS_USER_PASSWORD}' # <- RDS 관리자 암호
    , 0 # <- SSL 사용여부(0이 사용 안함)
    , 0 # <- Delay 시간
    );
    Query OK, 0 rows affected (0.04 sec)

    # AWS RDS에서 MySQL 복제 설정을 자동 GTID 모드로 전환
    CALL mysql.rds_set_master_auto_position (1);
    +-----------------------------------------+
    | Message |
    +-----------------------------------------+
    | Master Auto Position has been set to 1. |
    +-----------------------------------------+
    1 row in set (2.02 sec)

    +---------------------------+
    | Message |
    +---------------------------+
    | Slave is running normally |
    +---------------------------+
    1 row in set (2.02 sec)

    Query OK, 0 rows affected (2.02 sec)

    # 복제 상태 확인
    show replica status\G;
    *************************** 1. row ***************************
    ...
    ERROR:
    No query specified

Step 3. 데이터 복제 테스트

카카오클라우드 MySQL 인스턴스에서 데이터베이스와 테이블을 생성하고 데이터를 입력한 후, AWS RDS Replica-2 인스턴스에 데이터가 잘 복제되었는지 확인합니다.

DB 엔드포인트 변경 및 Primary 승격

Amazon RDS Primary 인스턴스를 카카오클라우드 MySQL 인스턴스로 전환(Primary 승격)하는 방법을 단계별로 소개합니다.

Primary 승격

Step 1. DB Replication 트랜잭션 상태 확인

  1. AWS RDS Primary DB 서비스의 인입을 중단하여 최대한의 다운타임을 확보하고 데이터베이스에서의 트랜잭션 인입을 차단합니다. 이를 위해 현재 프로세스 목록을 확인하는 명령어를 실행합니다.

    show processlist;
    +----------+----------+---------------------+--------+------------------+----------+---------------------------------------------------------------+------------------+
    | Id | User | Host | db | Command | Time | State | Info |
    +----------+----------+---------------------+--------+------------------+----------+---------------------------------------------------------------+------------------+
    | 6 | repluser | 1.1.1.1:10000 | NULL | Binlog Dump GTID | 59192344 | Master has sent all binlog to slave; waiting for more updates | NULL |
    .....
    | 45942707 | root | localhost | NULL | Query | 0 | starting | show processlist |
    +----------+----------+---------------------+--------+------------------+----------+---------------------------------------------------------------+------------------+
  2. 카카오클라우드 Replica MySQL DB의 복제 지연이 없는지 Second_Behind_Source 값이 0인지 확인합니다.

    show replica status\G;
    ...
    Second_Behind_Source : 0
  3. 동일하게 AWS RDS의 복제 상태에서도 Second_Behind_Source0인지 확인하여 동기화 완료 여부를 점검합니다.

    show replica status\G;
    ...
    Second_Behind_Source : 0

Step 2. 애플리케이션들의 MySQL DB Endpoint 변경

  1. 기존 AWS RDS Primary DB에 연결된 모든 애플리케이션을 카카오클라우드 MySQL로 DB 엔드포인트를 변경합니다.
  2. 동시에, 카카오클라우드 MySQL DB의 read_only 설정을 해제하기 위해 다음 명령어를 실행합니다.
    set global read_only=0;
  3. AWS RDS Primary DB에서의 트랜잭션 발생을 차단하기 위해 ead_only 파라미터를 설정합니다.
    set global read_only=1;
  4. 카카오클라우드 MySQL에 커넥션이 정상적으로 연결되는지 확인한 후, 테스트 트랜잭션을 인입하여 기능이 정상 작동하는지 검증합니다.

Step 3. AWS RDS Primary 분리 및 카카오클라우드 MySQL 인스턴스로 Primary 승격

  1. 카카오클라우드 MySQL에서 AWS RDS로부터 복제되어 넘어오는 트랜잭션이 없는지 최종적으로 확인합니다.
    show replica status\G;
    ...
    Second_Behind_Source : 0 # <- 확인
  2. 복제 동기화를 중단하고 AWS RDS Primary를 분리하여 카카오클라우드 MySQL로 승격하는 과정은 다음과 같습니다.
    stop replica;
    reset replica all;
  3. 모든 변경 사항이 정상적으로 적용되었는지 서비스 상태를 최종적으로 점검합니다.