■ GTID를 이용한 복제 설정.
여기에서는 처음으로 GTID를 이용하여 처음 설정하는 "콜드 스타트"방법입니다. 이 포스트를 통해서 복제를 어떻게 설정하고, 주의할점은 무엇인지 알아봅니다.
■ 서버준비
가능하면 같은 사양의 물리서버를 준비합니다. 그리고 같은 버전의 MySQL을 설치합니다. 여기에서는 5.7 위주로 설명을 합니다.
다음의 환경으로 설정되어 있다고 가정합니다.
서버 | IP | MySQL Version |
마스터 | 192.168.0.101 | 5.7 |
슬레이브 | 192.168.0.102 | 5.7 |
■ 파라미터 설정
마스터 슬레이브 서버 모두에 다음의 파라미터를 설정합니다.
▶ 서버별 설정할 파라미터
mysqld 섹션에 작성합니다.
[mysqld]
server-id=1
log-bin=binlog
gtid-mode=ON
enforce-gtid-consistency=ON
log_slave_updates=ON
▶ 파라미터 설명
server-id : 서버별로 다르게 설정합니다. 여기의 예제에서는 master서버는 1, Slave서버는 2로 설정합니다. 서버마다 번호만 다르면 됩니다.
bin-log : 바이너리 로그 디렉토리 및 바이너리 로그 이름입니다.
gtid-mode=ON : GTID 모드 설정한다는 의미입니다.
log_slave_updates=ON : 복제본 서버가 소스 서버에서 수신한 업데이트를 복제본의 자체 바이너리 로그에 기록해야 하는지 여부를 나타냅니다.
이 옵션을 활성화하면 A->B->C 복제환경에서 B서버가 C서버의 마스터 역활도 할수가 있게 됩니다.
위의 파라미터 설정 후 MySQL서버를 재시작합니다.
■ 복제 유저 설정
replcation 권한을 가지는 복제전용 유저를 마스터 서버에서 생성합니다. 슬레이브에서 이 유저를 이용해 마스터에 붙어서 바이너리 로그파일을 읽어온다.
그리고 읽어온 로그 파일의 내용을 슬레이브에 적용한다.
▶ 유저 생성
//IP 입력란에 Slave IP 입력
mysql> CREATE USER 'repl'@'192.168.0.102' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.102';
▶ MySQL 8.0 유저 생성시 유의사항 (MySQL 8.0에만 해당됩니다.)
MySQL 8.0은 기본적으로 caching_sha2_password로 생성됩니다. 8.0.34부터 mysql_native_password는 Deprecated라고 명시되었기 때문에 이 암호 플러그인으로 생성하지 않으면 추후 업그레이드시 에러가 발생할 수 있습니다. 그리고 caching_sha2_password는 인증서를 통한 접속방식이기 때문에 인증서 또한 필요합니다.
mysql > select user, host, plugin from mysql.user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
......
| repl | % | caching_sha2_password |
+------------------+-----------+-----------------------+
위와 같이 caching_sha2_password로 생성된것을 확인할수가 있습니다. 그리고 인증서가 준비되어야 하는데 만약 준비되어 있지 않다면 기본적으로 제공되는 키를 이용해서 접속이 가능합니다.
MySQL 데이터 디렉토리에 이동해서 확인해보면 다음과 같은 키가 있습니다.(MySQL 인증서 위치 설정에 따라 다를 수 있습니다.)
private_key.pem, public_key.pem
이 두개의 키는 caching_sha2_password_auto_generate_rsa_keys 라는 파라미터에 의해 자동으로 생성이 됩니다. 확인방법은 다음과 같습니다.
mysql> show variables like 'caching_sha2_password_private_key_path';
+----------------------------------------+-----------------+
| Variable_name | Value |
+----------------------------------------+-----------------+
| caching_sha2_password_private_key_path | private_key.pem |
+----------------------------------------+-----------------+
mysql> show variables like 'caching_sha2_password_public_key_path';
+---------------------------------------+----------------+
| Variable_name | Value |
+---------------------------------------+----------------+
| caching_sha2_password_public_key_path | public_key.pem |
+---------------------------------------+----------------+
이중에서 복제에 구성하려면 public_key.pem이 필요한데 이 키는 자동으로 다음 상태변수에 저장됩니다.
mysql> SHOW STATUS LIKE 'Caching_sha2_password_rsa_public_key'\G;
*************************** 1. row ***************************
Variable_name: Caching_sha2_password_rsa_public_key
Value: -----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5tv10//iGJ8SvRLavbUp
fTBzqGbj9cTeeOZPINET/Be81X0ssfFfkk7e4m3ZJcZSzvSu+SYTGQ6nlsS4eKHG
wnQlCfyct5+aroATf2c36qXMjwrCR5FfffgNuT/Dhw+Oo4TOsWBxlrT1+tXj1rWN
oVkYKoh0In0o7nWz5Y8V3QmxbaWpO8S6Lw1dmSjxac9mJP2QoUJMXu8Q4ndVBj04
WdZBla1QDjKbymWzkHOkMiZds8lqFSJFbxsxxwdfVw0gR5jGBelhcmdTnBNp6NbW
Jh8oYsiB4cezUZVwq6uLcMdWr+gQZGTv0B7odbrYWjvwgHrIMkQmvJF7Q7mwHG6m
DwIDAQAB
-----END PUBLIC KEY-----
1 row in set (0.0117 sec)
ERROR: 1065 (42000): Query was empty
터미널에서 파일을 확인해보면 내용이 같다는 것을 확인해볼 수 있습니다.
shell> cat public_key.pem
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5tv10//iGJ8SvRLavbUp
fTBzqGbj9cTeeOZPINET/Be81X0ssfFfkk7e4m3ZJcZSzvSu+SYTGQ6nlsS4eKHG
wnQlCfyct5+aroATf2c36qXMjwrCR5FfffgNuT/Dhw+Oo4TOsWBxlrT1+tXj1rWN
oVkYKoh0In0o7nWz5Y8V3QmxbaWpO8S6Lw1dmSjxac9mJP2QoUJMXu8Q4ndVBj04
WdZBla1QDjKbymWzkHOkMiZds8lqFSJFbxsxxwdfVw0gR5jGBelhcmdTnBNp6NbW
Jh8oYsiB4cezUZVwq6uLcMdWr+gQZGTv0B7odbrYWjvwgHrIMkQmvJF7Q7mwHG6m
DwIDAQAB
-----END PUBLIC KEY-----
만약 SHOW STATUS LIKE 'Caching_sha2_password_rsa_public_key'\G; 로 내용 확인 시 아무것도 보이지 않는다면 public_key.pem와 private_key.pem에 대한 OS 소유권을 확인해봅니다. 보통 mysql로 되어 있는데 root나 다른 권한으로 되어 있다면 mysql로 변경합니다. 이 내용이 보이지 않는다면 CHANGE REPLICATION SOURCE 명령시 해당 소스 서버에 접속할 수 없다는 에러 메세지를 출력합니다. 반드시 내용이 출력되어야 합니다.
■ 복제 설정을 위한 데이터 덤프 생성 및 데이터 전송 데이터 전송
복제 설정을 위해 마스터에서 데이터를 덤프 후 슬레이브로 해당 덤프를 전송합니다.
▶ 데이터 덤프
shell> mysqldump -uroot -p'root암호' -v --all-databases \
--single-transaction --routines --set-gtid-purged=ON \
--triggers --extended-insert --master-data=2 | gzip > db_dump.tar.gz
▶ 데이터 전송
덤프한 데이터를 슬레이스 서버로 이동. SSH나 NFS, FTP등의 방법을 이용하여 슬레이브 서버로 데이터 전송.
■ 데이터 로드 및 복제 설정
슬레이브 서버에서 해당 명령들을 실행합니디.
▶ 데이터 로드전 사전 작업 사항
슬레이브에서 기존 GTID정보를 가지게 될경우 데이터 중복이나 복제 환경이 깨지게 됩니다. 반드시 기존 GTID정보를 가지고 있는지 반드시 확인합니다.
만약 값을 가지고 있다면 아무런 값을 가지지 않도록 초기화 시킵니다.
- GTID 실행 여부
mysql> show global variables like 'gtid_executed';
+-----------------+-------------------------------------------------------+
| Variable_name | Value |
+-----------------+-------------------------------------------------------+
| gtid_executed | 027f123c-51b5-22ef-eeb3-225056ac2425:1-1322 |
+-----------------+-------------------------------------------------------+
1 row in set (0.01 sec)
- GTID 퍼지 여부
mysql> show global variables like 'gtid_purged';
+-----------------+-------------------------------------------------------+
| Variable_name | Value |
+-----------------+-------------------------------------------------------+
| gtid_purged | 019f728c-52b5-11ea-aeb3-005056ac2425:1-1520 |
+-----------------+-------------------------------------------------------+
- 글로벌 GTID 확인
초기 MySQL이 설치되면 이곳에 GTID값이 설정된다.
여기서 반드시 아무런 내용도 나오지 않아야 한다.
mysql> select @@global.gtied_executed;
+----------------------------------------+
| @@global.gtid_executed |
+----------------------------------------+
| 600e251b-eca7-11ec-9d02-3cecef806a9e:1 |
+----------------------------------------+
mysql> select @@global.gtied_purged;
+-----------------------+
| @@global.gtied_purged |
+-----------------------+
| |
+-----------------------+
- 마스터 초기화
위의 gtid 삭제 및 초기화를 위해 반드시 수행
reset master;
- GTID 실행 여부 확인. 아무런 데이터도 없어야 함
mysql> show global variables like 'gtid_executed';
+-----------------+-------------+
| Variable_name | Value |
+-----------------+-------------+
| gtid_executed | |
+-----------------+-------------+
1 row in set (0.00 sec)
- GTID 퍼지 여부 확인. 아무런 데이터도 없어야 함.
mysql> show global variables like 'gtid_purged';
+-----------------+-------------+
| Variable_name | Value |
+-----------------+-------------+
| gtid_purged | |
+-----------------+-------------+
1 row in set (0.00 sec)
▶ 데이터 로드
슬레이브에서 수행합니다.
shell> gunzip db_dump.tar.gz
shell> mysql -uroot -p'root암호' < db_dump.sql
▶ 복제 설정
슬레이브에서 해당 명령어를 실행합니다.
MySQL 5.7
mysql> CHANGE MASTER TO MASTER_HOST='Master_Server_IP', \
MASTER_USER='repl', \
MASTER_PASSWORD='repl암호', \
MASTER_PORT=3306, \
MASTER_AUTO_POSITION=1;
MySQL 8.0
mysql> CHANGE REPLICATION SOURCE TO SOURCE_HOST ='Master_Server_IP', \
SOURCE_USER='repl', \
MASTER_PASSWORD='repl암호', \
SOURCE_PORT=3306, \
SOURCE_AUTO_POSITION=1, \
GET_SOURCE_PUBLIC_KEY=1;
▶ 복제 시작
MySQL 5.7
mysql> start slave;
MySQL 8.0
mysql> start slave;
참고로 MySQL 8.0 이상일때는 start replica 명령으로 대신합니다.
MySQL 8.0에서 복제 명령어가 몇개 바뀌었는데 그것은 아래에 설명합니다.
▶ 데이터 복제 여부 확인.
아래 간단한 쿼리를 실행하여 복제에 참여한 슬레이브 서버가 잘 복제가 되는지 확인.
- 마스터 서버에서 실행
mysql> create database repldb;
mysql> use repldb;
mysql> create table t1(c1, char(10), char(20), char(3)
mysql> insert into t1 values('1','2','3';
■ MySQL 8.0 복제 명령어 변경사항
MySQL 8.0에서는 다음과 같이 명령어가 변경되었습니다.
변경전 명령어 | 변경후 명령어 |
START SLAVE | START REPLICA |
STOP SLAVE | STOP REPLICA |
SHOW SLAVE STATUS | SHOW REPLICA STATUS |
SHOW SLAVE HOSTS | SHOW REPLICAS |
RESET SLAVE | RESET REPLICA |
CHANGE MASTER TO | CHANGE REPLICATION SOURCE TO |
MASTER_HOST, MASTER_PORT | SOURCE_HOST,SOURCE_PORT |
MASTER_LOG_POS | SOURCE_LOG_POS |
MASTER_LOG_FILE | SOURCE_LOG_FILE |
'Databases > MySQL' 카테고리의 다른 글
[MySQL][Backup n Recovery] Binary Log 를 이용하여 특정 시점 복구하기 (3) | 2020.04.25 |
---|---|
[MySQL][Backup n Recovery] mysqlimport 프로그램 제대로 파해치기 (0) | 2020.04.17 |
[MySQL][Master-Slave] GTID를 이용한 복제 - 이론 (0) | 2020.04.09 |
[MySQL][Backup n Recovery] mysqldump 프로그램 제대로 파해치기 (0) | 2020.04.02 |
[MySQL][Master-Slave] 복제 필터링 - 명령문 및 적용방법 (0) | 2020.03.28 |