如何结合keepalived实现高可用_mysql架构设计

Keepalived 通过 VRRP 实现 VIP 故障漂移,配合 MySQL 主从(GTID)、健康检查脚本与 notify 机制,构建轻量高可用架构;主库异常时自动切 VIP 至备库并提升,应用直连 VIP 无感切换。

Keepalived 本身不直接管理 MySQL,但它能通过 VRRP 协议实现 VIP(虚拟 IP)的故障自动漂移,配合脚本监控 MySQL 健康状态,从而构建轻量、可靠、免依赖第三方组件的高可用 MySQL 架构(主从 + VIP 切换)。

核心思路:VIP + 主从复制 + Keepalived 健康检查

让 Keepalived 在主库节点上绑定一个对外服务的 VIP;当主库异常(如 mysqld 崩溃、复制中断、响应超时),Keepalived 检测失败后自动将 VIP 迁移到备库,同时触发提升操作(如 stop slave; reset master; grant replication 等可选),使备库快速接管读写流量。整个过程对应用透明,只需连接 VIP 即可。

MySQL 端关键配置要求

  • 主从必须基于 GTID 复制:避免切换后位点错乱,确保 failover 后能准确定位同步起点
  • 主从数据一致性需定期校验:使用 pt-table-checksum 工具,防止隐性数据差异导致切换后业务异常
  • 从库开启 log_slave_updates:保证后续可能的级联切换或再从新主拉取 binlog
  • 禁用 read_only=ON 的误操作风险:在主库上设为 OFF,在从库上设为 ON;但切换脚本中需动态控制,避免手动误写

Keepalived 配置要点与检测脚本

在 keepalived.conf 中定义 vrrp_instance,关键项包括:

  • state MASTER/BACKUP:主库配 MASTER,备库配 BACKUP,优先级(priority)主库更高
  • virtual_ipaddress:声明 VIP,如 192.168.10.100/24
  • track_script:调用自定义检测脚本(如 check_mysql.sh),每 2 秒执行一次
  • notify_master / notify_backup:分别指定主升备降时执行的脚本,用于启停复制、调整权限、刷新代理层等

检测脚本示例(check_mysql.sh):

#!/bin/bash
MYSQL_CMD="mysql -uhealth -pPassw0rd -h127.0.0.1 -P3306 -e 'SELECT 1' &>/dev/null
if $MYSQL_CMD; then
    # 检查是否为可写主库(非只读 + 无复制延迟)
    WRITABLE=$(
        mysql -uhealth -pPassw0rd -e "SHOW VARIABLES LIKE 'read_only'" 2>/dev/null | \
        grep -v "read_only" | awk '{print $2}'
    )
    DELAY=$(
        mysql -uhealth -pPassw0rd -e "SHOW SLAVE STATUS\G" 2>/dev/null | \
        grep "Seconds_Behind_Master:" | awk '{print $2}'
    )
    if [[ "$WRITABLE" == "OFF" ]] && ([[ -z "$DELAY" ]] || [[ "$DELAY" == "0" ]] || [[ "$DELAY" == "NULL" ]]); then
        exit 0
    fi
fi
exit 1

切换后需注意的连贯性动作

  • 应用连接池需支持自动重连:VIP 切换瞬间连接中断,连接池应能在几秒内重建到新主库
  • Proxy 层(如 HAProxy/MySQL Router)建议配合部署:Keepalived 管 VIP,Proxy 管实际后端健康,二者分层协作更稳健
  • 切换日志与告警必须闭环:notify 脚本中记录时间、角色、IP、错误原因,并推送企业微信/钉钉告警
  • 禁止双主写入:原主库恢复后,应以从库身份重新接入新主,而非直接启动写入,避免数据冲突