在三台MySQL服务器下使用Keepalived实现VIP高可用的方案

 更新时间:2026年07月01日 08:50:50   作者:深度学习007  
本文章详细介绍了使用Keepalived实现MySQL主从架构的VIP漂移机制,确保始终指向当前主库,并与MySQL复制配合,确保应用连接正确的库,通过配置检测脚本,确保只有实际的主库才持有VIP,提升切换的可靠性,需要的朋友可以参考下

当你有三台 MySQL 服务器(例如一主两备),可以使用 Keepalived 实现 VIP 漂移,始终让 VIP 指向当前的主库。
以下给出一主两备场景下的 Keepalived 配置方案,并说明与 MySQL 复制的配合。

1. 环境假设

主机IPMySQL 角色Keepalived 角色priority
server1192.168.100.1当前主库MASTER100
server2192.168.100.2备库1BACKUP90
server3192.168.100.3备库2BACKUP80

VIP:192.168.100.100/24
网卡接口:eth0(请根据实际修改)

2. Keepalived 配置

server1(主库,优先级最高)

vrrp_script chk_mysql {
    script "/etc/keepalived/check_mysql.sh"
    interval 2
    weight -20
}
vrrp_instance VI_1 {
    state BACKUP               # 所有节点都用 BACKUP
    nopreempt                  # 关闭抢占
    interface eth0
    virtual_router_id 51
    priority 100               # 最高,初始为主
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.100.100/24
    }
    track_script {
        chk_mysql
    }
}

server2(备库1)

vrrp_script chk_mysql {
    script "/etc/keepalived/check_mysql.sh"
    interval 2
    weight -20
}
vrrp_instance VI_1 {
    state BACKUP
    nopreempt
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.100.100/24
    }
    track_script {
        chk_mysql
    }
}

server3(备库2)

vrrp_script chk_mysql {
    script "/etc/keepalived/check_mysql.sh"
    interval 2
    weight -20
}
vrrp_instance VI_1 {
    state BACKUP
    nopreempt
    interface eth0
    virtual_router_id 51
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.100.100/24
    }
    track_script {
        chk_mysql
    }
}

3. 工作逻辑

正常时:VIP 在 server1(主库)上,所有应用连接 VIP。

server1 宕机:Keepalived 检测到故障,VIP 自动漂移到优先级次高的 server2(90 > 80)。
此时 server2 必须先被提升为 MySQL 主库(STOP SLAVE; RESET SLAVE ALL;),否则应用会连到只读备库。

server1 恢复:由于设置 state MASTER 和较高 priority,VIP 会抢占回 server1(若原主库已恢复且需要重新作为主库)。
如果不想自动抢占,可以设置 nopreempt,并调整状态为 BACKUP。

4. 与 MySQL 故障切换的配合

Keepalived 只负责 IP 漂移,不管 MySQL 角色。你必须确保 VIP 所在的服务器就是可写的 MySQL 主库。
可以编写一个简单的 检测脚本,让 Keepalived 在判断自身是否为主库后再决定是否持有 VIP。这样即使优先级高,但如果本机不是主库,也会释放 VIP。

4.1 编写检测脚本(在所有节点)

/etc/keepalived/check_mysql.sh:

#!/bin/bash
#检查本机 MySQL 是否可写(即当前不是只读的备库)
mysql -u root -p'你的密码' -e "SELECT 1;" &>/dev/null
if [ $? -ne 0 ]; then
    exit 1   # 连接失败,释放 VIP
fi
检查 read_only 是否为 OFF(主库才可写)
READ_ONLY=$(mysql -u root -p'你的密码' -e "SHOW VARIABLES LIKE 'read_only';" | grep -c "OFF")
if [ $READ_ONLY -eq 1 ]; then
    exit 0   # 是主库,可以持有 VIP
else
    exit 1   # 是只读备库,释放 VIP
fi
chmod +x /etc/keepalived/check_mysql.sh

4.2 在 Keepalived 配置中调用检测脚本

在每个节点的 keepalived.conf 的 vrrp_instance 段内添加:

track_script {
    chk_mysql
}

并在全局部分定义脚本:

