본문으로 건너뛰기

AWS RDS MySQL에서 카카오클라우드 MySQL로 데이터 이관 및 복제

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

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

시나리오 소개

이번 시나리오에서는 AWS RDS MySQL에서 카카오클라우드 MySQL로 데이터를 이관하는 방법과, 카카오클라우드 MySQL에서 AWS RDS MySQL로 데이터를 복제하는 방법을 설명합니다. 주요 내용은 다음과 같습니다.

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

시나리오 아키텍처

사전 작업

1. 네트워크 환경 구축

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

2. 보안 그룹 설정

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

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

    이름설명(선택)
    tutorial-bastion-sgBastion 호스트의 보안정책
  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 호스트 설정

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

  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 사용자 이름admin
    MySQL 비밀번호root1234
    인스턴스 가용성/개수단일 (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 접속용 VM 접속하기

  1. Window 인스턴스 연결를 참고하여 VM 인스턴스에 MySQL Workbench를 설치하기 위해 RDP로 접근합니다.

  2. MySQL Workbench 다운로드 공식 홈페이지에서 다운로드 및 설치를 진행합니다. MySQL Workbench

Step 2. 데이터 마이그레이션 진행하기

  1. MySQL Workbench > Database > Migration Wizard를 클릭해 데이터 마이그레이션을 준비합니다. MySQL Workbench 데이터 마이그레이션 진행

    항목설정/입력값비고
    Source SelectionAWS Database 서버 접근 정보 입력Test Connection으로 접근 테스트 가능
    Target Selection카카오클라우드 데이터베이스 서버 접근 정보 입력Test Connection으로 접근 테스트 가능
    Schemas Selection마이그레이션을 진행할 스키마 선택튜토리얼에서는 Library Schemas 를 선택
    Source Objects대상 테이블 선택PROCEDURE 또는 FUNCTION 선택 가능
    Migration마이그레이션을 진행할 대상의 스크립트 생성
    Target Creation Options타겟 데이터베이스에 스키마 생성 및 SQL 스크립트 파일 생성
    Create Schemas테이블 생성 시작 및 로그 확인
    Bulk Data Transfer최종 데이터 이관 완료 로그 확인
안내

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

Step 3. 카카오클라우드 MySQL에서 Migration 데이터 확인

  1. 사전 준비 단계에서 설정한 Bastion 인스턴스에서 MySQL 인스턴스 그룹에 연결하기 위해, MySQL Client를 이용하여 가상 머신 인스턴스에서 MySQL 인스턴스 연결 명령을 실행합니다.

    MySQL 인스턴스 연결 명령어
    mysql --user={USER} --password={USER_PASSWORD} --host {ENDPOINT} --port {PORT}
    항목설명
    user{USER}: DB 사용자 이름
    - MySQL 인스턴스에 연결하는 DB 관리자 계정의 이름
    password{USER_PASSWORD}: MySQL 인스턴스 연결하는 관리자 계정의 초기 패스워드
    - MySQL 생성 시 입력한 비밀번호
    host{ENDPOINT}: MySQL 엔드포인트 정보
    - MySQL 인스턴스가 가지고 있는 엔드포인트
    port{PORT} : 사용자가 인스턴스 그룹을 만들 때 설정한 포트 번호
  2. 카카오클라우드 MySQL에서 library 스키마에 있는 book 테이블의 데이터 정합성을 확인합니다.

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

    mysql> select * from book;

2. MySQL Dump 활용

MySQL 덤프(MySQL Dump)는 데이터베이스의 데이터를 백업하거나 이관하기 위해 사용하는 유틸리티이자 명령입니다.

Step 1. AWS RDS 데이터 덤프

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

# 1. 카카오클라우드 VM에 접속
Bastion Server 인스턴스에 접속합니다.

# 2. AWS 읽기 전용 복제본 연결
shell> mysql --user=admin --password=admin1234 --host {aws-rds-read-replica}.ap-northeast-2.rds.amazonaws.com --port 3306

# 3. 읽기 전용 복제본 Replication 중지
mysql> 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)

mysql> exit
Bye

# 4. 읽기 전용 복제본 덤프
shell> mysqldump -h {aws-read-replica}.ap-northeast-2.rds.amazonaws.com \
-u admin \
-p \
--port=3306 \
--routines \
--triggers \
--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.
mysqldump: Got error: 1049: Unknown database 'erin-database' when selecting the database

# 5. 경고 메시지가 나오지만 덤프 파일 생성 확인 가능
shell> ls
aws_source.sql

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

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

# 카카오클라우드 MySQL로 접속
shell> mysql --user={USER} --password={USER_PASSWORD} --host {KAKAOCLOUD-MySQL-ENDPOINT} --port 3306

