Ncloud에서 MySQL GTID를 이용해 replication 생성하는 방법에 대한 상세 가이드입니다

GTID 란?

GTID는 Global Transaction Identifier의 약자로 MySQL 복제에서 서버의 각 트랜잭션을 구분하는 고유한 식별자입니다. GTID는 모든 트랜잭션과 1:1 관계이며, GTID를 활용하면 복제본으로 장애 조치, 계층적 복제, 특정 시점으로 백업 복구하는 등의 작업을 더 쉽게 구현할 수 있으며, 오류 발생 빈도도 줄일 수 있습니다.

GTID 구성

GTID는 source_id:transaction_id의 형태로 저장됩니다.

  • 예시: 2070b9863-4c88-72ef-9fa053db4612:1-12

source_id

여기서 source_id는 서버의 uuid이며 다음의 방법으로 확인할 수 있습니다.

mysql> SELECT @@server_uuid;
Ncloud에서 MYSQL GTID를 이용해 replication 생성하는 방법

테스트 환경

⁃ CentOS 7.8
⁃ MySQL 5.7
⁃ Master Server IP: 10.0.0.6
⁃ Slave Server IP: 10.0.0.7
⁃ VPC 대역: 10.0.0.0/16
⁃ Subnet 대역: 10.0.0.0/24
⁃ ACG: test3-vpc-default-acg

파라미터 설정

Master 서버와 Slave 서버에 각각 파라미터를 설정합니다.

# Master, Slave 
~# vi /etc/my.cnf

Master 서버

# Master 
[mysqld]
server-id=1
log-bin=binlog
gtid-mode=ON
enforce-gtid-consistency=ON
log_slave_updates=ON
Ncloud에서 MYSQL GTID를 이용해 replication 생성하는 방법

Slave 서버

# Slave
[mysqld]
server-id=2
log-bin=binlog
gtid-mode=ON
enforce-gtid-consistency=ON
log_slave_updates=ON
Ncloud에서 MYSQL GTID를 이용해 replication 생성하는 방법

gtid_mode 상태 확인

위 설정 변경 후 mysql DB를 재시작하고 Master와 Slave모두 gtid_mode가 ON상태인지 확인합니다.

# Master, Slave 
~# systemctl restart mysqld
/* Master, Slave */
mysql> show variables like '%gtid_mode%';

Master 서버

Ncloud에서 MYSQL GTID를 이용해 replication 생성하는 방법

Slave 서버

Ncloud에서 MYSQL GTID를 이용해 replication 생성하는 방법

Replication 전용 유저 생성

Master 서버에서 Replication 전용 유저를 생성합니다.

/* Master */
mysql> create user '3rd'@'%' identified by 'Test123$';
mysql> grant replication slave,replication client on *.* to '3rd'@'%';
mysql> flush privileges;
mysql> SELECT user,host,authentication_string FROM mysql.user;
Ncloud에서 MYSQL GTID를 이용해 replication 생성하는 방법

테스트용 DB 생성

테스트에 사용할 database를 생성합니다.

/* Master */
mysql> CREATE DATABASE testdb default CHARACTER SET UTF8;
mysql> show databases;
Ncloud에서 MYSQL GTID를 이용해 replication 생성하는 방법

백업 파일 생성

Master 서버에서 백업 파일을 생성합니다.

백업 디렉터리 생성

# Master
~# mkdir /root/db_backup

mysqldump 명령으로 백업 파일 생성

# Master 
~# mysqldump -u root -p -v --databases testdb \
--quick --single-transaction --routines --set-gtid-purged=ON \
--triggers --extended-insert --master-data=2 > /root/db_backup/testdb.sql
Ncloud에서 MYSQL GTID를 이용해 replication 생성하는 방법

백업 파일 복사

백업 파일을 Slave 서버로 복사하기 위해 Master 와 Slave 서버 모두 rsync를 설치합니다.
(백업 파일 복사는 rsync를 사용하지 않고 다른 방법을 사용해도 됩니다.)

~# yum -y install rsync

Master 서버

Ncloud에서 MYSQL GTID를 이용해 replication 생성하는 방법

Slave 서버

Ncloud에서 MYSQL GTID를 이용해 replication 생성하는 방법

ACG (방화벽) 설정

