MySQL Master-Slave Replication 구성 (Docker 기반)

이경헌·2025년 5월 5일

MySQL의 Replication(복제) 기능을 이용하면 Master DB의 데이터를 Slave DB가 자동으로 복제받도록 구성할 수 있습니다. 이를 통해 데이터 백업, 부하 분산, 장애 복구 등에 유용하게 활용할 수 있습니다.

🔧 목표

  • Master-Slave 구조의 MySQL 이중화 환경을 Docker 기반으로 구축
  • 데이터 분산 처리 및 백업 대비용 설정

📁 폴더 구조

mysql/
├── docker-compose.yml
├── master/
│   ├── data/
│   └── my.cnf
└── slave/
    ├── data/
    └── my.cnf

📦 docker-compose.yml

services:
  mysql-master:
    container_name: mysql-master
    image: mysql:9.2
    restart: always
    ports:
      - "3300:3306"
    volumes:
      - ./master/data:/var/lib/mysql
      - ./master/my.cnf:/etc/my.cnf
    environment:
      MYSQL_ROOT_PASSWORD: ********
      MYSQL_DATABASE: eventor
      TZ: Asia/Seoul
    networks:
      - eventor_back-network
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-p********"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 15s

  mysql-slave:
    container_name: mysql-slave
    image: mysql:9.2
    restart: always
    ports:
      - "3301:3306"
    volumes:
      - ./slave/data:/var/lib/mysql
      - ./slave/my.cnf:/etc/my.cnf
    environment:
      MYSQL_ROOT_PASSWORD: ********
      MYSQL_DATABASE: eventor
      TZ: Asia/Seoul
    depends_on:
      - mysql-master
    networks:
      - eventor_back-network
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-p********"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 15s

networks:
  eventor_back-network:
    external: true

MYSQL_ROOT_PASSWORDping -p 비밀번호는 보안상 별표(********) 처리했습니다.


⚙️ Master 설정 (master/my.cnf)

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
default-time-zone = '+9:00'

server-id = 1
log-bin = mysql-bin
binlog-format = ROW
binlog_expire_logs_seconds = 604800

gtid_mode = ON
enforce-gtid-consistency = ON
sync_binlog = 1

caching_sha2_password_auto_generate_rsa_keys = ON
sha256_password_auto_generate_rsa_keys = ON

⚙️ Slave 설정 (slave/my.cnf)

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
default-time-zone = '+9:00'

server-id = 2
log-bin = mysql-bin
log_slave_updates = ON
binlog_format = ROW

relay_log = /var/lib/mysql/mysql-relay-bin
relay_log_recovery = ON
read_only = ON

binlog_expire_logs_seconds = 604800

gtid_mode = ON
enforce-gtid-consistency = ON
sync_binlog = 1

caching_sha2_password_auto_generate_rsa_keys = ON
sha256_password_auto_generate_rsa_keys = ON

🔑 Master에서 복제 계정 생성

docker exec -it mysql-master bash
mysql -u root -p
-- 복제 계정 생성
CREATE USER 'replica_user'@'%' IDENTIFIED BY '********';
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%';
FLUSH PRIVILEGES;

복제 계정이 생성되었는지 확인:

SELECT User, Host FROM mysql.user WHERE User = 'replica_user';

🔄 Slave에서 Master 연결 설정

docker exec -it mysql-slave bash
mysql -u root -p
-- 복제 시작을 위한 설정
CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='mysql-master',
  SOURCE_USER='replica_user',
  SOURCE_PASSWORD='********',
  GET_SOURCE_PUBLIC_KEY = 1,
  SOURCE_AUTO_POSITION = 1;

-- 복제 시작
START REPLICA;

복제 상태 확인:

SHOW REPLICA STATUS\G

서버 ID 확인:

SHOW VARIABLES LIKE 'server_id';

📦 SQL 덤프 복원 (선택)

mysql -u root -p eventor < 파일명.sql

🔍 참고자료


✅ 정리

구성 요소설명
server-id마스터/슬레이브 고유 ID (서로 달라야 함)
log-bin이진 로그 활성화 (복제의 핵심)
gtid_mode, enforce-gtid-consistencyGTID 기반 복제 설정
replica_user마스터 접속을 위한 슬레이브용 사용자
SOURCE_AUTO_POSITION=1GTID를 이용한 자동 포지션 연결

🔁 Failover(자동 장애 조치) 구성은 어떻게?

이번 글에서는 Master-Slave 복제 구조까지만 구성했지만, 실제 운영 환경에서는 마스터가 장애로 중단될 수 있는 상황을 대비해야 합니다. 이를 위해 다음과 같은 구성이 필요합니다:

✅ ProxySQL 또는 MHA를 통한 장애 조치(Failover)

  • ProxySQL:
    MySQL 앞단에 위치하는 고성능 SQL 프록시로, 자동 장애 감지 및 Slave → Master 승격 기능을 제공합니다.
    클라이언트는 항상 ProxySQL에 접속하고, ProxySQL이 내부적으로 읽기/쓰기를 적절한 DB로 라우팅합니다.

  • Orchestrator, MHA(MySQL High Availability) 등도 자동 장애 조치 도구로 활용됩니다.

[클라이언트]
     ↓
  [ProxySQL]
   ↓      ↓
[Master] [Slave]
(장애 시 자동 전환)

💡 ProxySQL을 사용하면 읽기/쓰기 분리, 로드 밸런싱, 자동 장애 전환, 세션 유지 등이 가능하여 실제 운영 환경에서 매우 강력한 솔루션입니다.


이제 Master-Slave 구성만으로도 복제가 가능하지만, 장애 대비를 위해 ProxySQL 등의 도입을 고려해보는 것이 좋습니다.

0개의 댓글