负载均衡无法新建长连接回话(比如数据库服务),服务器重启后还是沿用的之前的旧长连接回话,导致应用端数据上传输失败,如何处理?
负载均衡无法新建长连接回话(比如数据库服务),服务器重启后还是沿用的之前的旧长连接回话,导致应用端数据上传输失败,如何处理?
(0)
(0)
在负载均衡上开启“服务器失效时删除对应会话表项”的强制删除功能,迫使应用端在服务器重启后重新发起三次握手建立新连接 这个配置在哪里???
在负载均衡上开启“服务器失效时删除对应会话表项”的强制删除功能,迫使应用端在服务器重启后重新发起三次握手建立新连接 这个配置在哪里???
nf_conntrack)已满,导致丢弃新建连接的数据包。(0)
现象:数据库长连接业务,后端 RS 服务器重启;负载均衡设备仍然保留旧的 TCP 会话 / 会话保持表项,应用继续复用这条失效旧连接,传输数据失败;新的数据库连接无法正常调度。 核心根因:实服务器故障动作默认 keep(保留旧连接,不主动发 RST 清理)+ 会话保持表项老化时间过长 + 健康检查没有及时把 RS 置为 down,RS 重启后 LB 会话表没有清理,应用持续复用已经死亡的旧四元组会话。
keep,服务器故障后不主动断开已有 TCP 会话,LB 继续把报文转发给已经重启后的 RS。实服务池里面,当 RS 探测为 down 时,对存量连接执行 reset,主动发送 TCP RST 清理旧失效会话。
loadbalance server-pool DB-POOL
fail-action reset
keep(默认):保留旧连接,不主动断,就是现场当前故障;reset:RS 故障检测到后,LB 主动向客户端和服务器双向发送 RST,销毁旧 TCP 会话,强制客户端重建新连接。数据库场景,不能只用 ICMP ping,必须用应用层健康检查(TCP 端口 / 数据库探测),服务器数据库进程重启后,及时把 RS 状态置为 down。
#示例:TCP端口健康检查,探测数据库端口
health-check template DB-TCP type tcp
port 1521
interval 3
retry 2
绑定到 server-pool。
仅 ping 探测会出现:服务器 OS 正常启动,但数据库服务未就绪,LB 判定 RS UP,转发旧会话,业务报错。
数据库连接池长连接,建议使用源 IP 会话保持,缩短会话保持老化时间,不要设置永不老化。
loadbalance persistence ip source-ip
aging-time 300
❌严禁数据库业务会话保持设置为永久不老化,服务器重启后表项不会自动清除。
调整 TCP ESTABLISHED 状态会话老化,配合应用层 TCP keepalive:
session aging-time state tcp-est 1200
数据库侧操作系统开启 TCP keepalive(linux net.ipv4.tcp_keepalive_time),两端配合探测死连接。
#查看负载均衡所有四层连接
display loadbalance connection verbose
#清除负载均衡存量连接
reset loadbalance connection all
#清除会话保持表项
reset loadbalance persistence all
错误操作:直接硬重启服务器,LB 来不及清理会话,直接复现该故障。
fail-action keep,服务器重启 LB 不主动发送 RST 清理旧 TCP 会话;会话保持老化时间过长,应用复用失效旧连接。fail-action reset,RS 故障时 LB 主动 RST 踢掉旧连接;使用应用层健康检查(TCP / 数据库探测,不要只用 ping);缩短会话保持老化时间,禁止永久会话保持。reset loadbalance connection 清理存量失效会话。(0)
亲~登录后才可以操作哦!
确定你的邮箱还未认证,请认证邮箱或绑定手机后进行当前操作
举报
×
侵犯我的权益
×
侵犯了我企业的权益
×
抄袭了我的内容
×
原文链接或出处
诽谤我
×
对根叔社区有害的内容
×
不规范转载
×
举报说明
我让客户试试