游乐游手机版
首页/数据库/文章详情

三台MySQL服务器Keepalived VIP高可用方案

时间:2026-07-03 07:01
最常见的场景是:手头拥有三台 MySQL 服务器,例如一主两备架构,希望通过 Keepalived 实现 VIP 漂移,确保应用始终能够连接到主库。具体如何配置?接下来直接看操作细节。 下面提供一套可直接部署的方案,包含环境假设、配置示例、脚本以及重要注意事项。 1 环境假设 主机IPMySQL

最常见的场景是:手头拥有三台 MySQL 服务器,例如一主两备架构,希望通过 Keepalived 实现 VIP 漂移,确保应用始终能够连接到主库。具体如何配置?接下来直接看操作细节。

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

下面提供一套可直接部署的方案,包含环境假设、配置示例、脚本以及重要注意事项。

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。此时有一个关键步骤:server2 必须先提升为 MySQL 主库,执行 STOP SLA VE; RESET SLA VE ALL;,否则应用会连接到只读备库,无法写入数据。

当 server1 恢复后,如果配置了 state MASTER 和较高的 priority,VIP 会自动抢占回来。若希望避免自动抢占,可以设置 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/nullif [ $? -ne 0 ]; then    exit 1   # 连接失败,释放 VIPfi# 检查 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   # 是主库,可以持有 VIPelse    exit 1   # 是只读备库,释放 VIPfi
chmod +x /etc/keepalived/check_mysql.sh

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

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

track_script {    chk_mysql}

并在全局部分定义脚本:

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

注意:weight 的绝对值必须大于最高优先级与其他节点的差值。例如优先级差值为 10,这里设为 -20 可确保一旦本机不是主库,VIP 就会漂移。

手动切换后的流程:当需要主动切换(如运维维护)时,先在新主库上执行 STOP SLA VE; RESET SLA VE 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 写入。

来源:https://www.jb51.net/database/366636uap.htm
上一篇MySQL中REPLACE函数用法详解与实战案例从入门到精通 下一篇如何更改PostgreSQL数据库数据存储位置的详细步骤
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
金仓数据库逻辑备份实战:全库导出与模式替换全流程
数据库 · 2026-07-03

金仓数据库逻辑备份实战:全库导出与模式替换全流程

在长期的运维实践中,我越来越体会到,备份就像一份保险——平时看似无用,但关键时刻却是唯一的救命稻草。逻辑备份看似简单,可真正执行恢复时,各种陷阱接连浮现:表名大小写不一致、Schema 未正确切换、Owner 属性未同步修改……任何一个环节处理不当,最终恢复出的数据库就会与预期相去甚远。 本文将深入

金仓数据库sys_rman物理备份全流程演练与误覆盖恢复
数据库 · 2026-07-03

金仓数据库sys_rman物理备份全流程演练与误覆盖恢复

干运维这行,逻辑备份和物理备份我都接触过,但说句实在话,真正能在生产环境里扛住事儿的,还得是物理备份。逻辑备份导出的是 SQL 语句,数据量一大,那速度慢得让人抓狂,而且最关键的是,它没法做时间点恢复。物理备份不一样,它直接拷贝数据文件,再配上 WAL 归档日志,想恢复到过去哪一秒都行,这是它最硬核

Windows下将MySQL注册为系统自启服务教程
数据库 · 2026-07-03

Windows下将MySQL注册为系统自启服务教程

先说一个关键前提:务必以管理员身份运行终端,否则 mysqld --install 这条命令几乎不可能成功。问题不在于命令写错,而是 Windows 系统的用户账户控制(UAC)机制会在中途拦截——在普通 CMD 或 PowerShell 窗口执行这条命令,要么直接提示 Access is deni

Mac版Navicat中快速对比两个数据库的表结构异同
数据库 · 2026-07-03

Mac版Navicat中快速对比两个数据库的表结构异同

直接说结论:Mac 版 Navicat 和 Windows 版在表结构比对逻辑上完全一致。但默认配置下,它确实无法承受“全库一键比对上万张表”的压力。要想避免卡死、内存溢出、进度条永远停在 0%,你必须手动将表分批处理,或者利用前缀过滤来控制扫描范围。 为什么 Mac 上点击「结构同步」后界面会卡住

MySQL中UNION操作推荐用UNION ALL的原因
数据库 · 2026-07-03

MySQL中UNION操作推荐用UNION ALL的原因

MySQL中UNION与UNION ALL性能对比:别再被“保险”迷惑,差距远超预期 先给出核心结论:UNION ALL 的性能通常比 UNION 高出不止一个数量级。原因在于,UNION 在合并结果集后会自动触发去重操作,这往往伴随着隐式排序,进而产生临时表和文件排序。而 UNION ALL 则直