MariaDB Multi Source Replication 구성 가이드
개요
n대의 마스터 DB와 1대의 슬레이브 DB를 연결하여 마스터 DB들의 데이터를 슬레이브 DB 한곳에 모아 조회할 수 있는 Multi-Source-Replication(MSR)을 MariaDB에서 구성하는 방법을 정리해보겠습니다.
테스트 준비
- 마스터 서버 2대, 슬레이브 서버 1대 준비
- 각 서버에 MariaDB 10.3 이상 설치
- MariaDB 리플리케이션작업 진행 시 마스터 서버의 데이터베이스에 쓰기 작업 금지
ACG 설정
서버 준비가 끝났으면 우선 마스터 서버 슬레이브 서버로 디비 백업 파일 복사과 복제 구성에 필요한 22, 3306 포트를 오픈해야 합니다.
오픈 할 때 규칙은 마스터 서버와 슬레이브 서버의 공통 ACG에 사설 IP 대역 전체를 지정할 수도 있고, 슬레이브 서버 전용 ACG에 마스터 서버 IP만 등록하는 방법도 있습니다.
Slave 장비에 백업 디렉토리 생성
먼저 Slave 장비에 Master 장비들로 부터 DB 복원용 덤프 파일을 전송 받을 백업 디렉토리를 생성하는 것 부터 시작하겠습니다.
mkdir /data
cd /data
Master1 장비 구성
Master1 설정 추가
- /etc/my.cnf.d/mariadb-server.cnf에 Master1 설정을 추가합니다.
- MariaDB 버전에 따라서는 /etc/my.cnf.d/server.cnf 인 경우도 있습니다.
리플리케이션 계정 생성
MariaDB 접속 후 리플리케이션을 진행할 계정 생성
#master1 계정 생성.
MariaDB [(none)]> create user '리플리케이션 계정명'@'%' identified by '패스워드';
MariaDB [(none)]> grant replication slave on *.* to '리플리케이션 계정명'@'%';
MariaDB [(none)]> flush privileges;
테스트 DB 생성
다음으로 테스트에 사용할 DB를 생성하겠습니다. 이미 생성되어 있는 다른 DB를 사용할 경우에는 별도로 테스트용 DB를 생성할 필요는 없습니다.
MariaDB [(none)]> CREATE DATABASE testdb1 default CHARACTER SET UTF8;
Master1 정보확인
이제 리플리케이션 설정에 필요한 Master 정보를 확인합니다.
MariaDB [(none)]> show variables like 'server_id';
MariaDB [(none)]> show master status;
Slave DB를 설정할 때 입력해야 하므로 별도로 기록해두어야
합니다.
DB 백업 파일 슬레이브 장비로 전송
testdb1 DB의 백업파일을 생성하고, 슬레이브 서버로 전송합니다.
mkdir /data
cd /data
mysqldump -u root -p --databases testdb1 > /data/test1.sql
#슬레이브 서버에 전송.
scp test1.sql root@10.0.0.8:/data
Master2 장비 구성
Master2 설정 추가
- /etc/my.cnf.d/mariadb-server.cnf에 Master2 설정을 추가합니다.
- MariaDB 버전에 따라서는 /etc/my.cnf.d/server.cnf 인 경우도 있습니다.
리플리케이션 계정 생성
MariaDB 접속 후 리플리케이션을 진행할 계정 생성합니다.
#master2 계정 생성.
MariaDB [(none)]> create user '리플리케이션 계정명'@'%' identified by '패스워드';
MariaDB [(none)]> grant replication slave on *.* to '리플리케이션 계정명'@'%';
MariaDB [(none)]> flush privileges;
테스트 DB 생성
다음으로 테스트에 사용할 DB를 생성하겠습니다. 이미 생성되어 있는 다른 DB를 사용할 경우에는 별도로 테스트용 DB를 생성할 필요는 없습니다.
MariaDB [(none)]> CREATE DATABASE testdb2 default CHARACTER SET UTF8;
Master2 정보확인
마찬가지로 리플리케이션 설정에 필요한 Master 정보를 확인합니다.
MariaDB [(none)]> show variables like 'server_id';
MariaDB [(none)]> show master status;
Slave DB를 설정할 때 입력해야 하므로 별도로 기록해두어야
합니다.
DB 백업 파일 슬레이브 장비로 전송
testdb2 DB의 백업파일 생성하고, 슬레이브 서버로 전송합니다.
mkdir /data
cd /data
mysqldump -u root -p --databases testdb2 > /data/test2.sql
scp test2.sql root@10.0.0.8:/data
Slave 장비 구성
Slave 설정 추가
- /etc/my.cnf.d/mariadb-server.cnf에 Slave 설정을 추가합니다.
- MariaDB 버전에 따라서는 /etc/my.cnf.d/server.cnf 인 경우도 있습니다.
vi /etc/my.cnf.d/mariadb-server.cnf
server-id = 3
#리플리케이션 대상 디비 설정.
replicate-do-db = testdb1
replicate-do-db = testdb2
#리플리케이션 제외 디비 설정.
replicate-ignore-db = information_schema
replicate-ignore-db = mysql
replicate-ignore-db = performance_schema
replicate-ignore-db = sys
slave-skip-errors = all
#DB를 재시작하여 변경사항 적용.
systemctl restart mariadb
DB 복구 진행
먼저 복구할 DB를 미리 생성하고 Master1, Master2 장비에서 전송 받은 백업 파일을 사용해 DB를 복구합니다.
#복구할 DB 생성.
MariaDB [(none)]> create database testdb1;
MariaDB [(none)]> create database testdb2;
MariaDB [(none)]> quit
#DB 복구
mysql -u root -p testdb1 < /data/test1.sql
mysql -u root -p testdb2 < /data/test2.sql
- 백업 파일을 전송 받은 디렉토리로 이동해 백업 파일이 정상적으로 전송되었는지 확인합니다.
- 백업 파일을 사용해 DB를 복구합니다.
리플리케이션 채널 설정
리플리케이션 채널을 설정하는 쿼리문은 다음과 같은데, MySQL과는 일부 다른 부분이 있으니 잘 확인하고 사용해야 합니다.
MariaDB [(none)]> CHANGE MASTER '커넥션 이름' TO MASTER_HOST='마스터IP', MASTER_PORT=포트번호, MASTER_USER='생성한 리플리케이션 계정명', MASTER_PASSWORD='패스워드', MASTER_LOG_FILE='위에서 확인된 File명', MASTER_LOG_POS=위에서 확인된 Position 번호;
여기에 필요한 정보 중에서 [MASTER_LOG_FILE]과 [MASTER_LOG_POS]은 위쪽에서 확인한 Master DB들의 정보에 나타났던 것으로 정리하면 다음과 같습니다.
DB | File | Position |
---|---|---|
Master1 | mariadb-bin.000001 | 939 |
Master2 | mariadb-bin.000002 | 939 |
Master 서버 정보 입력
다음의 예시처럼 Slave 서버에 Master 서버 정보를 하나씩 입력합니다.
#Master1 예시
MariaDB [(none)]> CHANGE MASTER 'ch_testdb1' TO MASTER_HOST='10.0.0.6', MASTER_USER='testuser', MASTER_PORT=3306, MASTER_PASSWORD='Test123$', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=939;
#Master2 예시
MariaDB [(none)]> CHANGE MASTER 'ch_testdb2' TO MASTER_HOST='10.0.0.7', MASTER_USER='testuser', MASTER_PORT=3306, MASTER_PASSWORD='Test123$', MASTER_LOG_FILE='mariadb-bin.000002', MASTER_LOG_POS=939;
MariaDB [(none)]> FLUSH PRIVILEGES;
리플리케이션 채널 시작
리플리케이션 시작 후 에러가 없는지 확인합니다.
# start slave '커넥션명';
MariaDB [(none)]> start slave 'ch_testdb1';
MariaDB [(none)]> start slave 'ch_testdb2';
# show slave '커넥션명' status\G
MariaDB [(none)]> show slave 'ch_testdb1' status\G
MariaDB [(none)]> show slave 'ch_testdb2' status\G
- Master1
상태 확인에서는 [Slave_IO_State], [Slave_IO_Running], [Slave_SQL_Running] 항목들이 아래와 같이 되어 있으면 정상입니다.
- Master2
상태 확인에서는 [Slave_IO_State], [Slave_IO_Running], [Slave_SQL_Running] 항목들이 아래와 같이 되어 있으면 정상입니다.
리플리케이션 테스트
리플리케이션 설정을 모두 마친 후에 Master 서버들에서 DB 작업을 진행하고, Slave 서버에 해당 내용이 복제되는지 확인해보겠습니다.
- Master1 서버 작업
Master1 서버에 테스트를 위한 [sampletable1] Table을 생성합니다.
- Slave 서버 확인
Slave 서버에서 testdb1 DB에 sampletable1 Table이 복제되었는지 확인합니다.
- Master2 서버 작업
Master2 서버에 테스트를 위한 [sampletable2] Table을 생성합니다.
- Slave 서버 확인
Slave 서버에서 testdb2 DB에 sampletable2 Table이 복제되었는지 확인합니다.
리플리케이션 명령어 모음
리플리케이션 명령어 | |
---|---|
채널 설정 | CHANGE MASTER '커넥션 이름' TO MASTER_HOST='마스터IP', MASTER_PORT=포트번호, MASTER_USER='생성한 리플리케이션 계정명', MASTER_PASSWORD='패스워드', MASTER_LOG_FILE='위에서 확인된 File명', MASTER_LOG_POS=위에서 확인된 Position 번호; |
채널 시작 | START SLAVE "커넥션 이름"; |
채널 중지 | STOP SLAVE "커넥션 이름"; |
채널 상태 확인 | SHOW SLAVE "커넥션 이름" STATUS\G |
채널 정보 삭제 | RESET SLAVE "커넥션 이름"; |
참고 URL
-
MariaDB Replication 기본 설정 가이드
https://mariadb.com/kb/en/setting-up-replication/ -
MariaDB Multi-Source Replication 가이드
https://mariadb.com/kb/en/multi-source-replication/
문서 업데이트 내역
날짜 | 내용 |
---|---|
2023-04-20 | 문서 최초 생성 |