MySQL Multi Source Replication(MSR) 실습
목표
- MySQL 8.0에서 기본적인 GTID 기반 Multi Source Replication을 구축한다.
Multi Source Replication ??
여러개의 Master DB를 1개의 Slave(Replica) 인스턴스에 연결하여 복제하는 구조로, 여러개의 Master DB의 내용을 하나의 Slave 에 모으는 기능
MSR 활용도
- 여러 서버에 존재하는 각기 다른 데이터를 하나의 MySQL 서버로 통합하는 용도( ex) EDW 등 데이터 분석 용도)
- 여러 서버에 샤딩되어 있는 테이블 데이터를 하나의 데이터로 통합 (ex 기존 샤딩된 데이터베이스를 Merge할 때 사용 할 수 있음)
- 여러 서버의 데이터를 모아 하나의 MySQL에서 백업을 수행 ( 백업 서버 용도)
MSR 검토사항
- 데이터베이스를 각각 구성해야 한다는 제약이 없으므로 리플리케이션 복제 시 충돌을 일으킬만한 부분이 없는지 사전에 검토 필요
- 실제 서비스 용도로 사용하기에는 많은 어려움이 있으므로 페일오버를 위해서는 다른 리플리카 서버를 둬야함
Topology
1. Slave 사전작업
1) my.cnf 설정 변경
master_info_repository = 'TABLE'
relay_log_info_repository = 'TABLE'
replicate-ignore-db = mysql
replicate-ignore-db = test
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
replicate-ignore-db = sys
replicate-do-db = ch_master1:dwightdb1
replicate-do-db = ch_master1:dwightdb2
replicate-do-db = ch_master3:dwightdb3
replicate-do-db = ch_master4:dwightdb4
replicate-do-db = ch_master5:dwightdb5
2) 리플리케이션 계정생성
create user `replication_user`@`%` identified with mysql_native_password by 'new1234!';
grant replication slave on *.* to `replication_user`@`%`;
flush privileges;
2. Master 사전작업
1) 각 마스터 별 디비 설정
2) 리플리케이션 계정생성
create user `replication_user`@`%` identified with mysql_native_password by 'new1234!';
grant replication slave on *.* to `replication_user`@`%`;
flush privileges;
3) 마스터 별 덤프 파일 생성
/mysql/Dwight/instance/bin/mysqldump -u root -pnew1234! -P 3307 --socket=/tmp/mysql_3307.sock -v --databases dwightdb1 dwightdb2 \
--quick --routines --set-gtid-purged=on \
--triggers --extended-insert --master-data=2 > /root/db_backup/master1_db.sql
/mysql/Dwight/instance/bin/mysqldump -u root -pnew1234! -P 3307 --socket=/tmp/mysql_3307.sock -v --databases dwightdb3 \
--quick --routines --set-gtid-purged=on \
--triggers --extended-insert --master-data=2 >/root/db_backup/master3_db.sql
/mysql/Dwight/instance/bin/mysqldump -u root -pnew1234! -P 3307 --socket=/tmp/mysql_3307.sock -v --databases dwightdb4 \
--quick --routines --set-gtid-purged=on \
--triggers --extended-insert --master-data=2 > /root/db_backup/master4_db.sql
/mysql/Dwight/instance/bin/mysqldump -u root -pnew1234! -P 3307 --socket=/tmp/mysql_3307.sock -v --databases dwightdb5 \
--quick --routines --set-gtid-purged=on \
--triggers --extended-insert --master-data=2 > /root/db_backup/master5_db.sql
4) 마스터별 GTID 추출
cat *.sql | grep GTID_PURGED | perl -p0 -e 's#/\*.*?\*/##sg' | cut -f2 -d'=' | cut -f2 -d$'\''
5) 기록
9f614b39-663e-11ed-b8e5-02b33e34566e:1-12
9f620898-663e-11ed-8384-0a5c9fb56988:1-12
9f60b66b-663e-11ed-b783-0268c272438a:1-10
9f620a19-663e-11ed-9928-0aba7fc3992e:1-10
6) GTID를 제외한 덤프 스크립트 생성
sed '/GTID_PURGED/d' master1_db.sql > master1_db_nopurge.sql
sed '/GTID_PURGED/d' master3_db.sql > master3_db_nopurge.sql
sed '/GTID_PURGED/d' master4_db.sql > master4_db_nopurge.sql
sed '/GTID_PURGED/d' master5_db.sql > master5_db_nopurge.sql
6) Slave 서버로 전송
rsync -avzr --progress master1_db_nopurge.sql root@10.213.213.165:/tmp
rsync -avzr --progress master3_db_nopurge.sql root@10.213.213.165:/tmp
rsync -avzr --progress master4_db_nopurge.sql root@10.213.213.165:/tmp
rsync -avzr --progress master5_db_nopurge.sql root@10.213.213.165:/tmp
3. Master 사전작업
1) dump 파일 리스토어
mysql -u root -P 3307 --socket=/tmp/mysql_3307.sock -pnew1234! < master1_db_nopurge.sql
mysql -u root -P 3307 --socket=/tmp/mysql_3307.sock -pnew1234! < master3_db_nopurge.sql
mysql -u root -P 3307 --socket=/tmp/mysql_3307.sock -pnew1234! < master4_db_nopurge.sql
mysql -u root -P 3307 --socket=/tmp/mysql_3307.sock -pnew1234! < master5_db_nopurge.sql
2) SLAVE 서버 접속 후 gtid 셋팅
mysql> RESET MASTER;
mysql> SET @@GLOBAL.gtid_purged = "9f614b39-663e-11ed-b8e5-02b33e34566e:1-12, 9f620898-663e-11ed-8384-0a5c9fb56988:1-12, 9f60b66b-663e-11ed-b783-0268c272438a:1-10, 9f620a19-663e-11ed-9928-0aba7fc3992e:1-10";
3) 리플리케이션 설정
CHANGE MASTER TO MASTER_HOST="10.213.211.170", MASTER_USER="replication_user", MASTER_PORT=3307,\
MASTER_PASSWORD="new1234!", MASTER_AUTO_POSITION=1 FOR CHANNEL "ch_master1";
CHANGE MASTER TO MASTER_HOST="10.213.213.53", MASTER_USER="replication_user", MASTER_PORT=3307,\
MASTER_PASSWORD="new1234!", MASTER_AUTO_POSITION=1 FOR CHANNEL "ch_master3";
CHANGE MASTER TO MASTER_HOST="10.213.211.8", MASTER_USER="replication_user", MASTER_PORT=3307,\
MASTER_PASSWORD="new1234!", MASTER_AUTO_POSITION=1 FOR CHANNEL "ch_master4";
CHANGE MASTER TO MASTER_HOST="10.213.212.194", MASTER_USER="replication_user", MASTER_PORT=3307,\
MASTER_PASSWORD="new1234!", MASTER_AUTO_POSITION=1 FOR CHANNEL "ch_master5";
CHANGE REPLICATION FILTER REPLICATE_DO_DB = (dwightdb1,dwightdb2) FOR CHANNEL "ch_master1";
CHANGE REPLICATION FILTER REPLICATE_DO_DB = (dwightdb3) FOR CHANNEL "ch_master3";
CHANGE REPLICATION FILTER REPLICATE_DO_DB = (dwightdb4) FOR CHANNEL "ch_master4";
CHANGE REPLICATION FILTER REPLICATE_DO_DB = (dwightdb5) FOR CHANNEL "ch_master5";
4)리플리케이션 시작 및 상태 확인
START SLAVE; SHOW SLAVE STATUS;
질문
1. 테스트 시에는 각각의 다른 마스터 서버에서 동일한 Logical Database를 Replication 하는 것은 가능한가요??
구성은 가능하나 duplication 등 기타 사항에 대한 고려사항이 증가합니다.
PK중복 등 Replication 을 중지 시킬만한 충돌이 발생하면 리플리케이션이 종료됩니다.
-> GTID Replication으로 구성하였기 때문에 skip_counter를 셋팅하는 것이 아니라 GTID_NEXT를 통해 스킵할 수 있음(정합성 확인 후 스킵 필요)
'MySQL & MariaDB' 카테고리의 다른 글
MySQL GTID 복제 환경에서 Reset Master 수행 시 발생 장애 케이스 (0) | 2022.12.27 |
---|---|
MySQL GTID 복제 환경에서 Reset Master/Reset Slave 명령어 (0) | 2022.12.27 |
MySQL GTID Replication 실습 (0) | 2022.12.22 |
[Real MySQL 8.0] 02. 설치와 설정 & 03. 사용자 및 권한 (0) | 2022.10.06 |
MySQL System Architecture - 2. Memory (0) | 2022.07.06 |