
1. 项目概述在本地开发环境中搭建MySQL主从复制架构是每个中高级开发者都应该掌握的实用技能。不同于生产环境我们在Docker Desktop里实现这个方案既能模拟真实场景又避免了复杂的服务器配置。今天我就把多年实践中总结的这套开箱即用方案完整分享给大家。主从复制Replication的核心价值在于读写分离提升性能、数据冗余保障安全、横向扩展应对高并发。对于需要频繁读写数据库的Web应用、数据分析系统来说这种架构能显著改善响应速度。而Docker化部署让整个过程变得异常简单——不需要多台物理机不需要复杂的环境准备一台笔记本就能完成全流程验证。2. 环境准备与基础配置2.1 Docker环境检查首先确认你的Docker Desktop正常运行Windows/macOS通用docker --version # 输出示例Docker version 20.10.17, build 100c701 docker-compose --version # 输出示例docker-compose version 1.29.2, build 5becea4c注意建议使用Docker Desktop 4.12版本旧版可能存在网络配置问题。如果版本过低先去官网下载最新安装包。2.2 创建专用网络为MySQL容器创建隔离网络避免端口冲突docker network create mysql-replication-net验证网络是否创建成功docker network ls | grep mysql-replication2.3 准备配置文件目录在本地创建配置文件夹结构以macOS为例~/docker-mysql-replication ├── master │ ├── conf │ │ └── my.cnf │ └── data └── slave ├── conf │ └── my.cnf └── data主库配置文件master/conf/my.cnf内容[mysqld] server-id 1 log_bin mysql-bin binlog_format ROW binlog_do_db app_db expire_logs_days 7从库配置文件slave/conf/my.cnf内容[mysqld] server-id 2 relay-log mysql-relay-bin log_bin mysql-bin binlog_format ROW read_only ON关键参数说明server-id必须唯一主从不能相同binlog_formatROW提供最安全的数据复制read_onlyON确保从库不会被误写入3. 启动MySQL容器集群3.1 启动主库容器docker run -d --name mysql-master \ --network mysql-replication-net \ -v ~/docker-mysql-replication/master/conf:/etc/mysql/conf.d \ -v ~/docker-mysql-replication/master/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORDmasterpass \ -p 3306:3306 \ mysql:8.0 \ --character-set-serverutf8mb4 \ --collation-serverutf8mb4_unicode_ci3.2 启动从库容器docker run -d --name mysql-slave \ --network mysql-replication-net \ -v ~/docker-mysql-replication/slave/conf:/etc/mysql/conf.d \ -v ~/docker-mysql-replication/slave/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORDslavepass \ -p 3307:3306 \ mysql:8.0 \ --character-set-serverutf8mb4 \ --collation-serverutf8mb4_unicode_ci端口映射说明主库映射到主机3306常规MySQL端口从库映射到主机3307避免冲突4. 配置主从复制关系4.1 主库操作进入主库容器docker exec -it mysql-master mysql -uroot -pmasterpass执行以下SQL命令-- 创建复制专用用户 CREATE USER repl% IDENTIFIED WITH mysql_native_password BY replpass; GRANT REPLICATION SLAVE ON *.* TO repl%; -- 查看主库状态记录File和Position SHOW MASTER STATUS;示例输出------------------------------------------------------------------------------- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | ------------------------------------------------------------------------------- | mysql-bin.000003 | 835 | app_db | | | -------------------------------------------------------------------------------4.2 从库操作进入从库容器docker exec -it mysql-slave mysql -uroot -pslavepass执行复制配置注意替换MASTER_LOG_FILE和MASTER_LOG_POSCHANGE MASTER TO MASTER_HOSTmysql-master, MASTER_USERrepl, MASTER_PASSWORDreplpass, MASTER_LOG_FILEmysql-bin.000003, MASTER_LOG_POS835; START SLAVE; -- 检查复制状态 SHOW SLAVE STATUS\G关键指标验证Slave_IO_Running: YesSlave_SQL_Running: YesSeconds_Behind_Master: 0表示已完全同步5. 验证与测试5.1 创建测试数据在主库执行CREATE DATABASE app_db; USE app_db; CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, email VARCHAR(100) UNIQUE ); INSERT INTO users(name, email) VALUES(张三, zhangsantest.com);5.2 从库查询验证在从库执行USE app_db; SELECT * FROM users;应该能看到与主库相同的数据。此时如果在从库尝试写入INSERT INTO users(name, email) VALUES(李四, lisitest.com);会报错ERROR 1290 (HY000): The MySQL server is running with the --read-only option...这正是我们期望的行为——从库只读所有写操作必须走主库。6. 日常管理与问题排查6.1 常用监控命令查看主库状态SHOW MASTER STATUS; SHOW PROCESSLIST;查看从库状态SHOW SLAVE STATUS\G SHOW REPLICA STATUS\G -- MySQL 8.0新语法6.2 常见问题处理问题1Slave_IO_Running为Connecting检查网络连通性docker exec -it mysql-slave ping mysql-master验证复制用户权限检查防火墙设置问题2Slave_SQL_Running为No查看Last_Error字段获取具体错误常见解决方法STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER1; START SLAVE;问题3数据不一致主从校验工具pt-table-checksum hmysql-master,uroot,pmasterpass pt-table-sync hmysql-master,uroot,pmasterpass --replicate hmysql-slave6.3 备份与恢复策略建议在主库配置定期全量备份docker exec mysql-master /usr/bin/mysqldump -uroot -pmasterpass --all-databases full_backup.sql从库异常时重建流程停止从库服务清空数据目录rm -rf ~/docker-mysql-replication/slave/data/*从主库备份恢复数据重新配置复制关系7. 性能优化建议7.1 主库配置优化# 在my.cnf中添加 sync_binlog 1 innodb_flush_log_at_trx_commit 1 binlog_group_commit_sync_delay 100 binlog_group_commit_sync_no_delay_count 107.2 从库并行复制MySQL 8.0支持基于WRITESET的并行复制STOP SLAVE; SET GLOBAL slave_parallel_workers 4; SET GLOBAL slave_parallel_type LOGICAL_CLOCK; START SLAVE;7.3 读写分离实现在应用层配置数据源路由写操作指向主库3306端口读操作指向从库3307端口Spring Boot示例配置spring: datasource: write: url: jdbc:mysql://localhost:3306/app_db username: root password: masterpass read: url: jdbc:mysql://localhost:3307/app_db username: root password: slavepass8. 扩展架构建议当单从库无法满足读需求时可以横向扩展多个从库# 启动第二个从库端口映射改为3308 docker run -d --name mysql-slave-2 -p 3308:3306 ...搭建级联复制主库 - 从1 - 从库2考虑GTID复制模式适合复杂拓扑-- 主库启用GTID gtid_modeON enforce_gtid_consistencyON -- 从库配置 CHANGE MASTER TO MASTER_AUTO_POSITION1;这套Docker化的MySQL主从复制方案我已经在十几个项目中实际应用过。最大的优势是开发环境的真实性——你能在本地完全模拟生产架构而资源消耗仅为传统方案的1/10。对于需要快速验证数据库架构的团队这绝对是性价比最高的选择。