我在 4 台其他服务器前面安装了 2 个负载均衡器,每秒总共处理大约 5-6000 个请求。我注意到每隔几分钟,一台负载均衡器在连接到其中一台服务器时会发生连接超时。作为总连接的百分比,这当然是一个非常低的故障率,但是,它们位于同一个数据中心,我不明白为什么会出现连接超时(60 秒,仅供参考)。
当这种情况发生时,我设法从其中一台服务器捕获数据包,看起来 SYN-ACK 数据包没有到达负载均衡器。
19:33:51.023518 IP 10.36.213.2.58011 > 10.36.213.36.8005: Flags [S], seq 1726133855, win 5840, options [mss 1460,sackOK,TS val 14377140 ecr 0,nop,wscale 7], length 0
19:33:51.023534 IP 10.36.213.36.8005 > 10.36.213.2.58011: Flags [S.], seq 806746037, ack 1726133856, win 5792, options [mss 1460,sackOK,TS val 15334821 ecr 14377140,nop,wscale 7], length 0
19:33:54.026705 IP 10.36.213.2.58011 > 10.36.213.36.8005: Flags [S], seq 1726133855, win 5840, options [mss 1460,sackOK,TS val 14377440 ecr 0,nop,wscale 7], length 0
19:33:54.026712 IP 10.36.213.36.8005 > 10.36.213.2.58011: Flags [S.], seq 806746037, ack 1726133856, win 5792, options [mss 1460,sackOK,TS val 15335121 ecr 14377140,nop,wscale 7], length 0
19:33:54.620425 IP 10.36.213.36.8005 > 10.36.213.2.58011: Flags [S.], seq 806746037, ack 1726133856, win 5792, options [mss 1460,sackOK,TS val 15335181 ecr 14377140,nop,wscale 7], length 0
19:34:00.026709 IP 10.36.213.2.58011 > 10.36.213.36.8005: Flags [S], seq 1726133855, win 5840, options [mss 1460,sackOK,TS val 14378040 ecr 0,nop,wscale 7], length 0
19:34:00.026726 IP 10.36.213.36.8005 > 10.36.213.2.58011: Flags [S.], seq 806746037, ack 1726133856, win 5792, options [mss 1460,sackOK,TS val 15335721 ecr 14377140,nop,wscale 7], length 0
19:34:00.620436 IP 10.36.213.36.8005 > 10.36.213.2.58011: Flags [S.], seq 806746037, ack 1726133856, win 5792, options [mss 1460,sackOK,TS val 15335781 ecr 14377140,nop,wscale 7], length 0
19:34:12.620430 IP 10.36.213.36.8005 > 10.36.213.2.58011: Flags [S.], seq 806746037, ack 1726133856, win 5792, options [mss 1460,sackOK,TS val 15336981 ecr 14377140,nop,wscale 7], length 0
19:34:36.820432 IP 10.36.213.36.8005 > 10.36.213.2.58011: Flags [S.], seq 806746037, ack 1726133856, win 5792, options [mss 1460,sackOK,TS val 15339401 ecr 14377140,nop,wscale 7], length 0
19:35:24.820433 IP 10.36.213.36.8005 > 10.36.213.2.58011: Flags [S.], seq 806746037, ack 1726133856, win 5792, options [mss 1460,sackOK,TS val 15344201 ecr 14377140,nop,wscale 7], length 0
在此捕获中,10.36.213.2 是负载均衡器,10.36.213.36 是服务器机器。
我猜所有这些数据包都是随机丢弃的,可能性很低……更有可能的是它们以某种方式被拒绝。所以,问题是:我如何才能找出这些数据包无法通过的原因?
答案1
我看到过类似的问题(当然是在 Windows 上),服务器正在对 TCP 数据包大小进行某种愚蠢的自动调整,而 Cisco 负载均衡器不支持更大的数据包大小,因此它们拒绝了它们。我不知道 *nix 是否支持这种愚蠢的做法,但如果支持,那可能就是问题所在。