文档首页> Linux命令> mysql主从复制docker版

mysql主从复制docker版

发布时间:2025-06-26 00:04       

以下是在 Docker 环境中搭建 MySQL 主从复制架构的专业级实践指南,结合最新容器技术规范(MySQL 8.x+)和工业级可靠性要求:


一、核心原理与组件

  1. 主节点 (Source)
    📝 记录所有数据变更到二进制日志 (binlog)
  2. 从节点 (Replica)
    🔄 实时拉取主节点 binlog 并重放(基于GTID或位点复制)
  3. 关键协议
    ⚙️ 异步复制(默认) / 半同步复制(需插件)

二、Docker 部署准备

1. 网络配置(避免IP动态变化)

docker network create mysql-cluster-net
​

2. 持久化数据目录

mkdir -p /data/mysql/{master,slave}/conf /data/mysql/{master,slave}/data
​

三、主节点配置 (Source)

1. 配置文件 (/data/mysql/master/conf/my.cnf)

[mysqld]
server_id = 1
log_bin = mysql-bin
binlog_format = ROW
gtid_mode = ON
enforce_gtid_consistency = ON

# 容器环境关键参数
skip_name_resolve = ON
bind-address = 0.0.0.0
​

2. 启动主容器

docker run -d --name mysql-master \
  --network mysql-cluster-net \
  -v /data/mysql/master/conf:/etc/mysql/conf.d \
  -v /data/mysql/master/data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=MasterRoot123! \
  -p 3306:3306 \
  mysql:8.0.34 \
  --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_unicode_ci
​

3. 创建复制账户

CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'ReplPass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
​

⚠️ 安全注意:MySQL 8 默认使用 caching_sha2_password,从节点需兼容认证插件


四、从节点配置 (Replica)

1. 配置文件 (/data/mysql/slave/conf/my.cnf)

[mysqld]
server_id = 2  # 必须全局唯一
relay_log = mysql-relay-bin
read_only = ON
gtid_mode = ON
enforce_gtid_consistency = ON

# 级联复制支持(非必需)
log_slave_updates = ON
​

2. 启动从容器

docker run -d --name mysql-slave \
  --network mysql-cluster-net \
  -v /data/mysql/slave/conf:/etc/mysql/conf.d \
  -v /data/mysql/slave/data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=SlaveRoot123! \
  -p 3307:3306 \
  mysql:8.0.34
​

3. 配置主从链路

CHANGE MASTER TO
  MASTER_HOST = 'mysql-master',  # 使用Docker容器名解析
  MASTER_USER = 'repl',
  MASTER_PASSWORD = 'ReplPass123!',
  MASTER_AUTO_POSITION = 1;  # GTID自动定位

START SLAVE;
​

✅ 验证复制状态:

SHOW SLAVE STATUS\G
-- 确保以下两项为 "Yes"
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes
-- 无 Last_IO_Error / Last_SQL_Error
​

五、工业级加固措施

  1. 半同步复制(防数据丢失)
    在主节点执行:

    INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so';
    SET GLOBAL rpl_semi_sync_source_enabled = 1;
    ​

    在从节点执行:

    INSTALL PLUGIN rpl_semi_sync_replica SONAME 'semisync_replica.so';
    SET GLOBAL rpl_semi_sync_replica_enabled = 1;
    ​
  2. 复制过滤(按需启用)

    # 主节点忽略系统库复制
    binlog_ignore_db = information_schema,mysql,performance_schema,sys
    ​
  3. 容器健康检查

    HEALTHCHECK --interval=30s --timeout=5s \
      CMD mysqladmin ping -uroot -p${MYSQL_ROOT_PASSWORD} || exit 1
    ​

六、故障排查清单

现象 排查点 解决方案
Slave_IO_Running=No 网络连通性 / 复制账号权限 telnet mysql-master 3306
Slave_SQL_Running=No 主从数据冲突 / GTID不一致 SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
Seconds_Behind_Master增大 从库负载过高 优化查询 / 增加从库资源

七、版本适配说明

  • MySQL 5.7:移除 MASTER_AUTO_POSITION,改用 binlog 文件名+位点
  • Docker Compose:推荐使用 depends_on + healthcheck 控制启动顺序
  • Kubernetes:需配置 StatefulSet + Headless Service 实现动态拓扑

📌 最终验证:在主库插入数据,2秒内从库可见即成功

-- 主库执行
CREATE DATABASE rep_test;
USE rep_test;
CREATE TABLE t1(id INT PRIMARY KEY);
INSERT INTO t1 VALUES(1);

-- 从库查询
SELECT * FROM rep_test.t1;  -- 应返回 id=1
​

此方案通过 Docker 容器名实现服务发现,避免IP变动问题;采用 GTID 简化故障切换流程,符合金融级数据一致性要求。建议生产环境配合监控工具(如 Prometheus + Grafana)实时跟踪复制延迟。🚀