【技术底稿】05:MySQL主从搭建踩坑全记录,30分钟搞定生产级主从

张开发
2026/6/12 12:15:47 15 分钟阅读
【技术底稿】05:MySQL主从搭建踩坑全记录,30分钟搞定生产级主从
SSH免密登录 Docker环境部署 Docker Compose避坑 主从配置全流程14年老码农实战亲测零报错、可直接复制生产环境直接复用避开所有新手坑一、环境说明精准对标直接套用本文全程实战所有命令均在以下环境测试通过你可直接对标自己的机器配置无需额外调整版本项目配置主库HPUbuntu 22.04IP192.168.18.100从库LenovoUbuntu 22.04IP192.168.18.101Docker 版本两台保持一致实测 29.3.0 完美兼容MySQL 版本mysql:8.0稳定版避免高版本兼容问题核心目标主从数据实时同步、主写从读满足生产级高可用需求二、步骤1配置 SSH 免密登录多机互通基础必做多机搭建主从SSH免密是基础避免每次操作都输入密码提升效率且为后续运维铺路。1. 主库生成 SSH 密钥bashssh-keygen -t rsa # 一路回车无需设置密码2. 主库公钥发送到从库bashssh-copy-id xyy192.168.18.101提示输入从库密码输入后回车即可完成公钥推送仅需一次操作。3. 验证免密登录bashssh xyy192.168.18.101无需输入密码直接登录到从库即为配置成功 ✅三、步骤2从库部署 Docker 环境主库已部署从库快速同步主从库需保持Docker环境一致避免镜像运行异常。1. 安装 Dockerbashsudo apt update sudo apt install -y docker.io sudo systemctl enable --now docker2. 验证安装bashdocker --version输出类似Docker version 29.3.0, build 7c41732即为安装成功 ✅3. 拉取 MySQL 8.0 镜像与主库保持一致bashdocker pull mysql:8.0镜像拉取完成后可通过docker images查看确保镜像标签为8.0。四、步骤3Docker Compose 踩坑与避坑总结重点90%的人栽在这里1. 问题现象必看你大概率会遇到初始尝试用pip3 install docker-compose安装 v1.29.2 版本执行docker-compose up -d启动容器时直接报错TypeError: kwargs_from_env() got an unexpected keyword argument ssl_version2. 根本原因彻底搞懂避免再踩Ubuntu 22.04 自带 Python 3.10而 docker-compose v1.29.2 是老版本与新版 Python 依赖不兼容pip 安装的 docker-compose 会污染系统 Python 依赖库导致后续无论怎么重装、卸载都无法修复关键结论Ubuntu 22.04 环境下docker-compose v1 版本完全不可用无需浪费时间修复3. 最终解决方案实战可用零依赖bash# 彻底卸载 pip 安装的 compose 及污染的 Python 依赖 pip3 uninstall docker-compose -y # 清理系统缓存、修复环境变量 sudo apt autoremove -y sudo apt clean核心方案放弃 docker-compose改用纯docker run命令启动容器稳定、零依赖、无兼容问题未来建议直接使用官方内置docker composeV2版本无 Python 依赖与 Docker 引擎强绑定兼容性拉满五、步骤4纯命令启动 MySQL 从库稳定无坑生产级配置放弃 compose 后用以下纯 docker 命令启动从库参数与主库完全匹配确保主从兼容。bashdocker run -d \ --name mysql-slave \ --restart always \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDmysql_123! \ -v ~/mysql-slave/data:/var/lib/mysql \ mysql:8.0 \ --default-authentication-pluginmysql_native_password \ --server-id101 \ --log-binmysql-bin \ --relay-logrelay-bin \ --read-only1关键参数说明必看避免配置错误参数说明--server-id101必须唯一主库默认为 1从库需设置为不同值建议按 IP 尾号设置--read-only1从库设置为只读模式防止误写入避免主从数据不一致-v ~/mysql-slave/data:/var/lib/mysql数据卷挂载实现数据持久化--default-authentication-pluginmysql_native_password兼容 MySQL 8.0 密码验证方式避免连接失败启动后执行docker ps看到mysql-slave状态为Up即为启动成功 ✅六、步骤5主库配置创建同步账号 获取 binlog 位置核心步骤1. 创建主从复制专用账号bashdocker exec -it mysql8 mysql -uroot -pmysql_123! -e CREATE USER repl% IDENTIFIED WITH mysql_native_password BY repl123456; GRANT REPLICATION SLAVE ON *.* TO repl%; FLUSH PRIVILEGES;账号repl、密码repl123456可自定义建议记好后续从库需用到。2. 查看主库 binlog 位点关键信息务必记录bashdocker exec -it mysql8 mysql -uroot -pmysql_123! -e SHOW MASTER STATUS;实战实际结果你的结果可能略有差异以自己的输出为准File: binlog.000017 Position: 827重点记录Filebinlog 文件名和Position偏移量后续从库关联主库必须用到错一个字符都会同步失败七、步骤6从库配置关联主库 启动同步最后一步1. 从库关联主库bashdocker exec -it mysql-slave mysql -uroot -pmysql_123! -e CHANGE MASTER TO MASTER_HOST192.168.18.100, # 主库IP替换为你的主库实际IP MASTER_USERrepl, # 主库创建的同步账号 MASTER_PASSWORDrepl123456, # 同步账号密码 MASTER_LOG_FILEbinlog.000017,# 主库binlog文件名替换为你的实际结果 MASTER_LOG_POS827; # 主库binlog偏移量替换为你的实际结果2. 启动从库同步bashdocker exec -it mysql-slave mysql -uroot -pmysql_123! -e START SLAVE;3. 查看主从状态验证是否成功bashdocker exec -it mysql-slave mysql -uroot -pmysql_123! -e SHOW SLAVE STATUS\G;八、最终结果主从搭建成功 ✅关键状态确认查看主从状态输出找到以下3个关键信息全部满足即为搭建成功Slave_IO_Running: Yes Slave_SQL_Running: Yes Seconds_Behind_Master: 0状态含义Slave_IO_Running: Yes从库 IO 线程正常能正常读取主库 binlogSlave_SQL_Running: Yes从库 SQL 线程正常能正常执行同步语句Seconds_Behind_Master: 0主从延迟为 0数据实时同步满足生产级需求九、经验总结生产环境必看避坑指南14年老码农实战总结每一条都踩过坑帮你节省大量排查时间。Docker 是多机环境一致性的核心工具主从库务必保持 Docker 和 MySQL 版本一致Docker Compose v1 版本在 Ubuntu 22.04 极易踩坑不推荐使用优先用纯docker run或 Compose V2单机单实例场景优先使用docker run命令稳定、排错快、零依赖MySQL 主从搭建 3 个关键点server-id唯一、主库开启 binlog、同步账号权限正确系统级依赖不要用 pip 安装极易造成环境污染优先使用系统原生包主从搭建完成后可在主库创建测试库、插入数据从库实时同步验证同步效果后再投入使用十、结尾福利本文所有命令均已实战验证可直接复制执行仅需替换主从 IP 和 binlog 信息即可。关注我【技术底稿】系列持续更新DevOps 实战AI 知识库搭建系统架构相关内容后续将更新主从故障排查、主从切换实战帮你彻底搞定 MySQL 高可用如果搭建过程中遇到问题评论区留言我一一帮你解决【技术底稿】0137岁老码农用4台机器搭了套个人DevOps平台

更多文章