12.2.5 典型配置参数与实战要点

典型参数决定VRRP选举与VIP漂移行为,实战应以“参数一致性、优先级差距、健康检查联动”为核心。以下给出原理草图、安装与配置示例、命令解释、排错与练习,便于直接落地。

原理草图(VRRP通告与VIP漂移):

文章图片

安装与基础准备(两台节点一致):

# 1) 安装
yum -y install keepalived
systemctl enable keepalived

# 2) 打开VRRP协议号112(若启用防火墙)
firewall-cmd --permanent --add-protocol=vrrp
firewall-cmd --reload

# 3) 调整ARP参数,避免VIP不可达
cat >/etc/sysctl.d/99-keepalived.conf <<'EOF'
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
EOF
sysctl --system

典型配置参数与实战要点(主备同组必须一致的参数:virtual_router_id、advert_int、auth_pass)
示例:/etc/keepalived/keepalived.conf

global_defs {
  router_id LVS_NODE_A
}

vrrp_script chk_nginx {
  script "/usr/local/bin/chk_nginx.sh"
  interval 2
  weight -30
  fall 2
  rise 2
}

vrrp_instance VI_1 {
  state BACKUP                 # 建议两端都用BACKUP,避免双主
  interface eth0               # VIP绑定的物理网卡
  virtual_router_id 51         # 同组唯一
  priority 150                 # 主高备低
  advert_int 1                 # 通告周期,主备一致
  authentication {
    auth_type PASS
    auth_pass 12345678
  }
  virtual_ipaddress {
    10.0.0.100/24 dev eth0 label eth0:vip
  }
  track_script {
    chk_nginx
  }
  nopreempt                    # 可选:不抢占,减少抖动
  # preempt_delay 30           # 可选:恢复后延迟抢占
  notify_master "/usr/local/bin/notify.sh MASTER"
  notify_backup "/usr/local/bin/notify.sh BACKUP"
  notify_fault  "/usr/local/bin/notify.sh FAULT"
}

备节点仅需调整router_id与priority(确保更低),其余保持一致:

global_defs {
  router_id LVS_NODE_B
}
vrrp_instance VI_1 {
  state BACKUP
  interface eth0
  virtual_router_id 51
  priority 100
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 12345678
  }
  virtual_ipaddress {
    10.0.0.100/24 dev eth0 label eth0:vip
  }
  track_script { chk_nginx }
  nopreempt
  notify_master "/usr/local/bin/notify.sh MASTER"
  notify_backup "/usr/local/bin/notify.sh BACKUP"
  notify_fault  "/usr/local/bin/notify.sh FAULT"
}

健康检查脚本示例(检测端口,失败降低优先级):

cat >/usr/local/bin/chk_nginx.sh <<'EOF'
#!/bin/bash
# 失败返回非0,触发weight降低
ss -lntp | grep -q ":80 " || exit 1
exit 0
EOF
chmod +x /usr/local/bin/chk_nginx.sh

切换通知脚本示例(记录日志/告警接口):

cat >/usr/local/bin/notify.sh <<'EOF'
#!/bin/bash
STATE=$1
echo "$(date '+%F %T') Keepalived state: ${STATE}" >>/var/log/keepalived_state.log
# 可扩展:curl -XPOST http://alert/api -d "state=${STATE}"
EOF
chmod +x /usr/local/bin/notify.sh

关键命令与解释(验证通告/角色/VIP):

# 启动服务
systemctl restart keepalived

# 查看日志与切换信息
journalctl -u keepalived -f

# 检查VIP是否在本机
ip addr show dev eth0 | grep 10.0.0.100

# 抓包确认VRRP通告(协议号112)
tcpdump -n -i eth0 vrrp
  • priority:决定主备优先级,差距建议≥20。
  • advert_int:通告周期,主备必须一致,否则可能误判。
  • nopreempt:避免主节点恢复后立刻抢占。
  • track_script:健康检查结果影响权重,触发切换。
  • virtual_ipaddress:建议CIDR并指定dev,防止漂移到错误网卡。

实战要点与常见坑:
1. VRRP同组一致性virtual_router_idauth_passadvert_int需一致,否则出现“分裂脑”。
2. 链路二层可达:VRRP为二层通告,跨网段需确认交换机与网关可达。
3. ARP刷新:漂移后客户端ARP缓存不更新,需关注GARP与系统ARP参数。
4. 防火墙放行:必须允许协议号112,使用firewall-cmd --add-protocol=vrrp

排错清单(可直接执行):

# 1) 检查VRRP是否被防火墙拦截
iptables -L -n | grep 112
# 2) 确认内核ARP参数
sysctl net.ipv4.conf.all.arp_ignore
sysctl net.ipv4.conf.all.arp_announce
# 3) 查看VRRP状态变化
grep -i vrrp /var/log/messages
# 4) 检查脚本返回值
/usr/local/bin/chk_nginx.sh; echo $?
  • 若VIP漂移但客户端仍访问旧主,优先排查ARP缓存与GARP发送。
  • 若无切换,检查track_script是否执行失败、权重是否足以触发降级。

练习(含预期效果):
1. 配置主备并模拟宕机:停止主机keepalived,确认备机接管VIP。
预期:ip addr显示VIP在备机,日志出现Entering MASTER STATE
2. 健康检查触发切换:停止Nginx进程,观察weight -30生效,VIP漂移。
预期:备机成为MASTER,客户端访问保持可用。
3. 验证抢占策略:主机恢复后,启用/禁用nopreempt观察是否立即抢占。
预期:nopreempt开启时不抢占;关闭时按优先级抢占。