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;
테스트 환경
⁃ 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
Slave 서버
# Slave
[mysqld]
server-id=2
log-bin=binlog
gtid-mode=ON
enforce-gtid-consistency=ON
log_slave_updates=ON
gtid_mode 상태 확인
위 설정 변경 후 mysql DB를 재시작하고 Master와 Slave모두 gtid_mode가 ON상태인지 확인합니다.
# Master, Slave
systemctl restart mysqld
/* Master, Slave */
mysql> show variables like '%gtid_mode%';
Master 서버
Slave 서버
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;
테스트용 DB 생성
테스트에 사용할 database를 생성합니다.
/* Master */
mysql> CREATE DATABASE testdb default CHARACTER SET UTF8;
mysql> show databases;
백업 파일 생성
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
백업 파일 복사
백업 파일을 Slave 서버로 복사하기 위해 Master 와 Slave 서버 모두 rsync를 설치합니다.
(백업 파일 복사는 rsync를 사용하지 않고 다른 방법을 사용해도 됩니다.)
yum -y install rsync
Master 서버
Slave 서버
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을 위한 포트
접근 소스: 여기서는 테스트를 위해 접근소스에 Subnet IP 전체 대역을 지정했지만, 실제 서비스 환경에서는 해당 Subnet에 DB서버 외에 다른 서버들이 존재하는 경우도 있을 수 있으므로 각 DB서버 IP만 지정하는 것이 보안 측면에서는 더욱 안전할 수 있습니다.
백업 파일 전송
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:~/
Slave 서버에서 DB 복원
rsync로 전송 받은 DB 백업 파일을 실행해서 DB를 복원합니다.
/* Slave */
mysql> source testdb.sql;
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;
Replication 대기 상태 확인
Slave 서버에서 Replication 상태가 어떤지 확인합니다.
아래 명령어를 실행해보면 Master에서의 이벤트 전송을 대기 중이라는 메시지와 Master 서버의 정보를 확인할 수 있습니다.
/* Slave */
mysql> show slave status \G
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;
Slave 서버에서 복제 확인
/* Slave */
mysql> use testdb;
mysql> select * from 3rd;
추가 테스트
추가로 데이터를 다시 입력해보면 정상적으로 복제가 되는 것을 확인할 수 있습니다.
Master 서버
Slave 서버
오류 상황
Master 서버에서 데이터를 입력해도 Slave 서버에 제대로 복제되지 않는 등 Replication 기능에 문제가 생겼을 때에는 위쪽에서도 사용했었던 다음 명령어로 Replication 상태를 확인해봅니다.
/* Slave */
mysql> show slave status \G
혹시 Slave_IO_State: Connecting to master
등의 Master 서버에 연결하지 못한다는 메시지가 보이는 경우 ACG (방화벽) 설정에 문제가 있는 것이니
위쪽에서 설정했던 **ACG (방화벽) 설정 **을 다시 한번 확인해보시기 바랍니다.
Slave_IO_State: Connecting to master
Slave_IO_Running: Connecting
참고 URL
- GTID를 이용한 Mysql 복제 가이드
https://dev.mysql.com/doc/refman/5.7/en/replication-gtids.html
문서 업데이트 내역
날짜 | 내용 |
---|---|
2022-04-08 | 문서 최초 생성 |