DB

[MySQL] (복제구조2️⃣) Master-Slave 복제 설정 실습 가이드

인생아 2025. 7. 16. 21:44
반응형

MySQL 복제를 처음 설정할 때 가장 기본이 되는 구조가 바로 Master-Slave 구조다.
이 방식은 하나의 Master 서버에서 발생한 변경사항을 1개 또는 다수의 Slave 서버에 동기화시키는 방식으로, 읽기 부하 분산, 백업 분리, 장애 대비용으로 실무에서 널리 사용된다.

이번 글에서는 MySQL Master-Slave 복제를 직접 구성하는 실습 가이드를 제공한다.
CentOS 또는 Ubuntu 환경, MySQL 8.0 이상 기준이며, GTID 비활성화 상태(기본 binlog 복제 방식)로 설명한다.

✅ 설정 전 확인사항

  • Master와 Slave는 서로 다른 server-id를 가져야 함
  • 둘 다 binary logging 설정이 필요
  • MySQL 버전은 가급적 동일하거나 유사한 버전 사용
  • 네트워크 통신 가능 상태 (방화벽, 포트 3306 개방 등)
반응형

🛠️ 1단계: Master 서버 설정

① my.cnf 수정

[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
  • server-id: 고유값 (1, 2, 3...)
  • log_bin: 바이너리 로그 경로
  • binlog_format: 복제 안정성을 위해 ROW 권장

설정 후 MySQL 재시작

sudo systemctl restart mysql

② 복제 전용 계정 생성

CREATE USER 'repl'@'%' IDENTIFIED BY 'replpass';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

③ 현재 binlog 위치 확인

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

출력 예시:

File: mysql-bin.000001  
Position: 154

이 값을 Slave에서 입력해야 하므로 복사해두기

잠깐! UNLOCK TABLES는 Slave 설정 완료 후 실행

🛠️ 2단계: Slave 서버 설정

① my.cnf 수정

[mysqld]
server-id = 2
relay_log = /var/log/mysql/mysql-relay-bin.log
read_only = 1
  • server-id는 Master와 달라야 함
  • read_only = 1로 쓰기 방지 (SUPER 권한 예외)

설정 후 MySQL 재시작

sudo systemctl restart mysql

② 복제 설정 입력

CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='Master_IP',
  SOURCE_USER='repl',
  SOURCE_PASSWORD='replpass',
  SOURCE_LOG_FILE='mysql-bin.000001',
  SOURCE_LOG_POS=154;

MySQL 8.0.23 이상에서는 MASTER_ 대신 SOURCE_ 구문 사용

③ 복제 시작

START REPLICA; -- 또는 START SLAVE;

상태 확인:

SHOW REPLICA STATUS\G

출력에서 아래 항목이 Yes이면 정상 작동 중

Replica_IO_Running: Yes  
Replica_SQL_Running: Yes
반응형

🧪 복제 확인 테스트

Master에서 데이터 추가

CREATE DATABASE testdb;
USE testdb;
CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(100));
INSERT INTO users VALUES (1, 'Alice');

Slave에서 확인

SELECT * FROM testdb.users;
-- → 동일한 데이터가 자동으로 복제되어 있어야 함

🧠 실무 적용 팁

  • read_only는 필수 설정 (Slave에 직접 쓰기 방지)
  • 복제 계정은 REPLICATION 권한만 부여
  • 복제 지연 여부는 Seconds_Behind_Source로 확인
  • 장애 대비를 위해 복제 모니터링 자동화 도입 추천
  • GTID를 사용하는 경우 설정 방식이 다름 (다음 글에서 다룸)

📘 공식 문서 참고

https://dev.mysql.com/doc/refman/8.0/en/replication-howto.html

 

반응형