본문 바로가기

DB/Mysql(MariaDB)

MariaDB - 무중단 Replication 설정 : DB인스턴스 추가 및 변경

728x90

개요

현재 DB1(172.16.34.6)과 DB2(172.16.34.7)는 양방향(Master-Master) 리플리케이션 구조로 설정되어 있습니다.

DB2의 서버 부하가 심각하게 발생하여, 신규 서버인 DB0(172.16.34.5)를 추가하고, DB2를 대체하려는 절차입니다.

최종 목표는 기존의 DB1 <-> DB2 구조를 DB1 <-> DB0 구조로 변경하는 것입니다.

서비스 중단 없이 이루어져야 하므로 무중단 리플리케이션 설정을 적용합니다.


작업 서버 정보

  • DB0: 신규 서버 (IP: 172.16.34.5)
  • DB1: 기존 서버, 마스터 서버 (IP: 172.16.34.6)
  • DB2: 기존 서버, 부하 발생 중 (IP: 172.16.34.7)

사전 준비: my.cnf 설정

모든 MariaDB 서버에서 [mysqld] 섹션에 각 서버별로 고유한 server-id를 설정해야 합니다.

리플리케이션 설정 시, 각 서버가 서로를 식별하기 위해 필요합니다.

[mysqld]
server-id=1  # DB1의 설정 (172.16.34.6)
server-id=2  # DB2의 설정 (172.16.34.7)
server-id=3  # DB0의 설정 (신규 서버, 172.16.34.5)

1. DB1(마스터 DB, 172.16.34.6) 백업

기존 마스터인 DB1(172.16.34.6)의 데이터를 백업합니다. 서비스 중단 없이 백업을 수행하기 위해 '--single-transaction' 옵션을 사용하고, 리플리케이션 설정 시 필요한 포지션 정보를 포함시키기 위해 '--master-data=2' 옵션을 사용합니다.

mysqldump --force --opt --user=root --password=pass --master-data=2 --single-transaction --databases testdb > /DB_BACKUP/1_test.dump

 

  • --single-transaction: 데이터베이스 백업 중 테이블 락을 방지하여 서비스 중단 없이 백업할 수 있습니다.
  • --master-data=2: 리플리케이션 포지션 정보(log_file, log_pos)를 백업 파일에 주석으로 기록합니다.

 

2. DB0(신규 서버, 172.16.34.5)에 DB1의 데이터 복원

DB0(172.16.34.5)에 DB1(172.16.34.6)에서 백업한 데이터를 복원합니다.

1. 데이터 복원 명령

nohup mysql -uroot -ppass < /DB_BACKUP/1_test.dump &  # 세션이 끊겨도 복원이 계속 진행되도록 설정

복원 로그를 기록하면 진행 상황 및 오류를 쉽게 파악할 수 있습니다.

nohup mysql -uroot -ppass < /DB_BACKUP/1_test.dump > restore.log 2>&1 &

 

2. 리플리케이션 계정 생성

복원이 완료되면, DB0(172.16.34.5)에 리플리케이션을 위한 계정을 생성합니다.

CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';  # 리플리케이션 계정 생성
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';  # 슬레이브 권한 부여

 

3. 리플리케이션 설정

이제 DB0(172.16.34.5)을 DB1(172.16.34.6)의 슬레이브로 설정하고, DB2(172.16.34.7)와 DB1 간의 리플리케이션을 해제하는 과정을 진행합니다.

3-1. DB0(172.16.34.5)를 Slave로 설정

DB0(172.16.34.5)을 DB1(172.16.34.6)의 슬레이브로 설정하여 리플리케이션을 시작합니다.

1. 백업 파일에서 리플리케이션 포지션 확인

cat /DB_BACKUP/1_test.dump | grep "CHANGE MASTER"

이 명령으로 백업 파일에서 log_file과 log_pos 값을 확인합니다.

 

2. 리플리케이션 설정

CHANGE MASTER TO
    MASTER_HOST='172.16.34.6',  -- DB1의 IP 주소
    MASTER_USER='repl',
    MASTER_PASSWORD='repl',
    MASTER_LOG_FILE='mysql-bin.000001',  -- DB1의 로그 파일 -> 위에서 확인
    MASTER_LOG_POS=12345;               -- DB1의 포지션 -> 위에서 확인

 

3. 슬레이브 시작

START SLAVE;

리플리케이션 상태는 SHOW SLAVE STATUS; 명령을 통해 확인할 수 있으며, Seconds_Behind_Master 값이 0인지 확인하여 리플리케이션이 실시간으로 동기화되고 있는지 확인합니다.

 

3-2. DB2(172.16.34.7)에서 Master 역할 해제

마스터 역할을 수행하고 있던 DB2(172.16.34.7)의 리플리케이션을 중단하고, DB0(172.16.34.5)를 새로운 마스터로 설정합니다.

1. DB2의 슬레이브 중단

STOP SLAVE;

 

2. DB1(172.16.34.6)을 DB0(172.16.34.5)의 마스터로 설정: DB0(172.16.34.5)에서 SHOW MASTER STATUS 명령을 실행하여 log_file과 log_pos 값을 확인한 후, DB2(172.16.34.7)에서 DB0을 마스터로 설정합니다.

CHANGE MASTER TO
    MASTER_HOST='172.16.34.5',  -- DB0의 IP 주소
    MASTER_USER='repl',
    MASTER_PASSWORD='repl',
    MASTER_LOG_FILE='mysql-bin.000002',  -- DB0의 로그 파일
    MASTER_LOG_POS=23456;               -- DB0의 포지션

 

3. 슬레이브 시작

START SLAVE;

4. 예상 결과

최종적으로 다음과 같은 양방향 리플리케이션 구조가 완성됩니다

  • DB1(172.16.34.6) <-> DB0(172.16.34.5): 두 서버가 서로 마스터-슬레이브로 연결되어 데이터가 자동으로 동기화됩니다.

DB2(172.16.34.7)는 더 이상 리플리케이션에 참여하지 않으며, DB2를 대신하여 신규 서버인 DB0(172.16.34.5)을 통해 안정적인 무중단 리플리케이션 구조가 완성됩니다.


추가 고려 사항

  1. 네트워크 상태 및 방화벽 설정: 리플리케이션 설정 시, 각 DB 서버 간의 네트워크 연결이 원활해야 하며, 방화벽에서 MariaDB의 기본 포트인 3306이 열려 있는지 확인해야 합니다.
  2. 리플리케이션 상태 점검: 리플리케이션 설정이 완료된 후, 주기적으로 SHOW SLAVE STATUS\G 명령을 사용하여 슬레이브의 상태를 점검하고, Seconds_Behind_Master 값이 0인지 확인하여 실시간 동기화가 이루어지고 있는지 확인합니다.
  3. 자동 장애 조치(Failover) 도입: 무중단 리플리케이션을 목표로 한다면, 장애 발생 시 자동으로 마스터-슬레이브 전환이 이루어지는 MHA 또는 MaxScale 같은 툴을 도입할 수 있습니다.
728x90
반응형