Keepalived通过多实例双主模式实现VIP流量分发,即两节点各持一个VIP并同时服务,互为备份;配置时需设独立VRRP实例、差异化优先级及健康检查脚本,确保故障时VIP自动漂移。

Keepalived 实现多个 VIP 在双机间流量分发,核心不是“轮询式分发”,而是通过**多实例双主(Multi-Instance Active-Active)模式**,让两台服务器各自持有不同 VIP 并同时对外提供服务,彼此互为备份。这种方式既避免单点瓶颈,又提升资源利用率,特别适合 Web+API、前端+后端、读写分离等多业务场景。
明确双主架构的逻辑本质
双机不争同一个 VIP,而是各自主导一个 VIP:
- 节点 A 是 VIP1 的 Master,同时也是 VIP2 的 Backup
- 节点 B 是 VIP2 的 Master,同时也是 VIP1 的 Backup
- 两个 VRRP 实例完全独立:不同 virtual_router_id、不同 state 配置、不同 priority 值
- 只要各自服务健康,两台机器就同时承载流量——这才是“流量分发”的真实含义
配置两个独立的 VRRP 实例
以两台节点 node-01(192.168.100.226)和 node-02(192.168.100.224)为例,规划 VIP1=192.168.100.201(Web)、VIP2=192.168.100.202(API):
node-01 的 /etc/keepalived/keepalived.conf 片段:
vrrp_instance VI_WEB {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication { auth_type PASS; auth_pass 123456; }
virtual_ipaddress { 192.168.100.201/32 dev ens33 }
}
vrrp_instance VI_API {
state BACKUP
interface ens33
virtual_router_id 52
priority 90
advert_int 1
authentication { auth_type PASS; auth_pass 123456; }
virtual_ipaddress { 192.168.100.202/32 dev ens33 }
}
node-02 的对应配置则交换角色:
- VI_WEB 实例设为 BACKUP,priority 90
- VI_API 实例设为 MASTER,priority 100
- virtual_router_id 必须与 node-01 完全一致(51 和 52),否则无法形成正确组播协商
加入健康检查防止脑裂与误切
仅靠静态 priority 不足以保障稳定性。必须绑定服务状态,动态调整优先级:
在全局段添加检测脚本:
vrrp_script chk_nginx {
script "/usr/bin/pgrep -x nginx > /dev/null"
interval 2
weight -30
fall 3
rise 2
}
再在每个 vrrp_instance 中引用:
- track_script { chk_nginx; } —— 若 nginx 挂了,当前节点 priority 自动减 30
- 当 node-01 的 nginx 故障,其 VIP1 优先级从 100→70,低于 node-02 的 90,VIP1 就自动漂移到 node-02
- VIP2 同理,故障时也按规则切换,不影响另一个 VIP 的运行
验证与日常运维要点
部署后执行以下检查确保生效:
- 运行 ip a s 查看两台机器是否各自持有一个 VIP(如 node-01 有 .201,node-02 有 .202)
- 用 tcpdump -i ens33 host 224.0.0.18 抓包,确认双方都在收发 VRRP 组播报文
- 手动停掉 node-01 的 nginx,观察 .201 是否 2 秒内出现在 node-02 上(advert_int=1 + fall=3 = 约 3 秒判定)
- 注意防火墙需放行协议号 112(VRRP 协议),或直接允许组播地址 224.0.0.18










