MySQL主备自动切换完整配置指南 (2026)

为什么需要MySQL主备自动切换?

在云服务器上运行MySQL数据库时,单点故障是企业面临的最大风险之一。一旦主数据库宕机,整个业务系统可能陷入瘫痪,造成不可估量的损失。通过配置MySQL主备自动切换(Failover),可以在主库故障时自动将备库提升为主库,实现业务的快速恢复,将停机时间从小时级缩短到秒级。

本文将详细介绍如何从零搭建一套可靠的MySQL主备自动切换方案。

一、搭建主从复制架构

主备自动切换的前提是主从复制已经正确配置。以下是关键步骤:

1.1 主库配置

在主数据库的 my.cnf 中添加以下配置:

[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
expire_logs_days = 7

重启MySQL后,创建复制用户:

CREATE USER 'repl'@'%' IDENTIFIED BY '强密码';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

1.2 从库配置

在从数据库的 my.cnf 中配置:

[mysqld]
server-id = 2
relay-log = relay-bin
read-only = 1
log-bin = mysql-bin
log-slave-updates = 1

然后执行主从连接命令,确保数据同步正常。

1.3 验证复制状态

检查项 命令 期望结果
主库Binlog SHOW MASTER STATUS; File和Position有值
从库IO线程 SHOW SLAVE STATUS\G Slave_IO_Running: Yes
从库SQL线程 SHOW SLAVE STATUS\G Slave_SQL_Running: Yes
复制延迟 Seconds_Behind_Master 0或接近0

二、健康监控方案

自动切换的基础是准确的健康检测。监控维度和告警阈值如下:

  • 进程存活检测:每5秒检查MySQL进程是否运行
  • 连接可用性:尝试建立连接并执行简单查询(如 SELECT 1
  • 复制延迟:延迟超过10秒触发告警,超过60秒视为异常
  • 磁盘空间:数据盘使用率超过85%告警
  • 慢查询:30秒内慢查询超过5条触发关注

推荐使用以下监控工具组合:

工具 用途 优势
Prometheus + Grafana 指标采集与可视化 生态丰富,告警灵活
Orchestrator MySQL拓扑管理 自动发现,可视化拓扑
MHA 主备切换 成熟稳定,数据安全

三、自动切换脚本实现

核心切换逻辑伪代码如下:

def check_master_health():
    """检测主库是否健康"""
    try:
        conn = mysql.connect(host=master_host, timeout=3)
        conn.execute("SELECT 1")
        # 检查复制延迟
        delay = get_replication_delay()
        return delay < 60
    except:
        return False

def perform_failover():
    """执行故障切换"""
    # 1. 确认主库确实不可用(多次重试)
    for i in range(3):
        if check_master_health():
            return  # 主库恢复,取消切换

    # 2. 选择最优从库(延迟最低、数据最新)
    best_slave = select_best_slave()

    # 3. 停止从库复制
    stop_slave(best_slave)

    # 4. 提升从库为主库
    promote_to_master(best_slave)

    # 5. 更新其他从库指向新主库
    redirect_slaves(best_slave)

    # 6. 更新VIP或DNS(让应用自动连接新主库)
    update_vip(best_slave)

    # 7. 发送通知
    send_alert("主备切换完成", f"新主库: {best_slave}")

四、VIP漂移与DNS切换

切换后,应用程序需要知道新的主库地址。有两种主流方案:

方案对比

方案 切换速度 实现复杂度 适用场景
VIP漂移 1-3秒 同一子网内
DNS切换 30-120秒 跨网段场景
代理层(ProxySQL/MySQL Router) 1-5秒 大规模集群

推荐方案:同机房部署使用VIP漂移,跨机房使用代理层。

五、安全性配置要点

自动切换涉及权限变更,安全配置不可忽视:

  • 网络隔离:复制和切换流量走内网,不暴露公网
  • SSL加密:主从复制启用SSL连接,防止中间人攻击
  • 访问控制:切换脚本使用最小权限原则,避免root直连
  • 审计日志:记录所有切换操作的完整日志,便于回溯
  • 双因素确认:关键操作(如手动切换)需要二次确认

六、测试与演练

再完善的方案也需要定期验证。建议的测试计划:

  1. 月度演练:在非高峰期模拟主库宕机,验证自动切换
  2. 指标记录:记录RTO(恢复时间目标)和RPO(恢复点目标)
  3. 数据校验:切换后使用 pt-table-checksum 校验数据一致性
  4. 回滚测试:验证旧主库恢复后能否重新加入集群
  5. 混乱工程:随机拔网线、杀进程,测试极端场景

七、故障恢复与回切

主库修复后,不要急于回切,应按以下步骤操作:

  1. 在旧主库上配置为从库,同步新主库数据
  2. 验证数据完全一致
  3. 在业务低峰期执行计划内回切
  4. 回切后再次验证所有复制链路正常

总结

MySQL主备自动切换是保障数据库高可用的关键能力。核心要点包括:可靠的监控检测、原子化的切换脚本、合理的VIP/代理方案、严格的安全策略,以及持续的测试演练。建议从MHA或Orchestrator等成熟方案入手,逐步完善适合自身业务的切换体系,切忌从零手写而不经过充分测试。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注