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

下面提供一套可直接部署的方案,包含环境假设、配置示例、脚本以及重要注意事项。
1. 环境假设
| 主机 | IP | MySQL 角色 | Keepalived 角色 | priority |
|---|---|---|---|---|
| server1 | 192.168.100.1 | 当前主库 | MASTER | 100 |
| server2 | 192.168.100.2 | 备库1 | BACKUP | 90 |
| server3 | 192.168.100.3 | 备库2 | BACKUP | 80 |
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.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 的绝对值必须大于最高优先级与其他节点的差值。例如优先级差值为 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 写入。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
Oracle并行DML提升大批量UPDATE效率详解
首先需要明确一个关键要点:Oracle 的 UPDATE 语句默认完全不支持并行执行,即便你添加了 *+ PARALLEL * 提示也仍然无效——这是数据库的硬性限制,并非配置参数未正确设置。若要利用并行 DML 实现大批量 SQL UPDATE 的显著性能提升,必须深入理解其行为机制。 从根本
SQLite视图模拟动态计算列的实用方法
SQLite没有像PostgreSQL那样内置的GENERATED ALWAYS AS语法,但这并不意味着我们没法实现“计算列”的效果。一个很自然的替代方案就是视图——通过封装SELECT表达式,在查询时动态计算结果。虽然视图不存储数据,但每次查询都能拿到最新计算值,对轻量级项目来说足够用了。 SQ
如何用SQL子查询找出选修所有课程的优等生名单
在数据库查询中,想要精准检索出“选修了全部课程”的学生,很多人都会被这个问题卡住。直接使用IN或EXISTS子查询进行判断,只能确认学生是否“选过某几门课”,而无法证明其“选过每一门课”。这里的关键误区在于,子查询本质上表达的是集合的包含关系,而非全称量化的逻辑。要想准确锁定这类学生,正确的解决思路
SQL Server DDL触发器防止误删数据库表的编写方法
很多人在SQL Server中配置DDL触发器时都会遇到一个常见困惑:明明创建了阻止DROP TABLE的触发器,却依然无法生效。核心问题在于:DDL触发器必须显式启用才能正常工作,创建后不启用就等于没用,这是导致线上操作事故的重要原因。 在SQL Server中,使用CREATE TRIGGER
SQL视图递归深度限制与配置参数调整方法
一张图看清不同数据库对视图嵌套深度和递归CTE的处理差异。 先摆一个残酷的现实:如果你的SQL Server视图嵌套超过32层,编译器会直接甩给你一个Msg 319报错,连执行计划都生成不了。这可不是什么可配置的软限制,而是解析器调用栈的硬上限,发生在编译阶段。换句话说,根本没得商量。 这时你可能会
- 日榜
- 周榜
- 月榜
相关攻略
2026-07-04 07:09
2026-07-04 07:08
2026-07-04 07:08
2026-07-04 07:08
2026-07-04 07:08
2026-07-04 07:08
2026-07-04 07:08
2026-07-04 07:07
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
热门话题

