MySQL 마스터-슬레이브 복제 구현

1. 개요

MySQL의 마스터-슬레이브 복제는 하나의 데이터베이스 서버(마스터)에서 다른 MySQL 서버들(슬레이브)로 데이터를 동기화하는 방법입니다. 이 과정에서 마스터의 모든 DDL 및 DML 변경 사항은 바이너리 로그에 기록되며, 이를 슬레이브가 받아서 다시 실행하여 데이터 일관성을 유지합니다.

주요 장점은 다음과 같습니다:

  • 마스터 서버 고장 시 빠르게 슬레이브로 전환할 수 있습니다.
  • 읽기/쓰기 분리를 통해 마스터의 부하를 줄일 수 있습니다.
  • 슬레이브에서 백업을 수행하여 마스터의 서비스 영향을 최소화할 수 있습니다.

다만 주의해야 할 점은 MySQL 복제가 비동기적이라는 것입니다. 따라서 특정 상황에서는 마스터와 슬레이브 간에 잠시 지연이 발생할 수 있습니다.

2. 작동 원리

복제 과정은 세 단계로 이루어집니다:

  1. 마스터는 트랜잭션 커밋 시 데이터 변경 내용을 바이너리 로그(Binlog)에 기록합니다.
  2. 슬레이브는 이 바이너리 로그를 읽어 중계 로그(Relay Log)에 저장합니다.
  3. 중계 로그의 이벤트를 재실행하여 슬레이브의 데이터를 업데이트합니다.

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;

태그: MySQL Replication linux

6월 24일 17:08에 게시됨