개요
현재 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)을 통해 안정적인 무중단 리플리케이션 구조가 완성됩니다.
추가 고려 사항
- 네트워크 상태 및 방화벽 설정: 리플리케이션 설정 시, 각 DB 서버 간의 네트워크 연결이 원활해야 하며, 방화벽에서 MariaDB의 기본 포트인 3306이 열려 있는지 확인해야 합니다.
- 리플리케이션 상태 점검: 리플리케이션 설정이 완료된 후, 주기적으로 SHOW SLAVE STATUS\G 명령을 사용하여 슬레이브의 상태를 점검하고, Seconds_Behind_Master 값이 0인지 확인하여 실시간 동기화가 이루어지고 있는지 확인합니다.
- 자동 장애 조치(Failover) 도입: 무중단 리플리케이션을 목표로 한다면, 장애 발생 시 자동으로 마스터-슬레이브 전환이 이루어지는 MHA 또는 MaxScale 같은 툴을 도입할 수 있습니다.
'DB > Mysql(MariaDB)' 카테고리의 다른 글
MariaDB - mysqldump 시 함수와 프로시저 누락 문제 해결 방법 (0) | 2024.10.16 |
---|---|
MariaDB - Replication 복구 (Error 1062 해결 및 Slave 상태 점검) (2) | 2024.10.16 |
MariaDB - Replication 설정 (Master-Master / Master-Slave) (0) | 2024.07.19 |
MariaDB - backup.sh / backup.bat (0) | 2024.07.18 |
MariaDB - 초기 보안 설정 mysql_secure_installation 사용법 (0) | 2024.06.18 |