vrrp_script chk_mysql {
    script "/etc/keepalived/check_mysql.sh"
    interval 2          # 每 2 秒检查一次
    weight -20          # 失败时降低优先级 20,确保 VIP 被其他节点接管
}

注意:weight 的绝对值应大于最高优先级与其他节点的差值。例如 priority 差值为 10,这里设 -20 可确保一旦本机不是主库,VIP 就会漂移。
. 手动切换后的流程
当需要主动切换(如维护)时:

在新主库上执行 STOP SLAVE; RESET SLAVE ALL;,确保 read_only=OFF。

在原主库上手动停止 Keepalived 或将其 priority 调低,VIP 自动漂移到新主库。

应用无需更改任何连接信息。

5. 注意事项

所有节点的 keepalived 配置中 virtual_router_id 必须一致(同一组 VRRP)。

确保 authentication 密码一致。

防火墙放行 VRRP 协议:firewall-cmd --add-protocol=vrrp --permanent; firewall-cmd --reload

VIP 必须与实际网卡同网段,且未被其他设备占用。

检测脚本中的数据库密码需妥善保管,可限制权限文件读取。

6. 测试方法

在主库上查看 VIP:

ip addr show eth0 | grep 192.168.100.100
应看到 VIP。

停止主库 MySQL 或 Keepalived,观察 VIP 是否漂移到优先级最高的备库。

在备库上提升为可写主库后,检查 read_only 状态,应用应能正常连接 VIP 写入。

以上就是在三台MySQL服务器下使用Keepalived实现VIP高可用的方案的详细内容,更多关于MySQL Keepalived实现VIP高可用的资料请关注脚本之家其它相关文章!

相关文章

  • MySQL中C接口的实现

    MySQL中C接口的实现

    本节内容介绍使用C/C++访问数据库, 包括对数据库的增删查改操作,主要是学习一些接口的调用,具有一定的参考价值,感兴趣的可以了解一下
    2025-09-09
  • MySQL开发中存储函数与触发器使用示例

    MySQL开发中存储函数与触发器使用示例

    这篇文章主要为大家详细介绍了MySQL中存储函数的创建与触发器的设置,文中的示例代码讲解详细,具有一定的学习价值,需要的可以参考一下
    2023-01-01
  • MySQL在哪些情况下不使用索引的示例

    MySQL在哪些情况下不使用索引的示例

    尽管索引可以显著提高数据库的查询性能,但在某些情况下,MySQL可能不会使用索引,本文就来介绍一下MySQL在哪些情况下不使用索引,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • MySQL中检查约束举例详细讲解

    MySQL中检查约束举例详细讲解

    MySQL 检查约束(CHECK)是用来检查数据表中字段值有效性的一种手段,下面这篇文章主要介绍了MySQL中检查约束的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-03-03
  • PHP MySQL的安装与配置详解

    PHP MySQL的安装与配置详解

    本篇文章给大家介绍php mysql的安装与配置,首先给大家介绍安装配置php,接着介绍配置mysql、安装mysql,本文介绍的非常详细,需要的朋友可以参考下
    2015-10-10
  • mysql 5.7.25 压缩版安装配置方法图文教程

    mysql 5.7.25 压缩版安装配置方法图文教程

    这篇文章主要为大家详细介绍了mysql 5.7.25 压缩版安装配置方法图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • MYSQL替换时间(年月日)字段时分秒不变实例解析

    MYSQL替换时间(年月日)字段时分秒不变实例解析

    这篇文章主要介绍了MYSQL替换时间(年月日)字段,时分秒不变的实现方法,需要的朋友可以参考下
    2017-07-07
  • mysql中InnoDB幻读解决方案与机制

    mysql中InnoDB幻读解决方案与机制

    本文主要介绍了mysql中InnoDB幻读解决方案与机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-03-03
  • MySQL查看锁表的实现步骤

    MySQL查看锁表的实现步骤

    在MySQL数据库中,当多个事务同时请求对同一行数据进行修改时,就会发生锁表现象,本文主要介绍了MySQL查看锁表的实现步骤,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • windows系统mysql5.7.18安装图文教程

    windows系统mysql5.7.18安装图文教程

    这篇文章主要为大家详细介绍了windows系统下mysql5.7.18安装图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03

最新评论