이제 Master, Slave 두 서버간에 동기화, 복제가 가능하도록 ACG (방화벽)를 설정합니다.
두 서버를 설치할 때 사용하도록 설정한 ACG는 test3-vpc-default-acg이기에 해당 ACG를 선택하고, ACG 규칙 설정에서 접근소스에는 Subnet의 IP 대역인 10.0.0.0/24, 허용포트는 22, 3306를 입력하고 추가합니다.

  • 접근소스: 10.0.0.0/24
  • 허용포트 22: rsync 사용을 위한 포트
  • 허용포트 3306: Replication을 위한 포트
Ncloud에서 MYSQL GTID를 이용해 replication 생성하는 방법

백업 파일 전송

Master -> Slave로 DB 백업 파일을 전송합니다.
전송 과정에서 정말 전송할 것인지 확인하는 단계와 Slave 서버의 root 패스워드를 확인하는 단계가 있습니다.

# rsync -avzr --progress testdb.sql root@슬레이브서버IP:~/

~# cd db_backup/
~# rsync -avzr --progress testdb.sql root@10.0.0.7:~/
Ncloud에서 MYSQL GTID를 이용해 replication 생성하는 방법

Slave 서버에서 DB 복원

rsync로 전송 받은 DB 백업 파일을 실행해서 DB를 복원합니다.

/* Slave */
mysql> source testdb.sql;
Ncloud에서 MYSQL GTID를 이용해 replication 생성하는 방법

Replication 설정

Slave 서버에서 Replication을 설정합니다.

/* Slave 
mysql> CHANGE MASTER TO MASTER_HOST='Master 서버 IP',
MASTER_USER='Replication 계정',MASTER_PASSWORD='Replication 계정 비번', 
MASTER_AUTO_POSITION=1;
*/

mysql> CHANGE MASTER TO MASTER_HOST='101.0.0.6',
MASTER_USER='3rd',MASTER_PASSWORD='Test123$', 
MASTER_AUTO_POSITION=1;

mysql> start slave;
Ncloud에서 MYSQL GTID를 이용해 replication 생성하는 방법

Replication 대기 상태 확인

Slave 서버에서 Replication 상태가 어떤지 확인합니다.
아래 명령어를 실행해보면 Master에서의 이벤트 전송을 대기 중이라는 메시지와 Master 서버의 정보를 확인할 수 있습니다.

/* Slave */
mysql> show slave status \G
Ncloud에서 MYSQL GTID를 이용해 replication 생성하는 방법

Replication 테스트

Master 서버에서 테스트용 테이블을 생성하고, 데이터를 입력한 후 Slave 서버에도 복제가 되었는지 확인합니다.

Master 서버에 테스트용 데이터 입력

/* Master */
mysql> use testdb;
mysql> create table 3rd (
    no int(10) auto_increment , 
    name varchar(10), 
    primary key(no));
mysql> insert into 3rd values(1,'3rd');
mysql> commit;
mysql> select * from 3rd;
Ncloud에서 MYSQL GTID를 이용해 replication 생성하는 방법

Slave 서버에서 복제 확인

/* Slave */
mysql> use testdb;
mysql> select * from 3rd;
Ncloud에서 MYSQL GTID를 이용해 replication 생성하는 방법

추가 테스트

추가로 데이터를 다시 입력해보면 정상적으로 복제가 되는 것을 확인할 수 있습니다.

Master 서버

Ncloud에서 MYSQL GTID를 이용해 replication 생성하는 방법

Slave 서버

Ncloud에서 MYSQL GTID를 이용해 replication 생성하는 방법

오류 상황

Master 서버에서 데이터를 입력해도 Slave 서버에 제대로 복제되지 않는 등 Replication 기능에 문제가 생겼을 때에는 위쪽에서도 사용했었던 다음 명령어로 Replication 상태를 확인해봅니다.

/* Slave */
mysql> show slave status \G

혹시 Slave_IO_State: Connecting to master 등의 Master 서버에 연결하지 못한다는 메시지가 보이는 경우 ACG (방화벽) 설정에 문제가 있는 것이니 위쪽에서 설정했던 ACG (방화벽) 설정 을 다시 한번 확인해보시기 바랍니다.

Ncloud에서 MYSQL GTID를 이용해 replication 생성하는 방법

참고 URL

  1. GTID를 이용한 Mysql 복제 가이드