[그림1] 다중소스복제

이번 포스팅에서 구현해볼 관계도는 다중 소스 복제(multi-source replication)입니다. 
제가 다중소스복제가 필요한 상황은 아래와 같습니다.

  • 마스터, 슬레이브1, 슬레이브2, 슬레이브n 은 DB부하 분산을 위해 사용됩니다. 
  • 슬레이브1에는 마스터에 있는 테이블 중 분석에 필요한 테이블이 존재합니다. 
    분석에 필요한 데이터는 용량이 크며, 다른 서비스에서는 필요 없습니다. 
    특정한 부가 서비스에만 분석에 필요한 데이터가 필요합니다. 
  • 분석 프로그램 사용 시 마스터에 있는 정보도 필요한 상황입니다. 

좀 모호 할 수도 있는 말이지만, 저는 마스터의 데이터와, 분석에서만 사용되는 데이터를 합쳐 놓은 DB가 필요한 상황입니다. 이때 적절한 리플리케이션 관계도가 다중 소스 복제라고 판단하였습니다. 

 

다중 소스 복제(Multi-Source Replication)

마스터에 test_db1, test_db2가 존재한다고 가정하겠습니다. 
슬레이브1은 마스터의 슬레이브이며, 동일하게 test_db1, test_db2가 복제되어있습니다. 
슬레이브1에서 test_db3을 생성하였고, 
슬레이브1-1 은 마스터와 슬레이브1의 데이터가 모두 적재되도록 설계하였습니다.

 

슬레이브1-1 설정하기

[개발환경]
OS : Rocky Linux
DB : MariaDB 10.2

 

1. mySQL(MariaDB) 설정

2022.11.22 - [개발/MariaDB] - MariaDB 리플리케이션(Replication) 이해 및 구축(Rocky Linux)

위의 포스팅에서 마스터, 슬레이브1 설정을 하였습니다. 참고해주세요. 
이번 포스팅에서는 슬레이브 1-1만 설정하도록 하겠습니다. 

$  vi /etc/my.cnf.d/server.cnf 
 
 
[mysqld]
# replication setting (slave) =====================================
server_id=3
relay-log=mysql-relay-bin
relay_log_purge=1
log-bin=mysql-bin
binlog-format=row
expire_logs_days=30

슬레이브1과 동일한 설정이며, server_id를 3으로 설정한 것만 다릅니다.

 

2. MariaDB 재 실행

$ systemlctl restart mariadb

 

3. 리플리케이션 통신 계정 설정

[그림2]

# 만약에 슬레이브1-1에 슬레이브 설정되어있다면 아래의 명령어 실행 후 change master 명령어 사용하세요.
mysql> stop slave;
mysql> reset slave all;


mysql> CHANGE MASTER "master1" TO MASTER_HOST = '192.168.0.1', MASTER_USER='replication_user1', MASTER_PASSWORD = 'pw123!@#', MASTER_LOG_FILE='마스터의 바이너리 로그 파일명', MASTER_LOG_POS=마스터의포지션번호;
mysql> CHANGE MASTER "master2" TO MASTER_HOST = '192.168.0.2', MASTER_USER='replication_user1', MASTER_PASSWORD = 'pw123!@#', MASTER_LOG_FILE='슬레이블1의 바이너리 로그 파일명', MASTER_LOG_POS=슬레이브1의포지션번호;

[그림2] 처럼

  • master1 이름으로 마스터와의 리플리케이션 통신할 수 있도록 세팅하였고, 
    (마스터에 inset, update 등이 되면 slave1-1에 복제되도록 설정) 
  • master2 이름으로 salve1과 리플리케이션 통신하도록 설정하였습니다.
    (슬레이브1에서 실행된 inset 등을 slave1-1 복제)

 

4. 슬레이브1-1 실행

mysql> start all slaves;
mysql> SHOW ALL slaves STATUS\G

*************************** 1. row ***************************
              Connection_name: master1
              Slave_SQL_State: Slave has read all relay log; waiting for the slave I/O thread to update it
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.0.1
                  Master_User: replication_user1
                  Master_Port: 3306
                Connect_Retry: 60
                이하 생략....
*************************** 2. row ***************************
              Connection_name: master2
              Slave_SQL_State: Slave has read all relay log; waiting for the slave I/O thread to update it
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.0.2
                  Master_User: replication_user1
                  이하 생략.....

다중 복제가 아닌 경우에는 start slaves; show slave status; 명령어를 사용했는데, 
다중인 경우에는 all, slaves 등이 다른 것을 알 수 있습니다.
show slave status;를 통해 master1, master2가 잘 연결된 것을 보실 수 있습니다.

 


자주 사용하는 명령어

슬레이브 상태 보기

# 슬레이브 연결한 모든 상태 보기
mysql> SHOW ALL slaves STATUS;

# 특정한 이름의 상태값 보기
mysql> SHOW SLAVE "master1" STATUS;

# 디폴트값 설정 후 디폴트의 상태값 보기
mysql> SET @@default_master_connection = 'master1';
mysql> SHOW SLAVE STATUS;

 

슬레이브 멈추기

# 슬레이브 모두 멈추기
mysql> stop all slaves;

# 특정한 이름의 슬레이브 멈추기
mysql> STOP SLAVE "master1"

# 디폴트값 설정 후 슬레이브 멈추기
mysql> SET @@default_master_connection = 'master1';
mysql> STOP SLAVE;

 

슬레이브 시작

# 슬레이브 모두 시작하기
mysql> START ALL SLAVES;

# 특정한 이름의 슬레이브 멈추기
mysql> START SLAVE "master1"

# 디폴트값 설정 후 슬레이브 멈추기
mysql> SET @@default_master_connection = 'master1';
mysql> START SLAVE;

 

슬레이브 스킵하기

mysql> SET @@default_master_connection = 'master1';
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
mysql> START SLAVE;

 

슬레이브 설정 초기화

mysql> reset slave all;

 

 


참고자료 

다중 소스 복제 명령어 모음 : https://mariadb.com/kb/en/multi-source-replication/