12.5.4 健康检查与调度算法

在 Keepalived 与 LVS 集成中,健康检查与调度算法决定了后端 Real Server 的可用性判断与流量分发策略,是高可用负载均衡的核心环节。本节给出原理草图、可执行配置示例、命令验证、排错思路与练习。

文章图片

常见健康检查类型与适用场景:
- TCP_CHECK:端口探测,成本低,判断较粗
- HTTP_GET/SSL_GET:URL 与状态码校验,适合 Web
- MISC_CHECK:自定义脚本,可检查依赖或业务状态

完整配置示例(含 HTTP 检查与权重)#

文件路径:/etc/keepalived/keepalived.conf

global_defs {
  router_id LVS_NODE01
  enable_script_security
  script_user root
}

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

virtual_server 10.0.0.100 80 {
  delay_loop 3
  lb_algo wrr
  lb_kind DR
  protocol TCP
  persistence_timeout 60

  real_server 10.0.0.11 80 {
    weight 2
    HTTP_GET {
      url {
        path /healthz
        status_code 200
      }
      connect_timeout 3
      nb_get_retry 3
      delay_before_retry 1
    }
  }

  real_server 10.0.0.12 80 {
    weight 1
    HTTP_GET {
      url {
        path /healthz
        status_code 200
      }
      connect_timeout 3
      nb_get_retry 3
      delay_before_retry 1
    }
  }
}

关键参数解释:
- lb_algo wrr:加权轮询,按权重分配流量
- lb_kind DR:LVS DR 模式
- persistence_timeout:会话保持时长(秒)
- nb_get_retrydelay_before_retry:减少抖动

自定义脚本健康检查示例(MISC_CHECK)#

适合检查业务依赖或可写性:
文件:/etc/keepalived/check_backend.sh

#!/usr/bin/env bash
# 检查 Nginx 端口与应用健康接口
curl -sSf http://127.0.0.1:80/healthz >/dev/null || exit 1
exit 0

配置片段:

real_server 10.0.0.11 80 {
  weight 2
  MISC_CHECK {
    misc_path "/etc/keepalived/check_backend.sh"
    misc_timeout 3
    misc_dynamic
  }
}

启动与验证命令#

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

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

# 查看 LVS 转发表
ipvsadm -Ln

# 查看健康检查日志
journalctl -u keepalived -n 100 --no-pager

预期效果:
- ipvsadm -Ln 中 Real Server 状态为 Active
- 访问 VIP 时流量按权重分配

调度算法选择与验证#

# 查看当前调度算法
ipvsadm -Ln | grep -E "TCP|UDP"

# 临时切换算法(测试用)
ipvsadm -E -t 10.0.0.100:80 -s lc

算法建议:
- 短连接或节点性能一致:rr / wrr
- 长连接或负载不均:lc / wlc
- 需要会话粘性:sh + persistence_timeout

常见故障与排错思路#

  1. 健康检查反复上下线
    - 增大 nb_get_retrydelay_before_retry
    - 确认 /healthz 稳定、响应快
  2. VIP 不可访问
    - ip addr 确认 VIP 是否存在
    - 检查防火墙/安全组放行 VIP 端口
  3. Real Server 有流量但无响应
    - DR 模式下确认 RS 绑定 VIP 到 lo 并关闭 ARP 响应

练习#

  1. lb_algowrr 切换到 wlc,观察连接分布变化。
  2. 为 Real Server 增加 MISC_CHECK,模拟脚本返回失败并观察摘除。
  3. 调整 persistence_timeout,验证会话保持效果与负载均衡行为。