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
-
카카오클라우드 콘솔 > VPC > 보안 그룹 메뉴로 이동합니다. 아래 표를 참조하여 보안 그룹을 생성합니다.
이름 설명(선택) tutorial-bastion-sg Bastion 호스트의 보안정책 -
하단의 [+ 추가하기] 버튼을 클릭 후, 인바운드 조건을 아래와 같이 설정하고 [적용] 버튼을 클릭합니다.
나의 퍼블릭 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으로, 원격으로 클라우드 인스턴스에 안전하게 접근할 수 있는 게이트웨이 역할을 수행합니다.
- 카카오클라우드 콘솔 > Beyond Compute Service > Virtual Machine 메뉴로 이동합니다.
- 아래 표의 항목과 값을 참조하여 Bastion 호스트의 역할을 할 VM 인스턴스를 생성합니다.
구분 | 항목 | 설정/입력값 | 비고 |
---|---|---|---|
기본 정보 | 이름 | tutorial-bastion | |
개수 | 1 | ||
이미지 | Ubuntu 20.04 | ||
인스턴스 타입 | m2a.large | ||
볼륨 | 루트 볼륨 | 20 | |
키 페어 | {USER_KEYPAIR} | ⚠️ 키 페어는 최초 1회 안전하게 보관해야 합니다. 잃어버린 키는 복구할 수 없으며, 재발급이 필요합니다. | |
네트워크 | VPC | tutorial | |
서브넷 | main (10.0.0.0/20) | ||
보안 그룹 | tutorial-bastion-sg |
4. MySQL 데이터베이스 생성
데이터 마이그레이션을 위한 MySQL 인스턴스를 생성합니다. 카카오클라우드의 MySQL은 완전 관리형 데이터베이스 서비스로, 복잡한 설치 없이 콘솔에서 간편하게 MySQL 인스턴스를 프로비저닝할 수 있습니다. 또한, 논리적으로 분리된 네트워크에서 안전하게 사용할 수 있습니다.
-
카카오클라우드 콘솔 > Data Store > MySQL 메뉴로 이동합니다.
-
인스턴스 그룹 탭에서 [인스턴스 그룹 생성] 버튼을 클릭 후, 다음을 참고하여 인스턴스 그룹을 생성합니다.
구분 항목 설정/입력값 비고 기본 설정 인스턴스 그룹 이름 tutorial-mysql 설명 선택 MySQL 설정 엔진 버전 지정된 값을 사용 MySQL 사용자 이름 admin MySQL 비밀번호 root1234 인스턴스 가용성/개수 단일 (Primary 인스턴스) 인스턴스 타입 m2a.large 스토리지 타입/크기 100 로그 스토리지 타입/크기 100 네트워크 설정 VPC tutorial 서브넷 {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 접속하기
-
Window 인스턴스 연결를 참고하여 VM 인스턴스에 MySQL Workbench를 설치하기 위해 RDP로 접근합니다.
-
MySQL Workbench 다운로드 공식 홈페이지에서 다운로드 및 설치를 진행합니다.
Step 2. 데이터 마이그레이션 진행하기
-
MySQL Workbench > Database > Migration Wizard를 클릭해 데이터 마이그레이션을 준비합니다.
항목 설정/입력값 비고 Source Selection AWS 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 데이터 확인
-
사전 준비 단계에서 설정한 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}
: 사용자가 인스턴스 그룹을 만들 때 설정한 포트 번호 -
카카오클라우드 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
-
카카오클라우드 MySQL VM의 Endpoint IP를 확인합니다.
shell> nslookup {KC_MySQL_ENDPOINT}
...
Address: {MySQL_PRIVATE_IP} -
카카오클라우드 VM에 접속합니다.
shell> ssh -i {PATH_TO_PRIVATE_KEY} {USERNAME}@{INSTANCE_IP}
-
(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 상태 확인 -
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. -
커널에서 포트 포워딩을 설정합니다.
shell> sudo vi /etc/sysctl.conf
net.ipv4.ip_forward=1
shell> sudo sysctl -p /etc/sysctl.conf
net.ipv4.ip_forward = 1 # 출력 값 -
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} -
설정된 값을 확인합니다.
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 데이터 덤프 및 복제 설정
-
카카오클라우드 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.
# 경고 메시지가 뜨더라도 정상적으로 생성된 파일을 확인 -
카카오클라우드 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. -
카카오클라우드 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, 마스터)하는 방법을 단계별로 소개합니다.
Step 1. DB Replication 트랜잭션 상태 확인
-
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 |
+----------+----------+---------------------+--------+------------------+----------+---------------------------------------------------------------+------------------+ -
카카오클라우드 Replica MySQL DB의 동기화를 확인하여
Second_Behind_Source
가0
인지 점검합니다. 이는 복제 지연이 없음을 의미합니다.mysql> show replica status\G;
...
Second_Behind_Source : 0 -
AWS RDS의 복제 상태도 동일하게 확인하여
Second_Behind_Source
가0
인지 점검합니다.mysql> show replica status\G;
...
Second_Behind_Source : 0
Step 2. 어플리케이션들의 MySQL DB Endpoint 변경
- 기존 AWS RDS Primary DB에 연결된 모든 어플리케이션을 카카오클라우드 MySQL로 DB 엔드포인트를 변경합니다.
- 동시에, 카카오클라우드 MySQL DB의
read_only
설정을 해제하기 위해 다음 명령어를 실행합니다.mysql> set global read_only=0;
- AWS RDS Primary DB에서의 트랜잭션 발생을 차단하기 위해
ead_only
파라미터를 설정합니다.mysql> set global read_only=1;
- 카카오클라우드 MySQL에 커넥션이 정상적으로 연결되는지 확인한 후, 테스트 트랜잭션을 인입하여 기능이 정상 작동하는지 검증합니다.
Step 3. AWS RDS Primary 분리 및 카카오클라우드 MySQL 인스턴스로 Primary 승격
- 카카오클라우드 MySQL에서 AWS RDS로부터 복제되어 넘어오는 트랜잭션이 없는지 최종적으로 확인합니다.
mysql> show replica status\G;
...
Second_Behind_Source : 0 # <- 확인 - 복제 동기화를 중단하고 AWS RDS Primary를 분리하여 카카오클라우드 MySQL로 승격하는 과정은 다음과 같습니다.
mysql> stop replica;
mysql> reset replica all; - 모든 변경 사항이 정상적으로 적용되었는지 서비스 상태를 최종적으로 점검합니다.