13.7.3 Keepalived配置要点(健康检查、权重与优先级)

Keepalived在HAProxy高可用中通过VRRP实现VIP漂移,本节聚焦健康检查、权重与优先级的配置要点,并给出可直接落地的示例、排错与练习。

原理草图(VIP漂移与权重决策)

文章图片

1. 健康检查(track_script)#

目的:把HAProxy进程/端口/HTTP健康纳入VRRP决策,避免VIP漂到不可用节点。

完整可执行检查脚本示例
文件路径:/etc/keepalived/check_haproxy.sh

#!/usr/bin/env bash
# 检查HAProxy进程与端口及HTTP状态
# 任何一步失败返回非0,触发降权

pidof haproxy >/dev/null 2>&1 || exit 1

ss -lnt | awk '{print $4}' | grep -q ':80$' || exit 1

curl -fs http://127.0.0.1:80/health >/dev/null 2>&1 || exit 1

exit 0

命令解释
- pidof haproxy:进程存在即返回0。
- ss -lnt:检查80端口是否监听。
- curl -fs:HTTP状态非2xx/3xx即失败。

脚本权限

chmod +x /etc/keepalived/check_haproxy.sh

2. 权重(weight)与优先级(priority)#

配置原则
- 主节点priority高(如150),备节点低(如100)。
- 失败时weight取负值(如-60),确保主节点有效优先级低于备节点。
- fall/rise避免瞬时抖动。

Keepalived配置示例(主节点)
文件路径:/etc/keepalived/keepalived.conf

global_defs {
  router_id haproxy-master
}

vrrp_script chk_haproxy {
  script "/etc/keepalived/check_haproxy.sh"
  interval 2
  fall 3
  rise 2
  weight -60
}

vrrp_instance VI_1 {
  state MASTER
  interface eth0
  virtual_router_id 51
  priority 150
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 123456
  }
  virtual_ipaddress {
    10.0.0.100/24 dev eth0
  }
  track_script {
    chk_haproxy
  }
}

Keepalived配置示例(备节点)

global_defs {
  router_id haproxy-backup
}

vrrp_script chk_haproxy {
  script "/etc/keepalived/check_haproxy.sh"
  interval 2
  fall 3
  rise 2
  weight -60
}

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 {
    10.0.0.100/24 dev eth0
  }
  track_script {
    chk_haproxy
  }
}

参数解释
- priority:节点基础优先级,越大越优先。
- weight:健康失败时对优先级的动态修正。
- nopreempt:避免主节点恢复后抢占,减少回切抖动。
- virtual_router_id/auth_pass:必须一致。


3. 安装与启动(示例)#

# RHEL/CentOS
yum -y install keepalived haproxy

# Ubuntu/Debian
apt -y install keepalived haproxy

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

验证VIP是否在主节点

ip addr show dev eth0 | grep 10.0.0.100

4. 排错与验证#

常见排错命令

# 查看keepalived日志(系统日志或单独文件)
journalctl -u keepalived -f

# 验证脚本返回码
/etc/keepalived/check_haproxy.sh; echo $?

# 检查VRRP通告(需tcpdump)
tcpdump -nn -i eth0 vrrp

故障模拟

# 停止主节点HAProxy,触发降权与VIP漂移
systemctl stop haproxy

# 观察备节点是否获得VIP
ip addr show dev eth0 | grep 10.0.0.100

预期效果
- 主节点停HAProxy后,备节点获得VIP。
- 恢复后若配置了nopreempt,主节点不抢占VIP。


5. 练习#

  1. weight-60调整为-30,验证主节点是否仍能切换。
  2. 去掉nopreempt,观察主节点恢复时是否抢占VIP。
  3. 把健康检查改为HTTP 200校验(如/health),验证后端服务不可用时是否触发切换。

通过“健康检查 + 权重调整 + 优先级策略”联动,Keepalived实现稳定切换与可控回切,为HAProxy高可用提供可靠基础。