Last Updated on 7월 21, 2024 by Jade(정현호)
안녕하세요
이번 글은 AWS RDS for MySQL에 새롭게 추가된 MSR(Multi Source Replication) 복제 기능에 대해서 확인해보도록 하겠습니다.
Contents
MSR - Multi Source Replication
Multi Source Replication (MSR)는 여러 개의 복제 Source DB를 1개의 Replica 인스턴스에 연결하여 복제하는 구조로, 여러 개의 Source DB의 내용을 하나의 Replica에 모으는 역할을 하게 됩니다. (Multi Source 의 구조)
이렇게 한 곳으로 여러 Source 인스턴스의 데이터를 복제를 구성함으로 다양한 방식으로 MySQL을 더 잘 활용할 수 있는 유용한 기능입니다.
RDS for MySQL의 MSR(Multi Source Replication)
AWS RDS for MySQL에서 MSR(Multi Source Replication) 기능이 정식적으로 지원됨을 2024년 1월 16일에 공식 발표하였습니다.
• RDS for MySQL now supports MSR
다중 소스 복제(MSR)를 사용하면 둘 이상의 MySQL용 RDS 소스 DB 인스턴스에서 바이너리 로그 이벤트를 수신하는 복제본으로 MySQL용 Amazon RDS DB 인스턴스를 설정할 수 있습니다.
다중 소스 복제는 다음 RDS for MySQL 엔진 버전을 실행하는 MySQL용 RDS DB 인스턴스에 대해 지원됩니다.
- 8.0.35 and higher minor versions
- 5.7.44 and higher minor versions
RDS for MySQL MSR 복제 구성은 최대 15개까지 Source 인스턴스를 지원합니다.
다음 사례는 MySQL용 RDS에서 다중 소스 복제(MSR)를 사용하기에 좋은 사례입니다.
- 별도의 DB 인스턴스에 있는 여러 샤드를 단일 샤드로 병합하거나 결합해야 하는 애플리케이션
- 여러 소스에서 통합된 데이터로부터 보고서를 생성해야 하는 애플리케이션
- 여러 MySQL용 RDS DB 인스턴스에 분산된 데이터의 통합 장기 백업을 생성하기 위한 요구 사항 구현
MSR 기능을 지원하는 버전의 RDS for MySQL을 생성이 되었다면 다음과 같은 방법으로 MSR 복제를 구성할 수 있습니다.
[참고] MySQL Community(설치형 MySQL)에서의 MSR에 대한 내용은 다음 포스팅을 참고하시면 됩니다.
• MySQL MSR Replication 구성 - Multi Source Replication
MSR 복제 구성
복제 유저 생성
복제를 구성하기 위해서 먼저 Source 인스턴스(RDS)에서 복제 전용 유저의 생성이 필요하며 다음과 같이 생성을 합니다.
mysql> CREATE USER 'repl_user' IDENTIFIED BY 'repl_user'; mysql> GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user';
* 위의 생성 구문에서의 패스워드 및 대역대는 예시입니다.
초기 데이터 입력
Source 인스턴스에서 mysqldump 등을 통해서 초기 데이터 추출 및 MSR 복제 인스턴스에 데이터 로드를 해야 합니다.
Source 인스턴스가 데이터 변경이 없다면 다음과 같이 dump를 하고 포지션 정보를 조회하여 복제를 구성할 수 있습니다.
• dump 명령어 예시
$ mysqldump --databases database_name \ --single-transaction \ --compress \ --order-by-primary \ -u RDS_user_name \ -p RDS_password \ --host=RDS Endpoint
• binlog 파일 및 포지션 정보 조회 예시
mysql> SHOW MASTER STATUS File Position ----------------------------------- mysql-bin-changelog.000031 107 -----------------------------------
데이터가 계속 입력/수정이 이루어지는 사용되는 인스턴스의 경우 스냅샷 백업 복원을 통해 포지션 정보 확인 및 데이터 dump를 수행해야 합니다.
snapshot을 통해 RDS 생성이 완료되었다면 Logs & events 탭에서 아래 이미지와 같이 binlog 파일명과 position 정보를 확인할 수 있습니다.
임시로 생성된 해당 RDS를 통해서 dump를 수행 후 MSR 인스턴스에 데이터를 로드 합니다.
복제 설정 및 시작
그 다음으로 MSR 복제를 구성하려는 DB 인스턴스에 접속하여 다음과 같이 전용 프로시저를 호출하여 복제 정보를 설정합니다.
mysql> CALL mysql.rds_set_external_source_for_channel( 'mysql-01.xxx.ap-northeast-2.rds.amazonaws.com', 3306, 'repl_user', 'repl_user', 'mysql-bin-changelog.081662', 534, 0, 'ch_test_1'); mysql> CALL mysql.rds_set_external_source_for_channel( 'mysql-02.xxx.ap-northeast-2.rds.amazonaws.com', 3306, 'repl_user', 'repl_user', 'mysql-bin-changelog.081661', 157, 0, 'ch_test_2');
* 채널명 및 기타 정보는 모두 예시입니다.
설정이 완료되었다면 채널별로 복제를 시작합니다. 글에서는 ch_test_1, ch_test_2 이름으로 복제를 설정하였습니다.
mysql> CALL mysql.rds_start_replication_for_channel('ch_test_1'); +--------------------------------------------+ | Message | +--------------------------------------------+ | Replication started for channel 'ch_test_1'| | and replication is now running normally. | +--------------------------------------------+ mysql> CALL mysql.rds_start_replication_for_channel('ch_test_2'); +--------------------------------------------+ | Message | +--------------------------------------------+ | Replication started for channel 'ch_test_1'| | and replication is now running normally. | +--------------------------------------------+ * 가로 길이에 따라서 출력 결과는 개행되어 표시하였습니다.
복제가 정상적으로 시작되었다면 위와 같이 "running normally" 라는 메세지를 확인할 수 있습니다.
복제 상세 정보를 확인하기 위해서는 다음과 같이 확인합니다.
mysql> show replica status\G *************************** 1. row *************************** Replica_IO_State: Source_Host: mysql-01.xxx.ap-northeast-2.rds.amazonaws.com Source_User: repl_user Source_Port: 3306 Connect_Retry: 60 Source_Log_File: mysql-bin-changelog.081665 Read_Source_Log_Pos: 534 Relay_Log_File: relaylog-ch_test_1.000008 Relay_Log_Pos: 770 Relay_Source_Log_File: mysql-bin-changelog.081665 Replica_IO_Running: Yes Replica_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Source_Log_Pos: 534 Relay_Log_Space: 4448 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Source_SSL_Allowed: No Source_SSL_CA_File: Source_SSL_CA_Path: Source_SSL_Cert: Source_SSL_Cipher: Source_SSL_Key: Seconds_Behind_Source: NULL Source_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Source_Server_Id: 1752446441 Source_UUID: 9832982d-b50d-11ee-b250-06519d710584 Source_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Replica_SQL_Running_State: Slave has read all relay log; waiting for more updates Source_Retry_Count: 86400 Source_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Source_SSL_Crl: Source_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: ch_test_1 Source_TLS_Version: Source_public_key_path: Get_Source_public_key: 0 Network_Namespace: *************************** 2. row *************************** Replica_IO_State: Waiting for master to send event Source_Host: mysql-02.xxx.ap-northeast-2.rds.amazonaws.com Source_User: repl_user Source_Port: 3306 Connect_Retry: 60 Source_Log_File: mysql-bin-changelog.081680 Read_Source_Log_Pos: 534 Relay_Log_File: relaylog-ch_test_2.000040 Relay_Log_Pos: 770 Relay_Source_Log_File: mysql-bin-changelog.081680 Replica_IO_Running: Yes Replica_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Source_Log_Pos: 534 Relay_Log_Space: 1040 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Source_SSL_Allowed: No Source_SSL_CA_File: Source_SSL_CA_Path: Source_SSL_Cert: Source_SSL_Cipher: Source_SSL_Key: Seconds_Behind_Source: 0 Source_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Source_Server_Id: 696627931 Source_UUID: eb0a2ea9-b50d-11ee-9791-0690d07e403c Source_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Replica_SQL_Running_State: Slave has read all relay log; waiting for more updates Source_Retry_Count: 86400 Source_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Source_SSL_Crl: Source_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: ch_test_2 Source_TLS_Version: Source_public_key_path: Get_Source_public_key: 0 Network_Namespace: 2 rows in set (0.00 sec) * 일부 내용은 가로길이에 따라서 생략되었습니다.
채널 별로 복제에 대한 다양한 정보를 확인할 수 있습니다.
MSR 복제를 설정하거나 초기화 하는 등의 MSR 복제와 관련된 제어는 새롭게 추가된 별도의 프로시저를 통해서 실행하며, 새롭게 추가된 프로시저 목록은 다음과 같습니다.
mysql> SELECT routine_name FROM information_schema.routines where ROUTINE_NAME like '%channel%' +--------------------------------------------------------+ | ROUTINE_NAME | +--------------------------------------------------------+ | rds_clean_replication_status_for_channel | | rds_reset_external_source_for_channel | | rds_set_external_source_with_auto_position_for_channel | | rds_start_replication_for_channel | | rds_stop_replication_for_channel | | rds_replication_service_state_for_channel | | rds_group_replication_set_recovery_channel | | rds_next_source_log_for_channel | | rds_set_external_source_for_channel | | rds_set_external_source_with_delay_for_channel | | rds_set_source_auto_position_for_channel | | rds_set_source_delay_for_channel | | rds_skip_repl_error_for_channel | | rds_start_replication_until_for_channel | | rds_start_replication_until_gtid_for_channel | +--------------------------------------------------------+
예를 들어 채널별로 복제를 멈춤(stop) 하거나 리셋의 경우 다음과 같이 프로시저를 사용합니다.
mysql> CALL mysql.rds_stop_replication_for_channel('ch_test_1'); mysql> CALL mysql.rds_reset_external_source_for_channel('ch_test_1');
복제에 문제가 발생하여 문제가 발생한 내역에 대해서 skip 처리를 하려고 할 경우 채널별로 다음과 같이 프로시저를 사용합니다.
mysql> call mysql.rds_skip_repl_error_for_channel('ch_test_1');
이번 글에서는 RDS for MySQL 5.7.44, 8.0.35 버전부터 새롭게 추가된 MSR(Multi Source Replication) 복제에 대해서 확인해보았습니다.
RDS for MySQL 8버전 MSR 기능 또는 1:1 External Replication을 사용할 경우 복제 에러 처리에 관한 replica_exec_mode 파라미터에 대한 내용도 추가로 읽어 보시면 External Replication 사용에 도움이 되실 것 같습니다.
긴 글 읽어주셔서 감사합니다 여기서 글을 마무리하도록 하겠습니다.
Reference
Reference URL
• RDS for MySQL now supports MSR
• Configuring MSR for RDS for MySQL
연관된 다른 글
Principal DBA(MySQL, AWS Aurora, Oracle)
핀테크 서비스인 핀다에서 데이터베이스를 운영하고 있어요(at finda.co.kr)
Previous - 당근마켓, 위메프, Oracle Korea ACS / Fedora Kor UserGroup 운영중
Database 외에도 NoSQL , Linux , Python, Cloud, Http/PHP CGI 등에도 관심이 있습니다
purityboy83@gmail.com / admin@hoing.io