lvs实现rs平滑下线需先摘流、再等连接释放、最后移除节点:1.用ipvsadm -d删除条目或-w 0置权重为零;2.通过ss/netstat监控连接归零;3.结合keepalived健康检查自动触发摘流;4.确认无连接后停服务并验证。

LVS 本身不提供像 Nginx 的 down 或 HAProxy 的 drain 这类运行时状态标记机制,它作为四层负载均衡器,调度逻辑在内核态(IPVS)执行,节点状态变更必须通过用户态工具 ipvsadm 显式管理。要实现后端服务器(Real Server, RS)的平滑下线,关键在于:**先停止流量接入、再等待连接自然结束、最后移除节点**,全程不中断已有会话。
1. 主动摘流:清空或权重归零
LVS 不支持“软下线”指令,但可通过以下两种方式立即停止新连接分发:
-
临时清空该 RS 的调度条目:执行
ipvsadm -d -t VIP:PORT -r RS_IP:PORT,从当前虚拟服务中删除该真实服务器。此操作即时生效,新请求不再转发到该节点,已有连接不受影响(TCP 连接仍可继续收发)。 -
设权重为 0(仅适用于加权算法):若使用
wrr或wlc算法,可用ipvsadm -e -t VIP:PORT -r RS_IP:PORT -w 0将其权重置零。LVS 会跳过该节点参与调度,等效于摘流。
2. 等待连接自然释放
摘流后,LVS 不主动断连,但需确认该 RS 上无活跃连接再停服务:
- 在 RS 本机执行
ss -tn state established | grep :PORT | wc -l或netstat -ant | grep :PORT | grep ESTABLISHED | wc -l,观察连接数是否持续下降至 0。 - 若应用含长连接(如 WebSocket、HTTP/1.1 keep-alive),建议预留 30–120 秒缓冲期;也可配合业务端点(如 Spring Boot
/actuator/shutdown)触发优雅关闭前的等待逻辑。 - 注意:LVS 无内置连接监控视图,需依赖 RS 自身指标或外部监控(如 Prometheus + node_exporter)辅助判断。
3. 配合 Keepalived 实现自动化协同(推荐生产环境)
若 LVS 集群使用 Keepalived 管理,可在其配置中启用健康检查,并让 RS 主动“自报不可用”:
- 在
real_server块中配置 TCP 或 HTTP 检查(如tcp_check或http_get)。 - 下线前,RS 主动关闭服务端口或返回 HTTP 503,Keepalived 探测失败后自动执行
ipvsadm -d删除该节点(需配置notify_down脚本)。 - 这种方式将人工操作转为事件驱动,降低误操作风险,且支持与发布系统集成。
4. 清理与验证
确认连接归零后,再执行最终动作:
- 在 RS 上停止服务(如
systemctl stop httpd或应用进程)。 - 检查
ipvsadm -ln输出,确认该 RS 已不在列表中。 - 查看客户端访问日志或监控曲线,确认无 502/503 报错,且旧连接响应正常直至自然结束。
- 如为长期下线,应在 Keepalived 配置文件中注释或删除对应
real_server块,并重载服务(systemctl reload keepalived)。











