Keepalived 双主(Active‑Active)模式

在两台 Keepalived 节点(示例:KA1、KA2)上实现"双主"/Active‑Active(两个 VIP 分别由不同节点作为 MASTER)配置的要点、示例配置与测试方法,方便快速复现与排查。
1 概要与拓扑
- 目标:在两台节点上分别承载不同的虚拟 IP(VIP),例如:
- VIP A(172.25.254.100)由 KA1 作为 MASTER 提供服务(WEB)
- VIP B(172.25.254.200)由 KA2 作为 MASTER 提供服务(DB)
- 优点:不同服务可以并行运行在不同节点上,提高资源利用与可靠性。
- 要点:每个 vrrp_instance 使用不同的 virtual_router_id;在两台节点上,对同一 instance 的 state 与 priority 要互补(一个较高为 MASTER,一个较低为 BACKUP)。
2 配置要点(注意事项)
- 每个 vrrp_instance 的
virtual_router_id必须唯一(不同 VIP 使用不同 id)。 - MASTER 与 BACKUP 的
priority值需区分:MASTER > BACKUP。 - 若希望 Backup 在短时间内不抢回 MASTER,可设置
preempt_delay或禁用 preempt(根据场景选择)。 - 若需要执行告警/业务切换脚本,可使用
notify_master/notify_backup/notify_fault回调(脚本需可执行且注意 PATH)。 enable_script_security+script_user:如开启,确保脚本权限与用户设置兼容。- 检查网络是否允许 VRRP 报文(组播/协议 112)通过、接口名正确(eth0 / ensX 等)。
- 使用
ip addr/ifconfig验证 VIP 是否被正确添加与移除。
3 示例配置(分别在 KA1 与 KA2 上)
在两台机器的 /etc/keepalived/keepalived.conf 中,增加两个 vrrp_instance:WEB_VIP 与 DB_VIP。
示例------KA1(WEB MASTER,DB BACKUP):
bash
# /etc/keepalived/keepalived.conf(KA1)
vrrp_instance WEB_VIP {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:0
}
}
vrrp_instance DB_VIP {
state BACKUP
interface eth0
virtual_router_id 52
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.200/24 dev eth0 label eth0:1
}
}
示例------KA2(WEB BACKUP,DB MASTER):
bash
# /etc/keepalived/keepalived.conf(KA2)
vrrp_instance WEB_VIP {
state BACKUP
interface eth0
virtual_router_id 51
preempt_delay 10 # 可选:避免频繁抢主
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.100/24 dev eth0 label eth0:0
}
}
vrrp_instance DB_VIP {
state MASTER
interface eth0
virtual_router_id 52
preempt_delay 10
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.254.200/24 dev eth0 label eth0:1
}
}
说明:
- 同一 VIP 对应的
virtual_router_id在两台机器上相同(例如 WEB_VIP 两端都用 51),但priority与state不同以产生 MASTER/BACKUP 关系。 - 不同 VIP 之间要使用不同的
virtual_router_id(例如 51 与 52)。
4 重启与验证
[root@KA1 ~]# systemctl restart keepalived.service
[root@KA2 ~]# systemctl restart keepalived.service
#测试
[root@KA1 ~]# ifconfig

测试故障转移:
-
在当前 WEB 主节点上停止 keepalived:
systemctl stop keepalived.service -
在另一节点上观察是否获取到 VIP(172.25.254.100)
-
恢复后注意是否按预期抢回(受 preempt / preempt_delay 控制)
故障模拟测试:
[root@KA1 ~]# systemctl stop keepalived.service
[root@KA2 ~]# ifconfig

ka1的vip迁移到ka2上
现在模拟ka2故障
[root@KA2 ~]# systemctl stop keepalived.service
[root@KA1 ~]# ifconfig


5 常见问题与排查
- VIP 两端都出现 MASTER(split‑brain):
- 检查两端
virtual_router_id是否相同且认证(auth_pass)一致。 - 检查网络是否丢失 VRRP 报文(组播或协议 112 被防火墙/交换机阻断)。
- 检查系统时间偏差不会直接导致 split‑brain,但建议保持时间同步。
- 检查两端
- VIP 无法迁移或不出现:
- 确认
interface名称正确(与ip addr输出一致)。 - 确认 priority、state 配置无误,且 keepalived 日志没有错误。
- 确认
- 频繁抖动(flapping):
- 调整
advert_int、preempt_delay或使用 track_script/track_interface 做更细粒度健康检测。
- 调整
- 脚本回调不执行:
- 确认脚本可执行(chmod +x),并使用绝对路径调用系统命令(避免 PATH 问题)。
- 若开启
enable_script_security,确保script_user有权限运行脚本。
ack_script/track_interface 做更细粒度健康检测。
- 脚本回调不执行:
- 确认脚本可执行(chmod +x),并使用绝对路径调用系统命令(避免 PATH 问题)。
- 若开启
enable_script_security,确保script_user有权限运行脚本。