AWS

[AWS] RDS MySQL - binlog 기반 인스턴스 간 복제

비번변경 2023. 9. 29. 18:23

개요

RDS 백업 등을 위한 복제 방법은 여러 가지가 존재하는데, 이 글에서는 RDS 인스턴스 설정 변경 및 교체가 필요해 binlog 기반으로 서로 다른 RDS 간 복제 설정을 해보려고 한다.

 

진행 방식은 크게 다음과 같다.

1. 원본 인스턴스 binlog 사용 여부 확인 및 보존 기간 설정

2. 읽기 전용 복제본에서 복제 시작점 확인

3. 복제 인스턴스에서 원본 인스턴스 복제 설정 및 시작

 

binlog 기반 복제를 사용하면 교차 계정/교차 리전 간 복제, on-prem과 AWS 간 복제, mysql과 aurora 간의 복제 등등을 수행할 수 있다.

 

 

원본 인스턴스 설정

복제할 원본 인스턴스가 binlog를 사용하고 있는지 확인하고, 외부 인스턴스가 binlog를 사용할 수 있도록 관련 설정을 변경한다.

 

1. 원본 인스턴스 binlog 활성화 확인

복제할 원본 인스턴스가 binlog를 사용하고 있는지 확인하고 조치한다. AWS RDS가 binlog를 사용하기 위해서는 자동 백업이 활성화되어 있어야 한다.

참고 : 2023.09.28 - [AWS] RDS - You are not using binary logging

 

2. 원본 인스턴스 binlog 보존 기간 설정

RDS는 가능한 빠르게 binlog를 삭제하는데, 외부 인스턴스가 binlog에 접근하여 데이터베이스 변경 사항을 적용할 수 있을 정도의 binlog retention hours(로그 유지 기간) 값을 설정한다.

아래 예시는 24시간 동안 유지하도록 설정한 것으로, autocommit 상태에서 실행해야 한다. (https://stackoverflow.com/questions/58689139/1694-hy000-cannot-modify-session-sql-log-bin-inside-a-transaction)

call mysql.rds_set_configuration('binlog retention hours', 24);

참고로 기본 설정은 다음과 같다.

CALL mysql.rds_show_configuration;

 

 

읽기 전용 복제본 작업

복제본 인스턴스에서 쓰기 중지 없이 복제를 시작할 시점 등을 확인하기 위한 목적으로 읽기 전용 복제본을 생성하여 binlog 정보를 확인한다.

 

1. 원본 인스턴스의 읽기 전용 복제본 생성

원본 인스턴스 선택 > 작업 > 읽기 전용 복제본 생성

스냅샷 복원 시의 구성 설정과 크게 다르지 않아 보여 설정 화면은 생략한다. 참고로 암호화 되지 않은 RDS 인스턴스로 암호회된 읽기 전용 복제본 생성은 불가능하다.

 

2 읽기 전용 복제본과 원본 비교

읽기 전용 복제본에 접속한 뒤, 아래 명령을 실행하여 읽기 전용 복제본과 원본이 동일한지 확인한다. MySQL 엔진 버전에 따라 Seconds_Behind_Master 또는 Seconds_Behind_Source의 값이 0인지를 확인한다.

참고 : https://dev.mysql.com/doc/refman/8.0/en/show-slave-status.html

SHOW SLAVE STATUS;

-- 또는
SHOW REPLICA STATUS;

 

 

3. 읽기 전용 복제본에서 복제 중지

call mysql.rds_stop_replication();

수행 시 아래와 같은 출력을 확인할 수 있다.

 

4. 읽기 전용 복제본에서 현재까지 처리된 binlog 정보 확인

아래 명령을 실행하여 아래 두 개 값을 확인 및 기록한다. 컬럼 이름은 MySQL 버전에 따라 다를 수 있다.

  • Relay_Master_Log_File 및 Exec_Master_Log_Pos 값
  • 또는 Relay_Source_Log_File 및 Exec_Source_Log_Pos 값
SHOW SLAVE STATUS;

-- 또는
SHOW REPLICA STATUS;

 

5. 읽기 전용 복제본 스냅샷 생성

외부 인스턴스를 생성하기 위해 읽기 전용 복제본의 스냅샷을 생성한다.

2023.09.25 - [AWS] RDS - 스냅샷 생성/삭제

 

 

복제 작업

생성한 스냅샷으로 RDS 인스턴스를 복원하고, 원본 인스턴스를 대상으로 복제 설정한다.

 

1. 원본 인스턴스 - 복제 사용자 생성 및 권한 부여

복제 인스턴스가 원본 인스턴스에 접근할 수 있도록 사용자를 생성하고, 복제 관련 권한을 부여한다.

CREATE USER 'repl_user'@'<domain_name>' IDENTIFIED BY '<password>';
GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO  'repl_user'@'<domain_name>';

 

2. 스냅샷 복원

생성한 읽기 전용 복제본의 스냅샷으로 RDS 인스턴스를 복원한다.

2023.09.26 - [AWS] RDS - 스냅샷으로 RDS 복원

😐 참고로 이 글에서는 암호화 되지 않은 인스턴스에서 암호화된 인스턴스로 복제 설정이 동작하는지 확인하고자 생성한 스냅샷은 암호화했다.

2023.09.27 - [AWS] RDS - 암호화되지 않은 RDS 암호화

 

3. 복제 인스턴스에 복제 설정

스냅샷으로 복원한 인스턴스에 복제를 설정을 한다.

mysql_binary_log_file_name, mysql_binary_log_file_location에는 읽기 전용 복제본에서 확인한 바이너리 로그 파일 정보를 지정한다.

CALL mysql.rds_set_external_master (
  host_name
  , host_port
  , replication_user_name
  , replication_user_password
  , mysql_binary_log_file_name
  , mysql_binary_log_file_location
  , ssl_encryption
  );
  
-- 예시
CALL mysql.rds_set_external_master (
  'idb.c.ap-northeast-2.rds.amazonaws.com'
  , 3310
  , 'repl_user'
  , 'passwd'
  , 'mysql-bin-changelog.000071'
  , 534
  , 0
  );

 

3. 복제 시작

복제 인스턴스에서 아래 명령어를 실행하여 복제를 실행한다. 출력은 아래와 같다.

CALL mysql.rds_start_replication;

 

 

복제 상태 확인

복제를 시작하고 상태를 확인한다.

SHOW SLAVE STATUS;

-- 또는
SHOW REPLICA STATUS;

현재 binlog 정보도 확인해본다.

이상이 없으면 이 시점에서 읽기 전용 복제본은 삭제해도 된다.

 

 

테스트

실제로 원본 인스턴스에 데이터베이스를 생성하여 복제 인스턴스에서 적용이 되는지도 확인해보았다.

현재 DB 목록은 다음과 같다.

CREATE DATABASE airflow CHARACTER SET utf8mb4;

위 명령어로 DB를 생성한 결과는 다음과 같다.

약간의 지연이 있은 뒤, 복제본 인스턴스에서도 생성된 모습을 확인할 수 있다.

읽기 전용 복제본은 복제를 중지해두었으므로 반영되지 않는다.

 

 

 

참고 문서

https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.External.Repl.html

 

 

728x90