# 권한 부여
mysql> grant SYSTEM_VARIABLES_ADMIN,REPLICATION_SLAVE_ADMIN on *.* to 'admin'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye

# 데이터 가져오기
shell> mysql --user=admin --password=admin1234 --host {kc-mysql-endpoint} --port 3306 < aws_source.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
# 카카오클라우드 MySQL에 접속하여 덤프한 데이터가 임포트(import)됨을 확인

MySQL 데이터 Replication

카카오클라우드 MySQL에서 AWS RDS MySQL로 데이터를 마이그레이션하고 복제하는 방법을 소개합니다.

시나리오 아키텍처

Step 1. 포트 포워딩

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

포트 포워딩 전, 미리 체크할 사항
  • 카카오클라우드 VM의 외부 접속 포트 (예시: 4306)
  • NAT 인스턴스를 통한 내부 접속 포트 (예시: 3306)
    • 외부에서 4306 포트를 통해 접속하면 NAT 인스턴스를 통해 3306번 포트로 변경되어 카카오클라우드 MySQL로 데이터가 전송됩니다. 외부 접속 포트는 원하는 포트로 설정할 수 있습니다.
  • 카카오클라우드 VM 퍼블릭 IP, 프라이빗 IP
  1. 카카오클라우드 MySQL VM의 Endpoint IP를 확인합니다.

    shell> nslookup {KC_MySQL_ENDPOINT}
    ...
    Address: {MySQL_PRIVATE_IP}
  2. 카카오클라우드 VM에 접속합니다.

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

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

    shell> sudo vi /etc/ssh/sshd_config
    AllowTcpForwarding yes
    GatewayPorts yes
    # 위 두가지를 yes로 변경 후, 재시작
    shell> sudo /etc/init.d/ssh restart
    Restarting ssh (via systemctl): ssh.service.
  5. 커널에서 포트 포워딩을 설정합니다.

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

    # 4306 - 외부에서 접속될 포트입니다. 여기서는 4306을 이용합니다.
    shell> sudo iptables -t nat -A PREROUTING -p TCP --dport 4306 -j DNAT --to-destination {KC_MySQL_ENDPOINT_IP}:3306
    shell> sudo iptables -t nat -A POSTROUTING -p tcp -d {KC_MySQL_ENDPOINT_IP} --dport 3306 -j SNAT --to-source {KC_VM_PRIVATE_IP}
  7. 설정된 값을 확인합니다.

    shell> 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 데이터베이스 덤프를 수행합니다.

    shell> mysqldump -h {KC_MySQL_ENDPOINT} \
    -u admin \
    -p \
    --port=3306 \
    --single-transaction \
    --routines \
    --triggers \
    --databases {dump_DATABASE} > kc_replica.sql
    shell> Enter password: {ADMIN 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.
    # 경고 메시지가 뜨더라도 정상적으로 생성된 파일을 확인
  2. 카카오클라우드 VM에 생성된 덤프 파일을 사용하여 AWS RDS로 데이터를 임포트합니다.

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

    # 권한 부여
    mysql> grant SYSTEM_VARIABLES_ADMIN,REPLICATION_SLAVE_ADMIN on *.* to 'admin'@'%';
    Query OK, 0 rows affected (0.01 sec)

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

    mysql> exit
    Bye

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

    # AWS RDS에 접속
    shell> mysql --user=admin --password=admin1234 --host {aws-rds-replica-2-endpoint} --port 3306

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

    # AWS RDS에서 MySQL 복제 설정을 자동 GTID 모드로 전환
    mysql> 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)

    # 복제 상태 확인
    mysql> 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 서비스의 인입을 중단하여 최대한의 다운타임을 확보하고 데이터베이스에서의 트랜잭션 인입을 차단합니다. 이를 위해 현재 프로세스 목록을 확인하는 명령어를 실행합니다.

    mysql> 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_Source0인지 점검합니다. 이는 복제 지연이 없음을 의미합니다.

    mysql> show replica status\G;
    ...
    Second_Behind_Source : 0
  3. AWS RDS의 복제 상태도 동일하게 확인하여 Second_Behind_Source0인지 점검합니다.

    mysql> 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 설정을 해제하기 위해 다음 명령어를 실행합니다.
    mysql> set global read_only=0;
  3. AWS RDS Primary DB에서의 트랜잭션 발생을 차단하기 위해 ead_only 파라미터를 설정합니다.
    mysql> set global read_only=1;
  4. 카카오클라우드 MySQL에 커넥션이 정상적으로 연결되는지 확인한 후, 테스트 트랜잭션을 인입하여 기능이 정상 작동하는지 검증합니다.

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

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