【技术底稿 09】MySQL 主从搭建完不算完!37 岁老码农生产级三件套:巡检 + 双节点监控 + 异地备份
一、前言在上一篇【技术底稿 05】中我们已经完成了 MySQL 主从复制的搭建实现了主写从读、数据实时同步的基础高可用架构。但在真实生产环境中搭完主从只是第一步。如果没有状态巡检、没有监控告警、没有数据备份一旦主从延迟、主库宕机、数据误删整个系统就会瞬间失控。本文基于我个人 DevOps 平台的真实生产环境分享 MySQL 主从搭建完成后必须落地的生产级三件套主从健康状态巡检每日必做确保同步正常双节点监控接入 Prometheus实时监控主从状态与延迟主库自动备份 异地容灾数据安全的最后一道防线所有操作均基于 Docker 环境命令可直接复制完全适配个人 / 中小企业生产环境无任何虚招。二、环境说明与技术底稿 05 完全对齐直接复用表格项目配置主库HP 服务器Ubuntu 22.04IP192.168.18.100Docker 部署 MySQL 8.0从库联想笔记本Ubuntu 22.04IP192.168.18.101Docker 部署 MySQL 8.0监控体系HP 服务器部署 Prometheus GrafanaDocker Compose 管理网络架构主从均为内网外网通过阿里云 FRP 穿透MySQL 端口 3306 完全不暴露公网核心目标主从状态可视化、数据零丢失、故障可预警三、第一件事主从健康状态巡检每日必做主从同步是否正常是 MySQL 高可用的核心。我们需要两个核心命令快速判断主从状态。1. 主库执行查看主库日志位置sqldocker exec -it mysql8 mysql -uroot -pmysql_123! -e SHOW MASTER STATUS;执行结果示例关键说明File当前主库正在写入的 binlog 文件Position当前 binlog 的写入位置从库会以此为基准进行同步此命令用于确认主库 binlog 写入正常是主从同步的源头2. 从库执行查看从库同步状态sqldocker exec -it mysql-slave mysql -uroot -pmysql_123! -e SHOW SLAVE STATUS\G;核心关注三个关键字段plaintextSlave_IO_Running: Yes Slave_SQL_Running: Yes Seconds_Behind_Master: 0Slave_IO_Running: Yes从库 IO 线程正常能正常拉取主库 binlogSlave_SQL_Running: Yes从库 SQL 线程正常能正常执行 binlog 中的 SQLSeconds_Behind_Master: 0主从同步延迟为 0数据完全一致异常判断任意一个线程为No说明主从同步中断需立即排查Seconds_Behind_Master数值持续增大说明主从延迟严重需优化实战建议将这两个命令加入每日巡检脚本或配置 Prometheus 告警一旦异常立即通知。四、第二件事双节点监控接入 Prometheus从库无 compose 专用版重要说明真实环境踩坑备注我的从库联想机器之前因为系统 Python 被升级导致docker-compose v1 直接报废无法使用。因此本篇不使用 docker-compose全部采用docker run 命令稳定、无依赖、不污染环境真正生产可用。1. 从库启动 mysqld_exporterdocker run 一条命令在从库192.168.18.101直接执行不需要 compose、不需要配置文件bash运行# 先创建MySQL监控配置文件 cat ~/myapp/.my.cnf EOF [client] userroot passwordmysql_123! host127.0.0.1 port3306 EOF # 授权文件权限解决权限拒绝问题 chmod 644 ~/myapp/.my.cnf # 启动 mysqld_exporter 最终稳定版 docker run -d \ --name mysqld_exporter \ --restart always \ --user root \ -v ~/myapp/.my.cnf:/root/.my.cnf \ --nethost \ prom/mysqld-exporter \ --config.my-cnf/root/.my.cnf2. 检查是否启动成功bash运行docker ps | grep mysqld_exporter3. Prometheus 加入从库监控HP 主库操作修改prometheus.ymlyamlscrape_configs: - job_name: mysqld_exporter static_configs: - targets: [192.168.18.100:9104] - job_name: mysql-slave static_configs: - targets: [192.168.18.101:9104]4. 重启 Prometheusbash运行docker restart prometheus5. 验证监控打开 Prometheus targets 页面能看到mysql-slave 为 UP 即成功。6. 监控效果验证登录 Grafana导入 MySQL 监控面板即可看到主库、从库的连接数、QPS、TPS 实时数据主从同步状态、延迟时间可视化一旦主从中断、延迟过高立即触发告警实战价值双节点监控让主从状态完全可视化彻底告别 “黑盒运维”故障发生前就能提前预警。五、第三件事主库自动备份 异地容灾数据安全底线主从架构只能解决高可用无法解决数据误删、磁盘损坏等问题。备份是数据安全的最后一道防线。我们在主库实现每日自动备份 异地同步到从库形成生产级数据安全闭环。1. 备份脚本最终版直接复制路径/opt/backup/mysql_backup.shbash运行#!/bin/bash DATE$(date %Y%m%d_%H%M%S) BACKUP_DIR/opt/backup/mysql # 远程备份机器联想从库SSH 免密已配置 REMOTE_IP192.168.18.101 REMOTE_USERhanyue REMOTE_DIR/opt/backup/mysql MYSQL_USERroot MYSQL_PASSmysql_123! MYSQL_CONTAINERmysql8 MYSQL_DBshangzhuhui # 1. 执行 MySQL 全量备份 docker exec $MYSQL_CONTAINER mysqldump -u$MYSQL_USER -p$MYSQL_PASS $MYSQL_DB $BACKUP_DIR/db_$DATE.sql # 2. 压缩备份文件节省空间 gzip $BACKUP_DIR/db_$DATE.sql # 3. 异地同步到从库实现容灾 rsync -avz $BACKUP_DIR/db_$DATE.sql.gz $REMOTE_USER$REMOTE_IP:$REMOTE_DIR/ # 4. 清理本地 7 天前的旧备份 find $BACKUP_DIR -name db_*.sql.gz -type f -mtime 7 -delete2. 从库上创建文件夹bash运行sudo mkdir -p /opt/backup/mysql sudo chmod 777 /opt/backup/mysql3. 脚本授权与测试bash运行# 赋予执行权限 sudo chmod x /opt/backup/mysql_backup.sh # 授权备份目录 sudo chmod 777 /opt/backup/mysql # 手动执行测试 /opt/backup/mysql_backup.sh4. 定时任务配置每日凌晨 2 点自动执行bash运行sudo crontab -e # 添加一行 0 2 * * * /opt/backup/mysql_backup.sh /var/log/mysql_backup.log 215. 效果验证主库ls /opt/backup/mysql可看到db_日期.sql.gz备份文件从库ls /opt/backup/mysql可看到同步过来的备份文件日志tail -f /var/log/mysql_backup.log可查看备份执行日志核心优势从库无需单独备份仅同步主库备份节省资源异地容灾即使主库磁盘损坏也能通过从库备份快速恢复自动执行无需人工干预稳定可靠六、总结MySQL 主从生产级闭环通过本文的三件套操作我们将 MySQL 主从从 “能跑” 升级为 “生产可用”状态巡检每日确认主从同步正常防患于未然双节点监控主从状态可视化故障提前预警自动备份 异地容灾数据安全兜底零丢失保障下一篇预告我们将基于这套主从架构分享 MySQL 读写分离的实战落地进一步提升系统性能。关注我持续更新《人生底稿》成长史 《技术底稿》《产品底稿》实战干货一起踏实成长不焦虑、不内卷。 系列导航【人生底稿 01】农村少年1995–2005【技术底稿】0137岁老码农用4台机器搭了套个人DevOps平台【产品底稿01】37 岁 Java 老码农用 Java 搭了个 AI 写作助手把自己 14 年技术文章全喂给了 AI