MySQL의 Replication(복제) 기능을 이용하면 Master DB의 데이터를 Slave DB가 자동으로 복제받도록 구성할 수 있습니다. 이를 통해 데이터 백업, 부하 분산, 장애 복구 등에 유용하게 활용할 수 있습니다.
mysql/
├── docker-compose.yml
├── master/
│ ├── data/
│ └── my.cnf
└── slave/
├── data/
└── my.cnf
docker-compose.ymlservices:
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_PASSWORD와ping -p비밀번호는 보안상 별표(********) 처리했습니다.
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/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
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';
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';
mysql -u root -p eventor < 파일명.sql
| 구성 요소 | 설명 |
|---|---|
server-id | 마스터/슬레이브 고유 ID (서로 달라야 함) |
log-bin | 이진 로그 활성화 (복제의 핵심) |
gtid_mode, enforce-gtid-consistency | GTID 기반 복제 설정 |
replica_user | 마스터 접속을 위한 슬레이브용 사용자 |
SOURCE_AUTO_POSITION=1 | GTID를 이용한 자동 포지션 연결 |
이번 글에서는 Master-Slave 복제 구조까지만 구성했지만, 실제 운영 환경에서는 마스터가 장애로 중단될 수 있는 상황을 대비해야 합니다. 이를 위해 다음과 같은 구성이 필요합니다:
ProxySQL:
MySQL 앞단에 위치하는 고성능 SQL 프록시로, 자동 장애 감지 및 Slave → Master 승격 기능을 제공합니다.
클라이언트는 항상 ProxySQL에 접속하고, ProxySQL이 내부적으로 읽기/쓰기를 적절한 DB로 라우팅합니다.
Orchestrator, MHA(MySQL High Availability) 등도 자동 장애 조치 도구로 활용됩니다.
[클라이언트]
↓
[ProxySQL]
↓ ↓
[Master] [Slave]
(장애 시 자동 전환)
💡 ProxySQL을 사용하면 읽기/쓰기 분리, 로드 밸런싱, 자동 장애 전환, 세션 유지 등이 가능하여 실제 운영 환경에서 매우 강력한 솔루션입니다.
이제 Master-Slave 구성만으로도 복제가 가능하지만, 장애 대비를 위해 ProxySQL 등의 도입을 고려해보는 것이 좋습니다.