更新时间:2022-08-26 16:34:55
► 问题描述:
在已配置负载均衡 LVS 的情况下,系统运行一段时间后会出现一部分 input 不接收数据的问题,导致负载不均衡。
► 排查思路:
♦ LVS 使用 wrr/rr 模式在长连接下,出现不均衡的情况:
  • 后端服务重启,其上面的连接一般会重建,重建的新连接会均匀分布到其他服务上;当重启的服务正常加入到 LVS 后,LVS 上的连接数为 0,重启的服务无法关闭已经存在的老连接,所以容易导致负载不均衡。即使之后新建连接,新连接在这些服务上轮询建立连接,将进一步导致重启的服务连接数和其他服务不均衡;
  • 长连接均匀分配到后端的情况下,每个连接的客户端发送的数据量不同,也会导致监控查看的数据量不均匀。

♦ LVS 使用 wlc/lc 模式在长连接下,出现不均衡的情况:

  • ​​​​​​wlc 算法考虑当前已存在的连接数,尽量把新连接发送到连接数较少的服务上。如果短时间内同时创建大量连接,由于内核的 LVS 逻辑判定不太合理,也会导致连接严重不均衡,需要匀速的创建连接才会连接平衡;
  • 如果后端服务不是同时启动,将造成所有的长连接都会先连接到第一个启动的服务,后续启动的服务不会去连接,也会导致不均衡;  ​​​​
  • 每个连接的客户端发送的数据量不同,也会导致监控查看的数据量不均匀。

► 解决方法:尽量减少 logstash-input 重启,logstash-input 重启会导致 LVS 负载不均衡。如需调整 LVS 达到负载均衡,需重启 LVS,期间会中断数据流接入,持续时间预计 1 分钟,执行步骤如下所示:

  1. 登录到 LVS 部署的服务器上,后续均在 LVS 服务器上执行操作;
  2. 减少 LVS 的 tcp 连接超时时间为 10s,执行命令:ipvsadm --set 10 10 300
  3. 将每个端口的 LVS 负载模式修改为 lc,请按下图进行编辑,执行命令:vi /etc/keepalived/keepalived.conf1)关闭 LVS 并释放已存在的长连接:systemctl stop keepalived && sleep 20s
    2)启动 LVS 重新分配客户端连接,并查看旧连接是否被释放:systemctl start keepalived && ipvsadm -lnc。​​​​​​​​​​​​