用Docker搭建MySQL读写分离环境需部署主从容器,配置server-id、binlog与relay-log,创建自定义网络,授权复制用户,记录并应用主库binlog位置,启动复制,再由应用或ProxySQL实现读写路由。

用 Docker 搭建数据库读写分离环境,核心是让一个主库(Master)处理写操作,多个从库(Slave/Replica)分担读请求,并通过主从复制保持数据一致。Docker 本身不提供复制逻辑,而是帮你快速、可复现地部署 MySQL(或其他数据库)的主从实例,并配置好网络与复制参数。
一、准备两个 MySQL 容器:主库 + 从库
使用官方 mysql:8.0 镜像,分别启动主从容器,注意指定不同端口、数据卷和 server-id:
- 主库(server-id=1),暴露 3307 端口,启用二进制日志(
log-bin) - 从库(server-id=2),暴露 3308 端口,启用中继日志(
relay-log) - 用
docker network create mysql-rw-net创建自定义网络,确保容器间能通过服务名通信
二、配置主库:开启复制权限并记录 binlog 位置
进入主库容器:docker exec -it mysql-master mysql -uroot -p,执行:
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl123';GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';FLUSH PRIVILEGES;-
SHOW MASTER STATUS;—— 记下File和Position(如mysql-bin.000003,154)
三、配置从库:连接主库并启动复制
进入从库容器:docker exec -it mysql-slave mysql -uroot -p,执行:
-
CHANGE REPLICATION SOURCE TOSOURCE_HOST='mysql-master',SOURCE_USER='repl',SOURCE_PASSWORD='repl123',SOURCE_LOG_FILE='mysql-bin.000003',SOURCE_LOG_POS=154; -
START REPLICA;(MySQL 8.0.23+ 用REPLICA,旧版用SLAVE) -
SHOW REPLICA STATUS\G—— 检查Replica_IO_Running和Replica_SQL_Running是否为Yes
四、应用层实现读写分离(简单示例)
Docker 只管数据库实例,读写分离逻辑需由业务代码或中间件完成:
- 开发时:写操作连
localhost:3307(主库),读操作连localhost:3308(从库) - 生产建议:用 ProxySQL 或 MaxScale 做自动路由,它们可部署为独立容器,监听统一端口,根据 SQL 类型(SELECT vs INSERT/UPDATE)分发请求
- 注意:从库延迟不可忽视,强一致性读(如刚写完立刻查)应强制走主库
不复杂但容易忽略:主从容器必须在同一个 Docker 网络;MySQL 配置文件(my.cnf)需挂载进容器并正确设置 server-id、log-bin 等参数;从库首次同步前,主库应无活跃写入或已锁表导出一致快照。

















