1. 개요
MySQL의 마스터-슬레이브 복제는 하나의 데이터베이스 서버(마스터)에서 다른 MySQL 서버들(슬레이브)로 데이터를 동기화하는 방법입니다. 이 과정에서 마스터의 모든 DDL 및 DML 변경 사항은 바이너리 로그에 기록되며, 이를 슬레이브가 받아서 다시 실행하여 데이터 일관성을 유지합니다.
주요 장점은 다음과 같습니다:
- 마스터 서버 고장 시 빠르게 슬레이브로 전환할 수 있습니다.
- 읽기/쓰기 분리를 통해 마스터의 부하를 줄일 수 있습니다.
- 슬레이브에서 백업을 수행하여 마스터의 서비스 영향을 최소화할 수 있습니다.
다만 주의해야 할 점은 MySQL 복제가 비동기적이라는 것입니다. 따라서 특정 상황에서는 마스터와 슬레이브 간에 잠시 지연이 발생할 수 있습니다.
2. 작동 원리
복제 과정은 세 단계로 이루어집니다:
- 마스터는 트랜잭션 커밋 시 데이터 변경 내용을 바이너리 로그(Binlog)에 기록합니다.
- 슬레이브는 이 바이너리 로그를 읽어 중계 로그(Relay Log)에 저장합니다.
- 중계 로그의 이벤트를 재실행하여 슬레이브의 데이터를 업데이트합니다.
3. 실습 예제
3.1 사전 준비
두 대의 가상 머신을 준비하고 각각에 MySQL을 설치한 후 바이너리 로깅을 활성화합니다. 아래는 예시 IP 설정입니다:
- 마스터: 192.168.233.137
- 슬레이브: 192.168.233.138
3.2 마스터 구성
마스터 서버의 MySQL 설정 파일(/etc/mysql/mysql.conf.d/mysqld.cnf)을 수정하고 다음 항목을 추가합니다:
[mysqld] ... # 바이너리 로그 활성화 log-bin = mysql-bin # 유니크한 서버 ID 설정 server-id = 1 # 로그 포맷 설정 binlog_format = ROW
설정 후 MySQL 서비스를 재시작합니다:
systemctl restart mysql
원격 연결을 위한 사용자를 생성하고 복제 권한을 부여합니다:
CREATE USER 'replicator'@'%' IDENTIFIED BY 'securepassword'; GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
마지막으로 현재 바이너리 로그 상태를 확인합니다:
SHOW MASTER STATUS;
3.3 슬레이브 구성
슬레이브 서버의 설정 파일에도 유사한 수정을 합니다:
[mysqld] ... log-bin = mysql-bin server-id = 2 binlog_format = ROW read-only = 1
재시작 후 마스터와 연결을 설정합니다:
CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.233.137', SOURCE_USER='replicator', SOURCE_PASSWORD='securepassword', SOURCE_LOG_FILE='mysql-bin.000001', SOURCE_LOG_POS=1234;
동기화를 시작합니다:
START REPLICA;
3.4 흔한 문제 해결
Slave_IO_Running이 No로 표시되는 경우는 일반적으로 server-id 충돌이나 UUID 중복 때문입니다. 이를 해결하기 위해 auto.cnf 파일의 server-uuid 값을 변경하면 됩니다.
3.5 데이터 테스트
마스터에서 다음 쿼리를 실행하여 새로운 테이블과 데이터를 추가합니다:
USE testdb;
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT
);
INSERT INTO users (name, age) VALUES ('John', 30), ('Jane', 25);
그런 후 슬레이브에서 데이터가 정상적으로 복제되었는지 확인합니다:
USE testdb; SELECT * FROM users;