基于Docker的MySQL主从复制部署全流程

1. 核心概念
  • 主从复制:主库(Master)将数据变更同步到从库(Slave)
  • 关键组件
    • Binlog:主库的二进制日志,记录所有数据变更
    • Relay Log:从库的中转日志
    • IO Thread:从库拉取主库日志的线程
    • SQL Thread:从库执行日志的线程
2. 环境准备
# 创建专用网络
docker network create mysql-net

# 创建数据卷
docker volume create master-data
docker volume create slave-data

3. 主库部署

步骤1:启动主库容器

docker run -d --name mysql-master \
  --network mysql-net \
  -v master-data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=masterpass \
  -p 3306:3306 \
  mysql:8.0 \
  --server-id=1 \
  --log-bin=mysql-bin

步骤2:配置主库

# 进入容器
docker exec -it mysql-master mysql -uroot -pmasterpass

# SQL配置
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'slavepass';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

# 查看主库状态(记录File和Position)
SHOW MASTER STATUS;

4. 从库部署

步骤1:启动从库容器

docker run -d --name mysql-slave \
  --network mysql-net \
  -v slave-data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=slavepass \
  -p 3307:3306 \
  mysql:8.0 \
  --server-id=2

步骤2:配置从库

# 进入容器
docker exec -it mysql-slave mysql -uroot -pslavepass

# SQL配置(使用主库记录的File和Position)
CHANGE MASTER TO
  MASTER_HOST='mysql-master',
  MASTER_USER='repl',
  MASTER_PASSWORD='slavepass',
  MASTER_LOG_FILE='mysql-bin.000001',  # 替换实际值
  MASTER_LOG_POS=157;                 # 替换实际值

# 启动复制
START SLAVE;

5. 验证主从同步
# 在主库创建测试数据
docker exec mysql-master mysql -uroot -pmasterpass -e "CREATE DATABASE sync_test;"

# 在从库检查同步
docker exec mysql-slave mysql -uroot -pslavepass -e "SHOW DATABASES;"

6. 故障排查命令
-- 查看从库状态
SHOW SLAVE STATUS\G

-- 检查线程状态
SELECT * FROM performance_schema.replication_applier_status;

-- 重置复制(从库执行)
STOP SLAVE; 
RESET SLAVE ALL;

7. 配置优化建议
# 主库my.cnf追加
[mysqld]
sync_binlog=1
innodb_flush_log_at_trx_commit=1

# 从库my.cnf追加
[mysqld]
read_only=ON
relay_log_recovery=1

关键注意事项

  1. 主从server-id必须唯一
  2. 主库需开启log-bin
  3. 确保容器间网络互通(使用--network
  4. 数据操作仅在主库执行
  5. 跨版本部署时注意MySQL版本兼容性

通过此流程,可实现每秒数千次的同步吞吐量,延迟控制在毫秒级。实际部署时建议使用docker-compose管理容器编排,并配置健康检查机制。

更多推荐