12.1.3 VIP漂移与主备选举流程

在Keepalived中,VIP漂移与主备选举基于VRRP协议完成,通过同一广播域内的多台节点共享虚拟路由器实例,实现业务IP的高可用接管。每个节点配置相同的virtual_router_id与VIP,设定不同priority与state(MASTER/BACKUP),并通过VRRP通告报文维持主备状态。

原理草图(VIP漂移与选举时序):

sequenceDiagram
    participant M as MASTER(192.168.10.11)
    participant B as BACKUP(192.168.10.12)
    participant L as Client/SW
    M->>L: GARP(VIP->M)
    loop advert_int
        M->>B: VRRP Advert(prio=120)
    end
    Note over M,B: MASTER故障
    B-->>B: Advert超时
    B->>L: GARP(VIP->B)
    B->>B: 升为MASTER

主备选举与VIP漂移流程(要点)
1. 初始化:节点进入BACKUP或MASTER,priority最高者为MASTER。
2. 广播通告:MASTER按advert_int发送VRRP通告。
3. 失联判定:BACKUP在超时后认为MASTER故障。
4. 竞选机制:按priority与IP地址裁决选出新MASTER。
5. 漂移接管:新MASTER绑定VIP并发送GARP刷新邻居缓存。
6. 抢占策略:默认允许抢占,配置nopreempt可禁止。

关键参数说明
- priority:优先级,高者优先;
- advert_int:通告间隔,越小切换越快但更敏感;
- preempt / nopreempt:是否允许抢占;
- authentication:VRRP认证;
- virtual_ipaddress:VIP列表;
- vrrp_script:健康检查脚本,动态调优priority。

配置示例(两节点,含健康检查与抢占控制)
文件:/etc/keepalived/keepalived.conf

MASTER(192.168.10.11):

global_defs {
  router_id KA_NODE_A
}

vrrp_script chk_nginx {
  script "/usr/local/bin/check_nginx.sh"
  interval 2
  weight -20
}

vrrp_instance VI_1 {
  state MASTER
  interface eth0
  virtual_router_id 51
  priority 120
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 123456
  }
  virtual_ipaddress {
    192.168.10.100/24 dev eth0 label eth0:1
  }
  track_script {
    chk_nginx
  }
}

BACKUP(192.168.10.12):

global_defs {
  router_id KA_NODE_B
}

vrrp_script chk_nginx {
  script "/usr/local/bin/check_nginx.sh"
  interval 2
  weight -20
}

vrrp_instance VI_1 {
  state BACKUP
  interface eth0
  virtual_router_id 51
  priority 100
  advert_int 1
  nopreempt
  authentication {
    auth_type PASS
    auth_pass 123456
  }
  virtual_ipaddress {
    192.168.10.100/24 dev eth0 label eth0:1
  }
  track_script {
    chk_nginx
  }
}

健康检查脚本示例
文件:/usr/local/bin/check_nginx.sh

#!/bin/bash
# 监测Nginx端口,失败返回非0,触发priority下降
nc -z -w 1 127.0.0.1 80 >/dev/null 2>&1
exit $?
chmod +x /usr/local/bin/check_nginx.sh

安装与启停示例

# 安装
yum install -y keepalived || apt-get install -y keepalived

# 启动并设置开机自启
systemctl enable --now keepalived

# 查看状态与日志
systemctl status keepalived
journalctl -u keepalived -f

验证VIP漂移

# 查看VIP是否绑定
ip addr show dev eth0 | grep 192.168.10.100

# 在BACKUP端模拟MASTER故障
systemctl stop keepalived

# 观察VIP是否漂移到BACKUP
ip addr show dev eth0 | grep 192.168.10.100

预期效果:停止MASTER后,BACKUP在数秒内接管VIP,并可对外服务。

关键命令解释
- ip addr show dev eth0:查看网卡IP与VIP绑定情况
- journalctl -u keepalived -f:实时查看选举与漂移日志
- tcpdump -i eth0 vrrp:抓包验证VRRP通告

排错与定位清单
1. VIP未漂移:检查防火墙与网段是否一致(广播域必须相同)。
2. 频繁切换:检查advert_int与网络抖动,降低敏感度;脚本返回码是否稳定。
3. 未发送GARP:确认内核参数与网卡支持,检查日志中是否有GARP发送记录。
4. VRRP报文不通:用tcpdump -i eth0 vrrp确认是否被安全策略阻断。

练习
1. 将advert_int从1改为2,比较切换耗时差异。
2. 配置nopreempt后重启高优先级节点,观察是否抢占。
3. 将check_nginx.sh返回码改为1,观察priority降低与主备切换。
4. 用tcpdump捕获VRRP通告并解析priority字段。