排查网络故障实践:解决负载均衡的难题

对网络问题进行故障排查往往是件棘手的任务,而负载均衡器的存在则会带来其它更为复杂的挑战。我们很难判断负载均衡器单纯是在丢弃数据包、以某种方式变更数据包还是导致网络整体延迟水平上升。不过在今天的文章中,我们将共享几项常见技巧,相信它们能帮助各位更加轻松地发现问题所在。

对于任何一种故障排查流程来讲,首先要做的肯定是检查整套实体的统计信息。然而,即使统计信息显示一切运转正常,我们仍然不能就此排除存在网络问题的可能性。接下来,我们要做的就是引入故障排查领域的中立处理手段——数据包分析。虽然目前已经有大量优秀的收费数据包分析产品可供选择,但我个人更青睐开源Wireshark。

当对包含负载均衡器的网络体系进行问题分析时,首先要解决的问题就是该负载均衡器是否处于透明模式。在透明模式下,负载均衡器会将原有客户IP作为源IP。而在非透明模式下,该负载均衡器则会利用虚拟IP地址——或者简称VIP——向服务器发送请求。一般情况下,负载均衡器大多会以非透明模式运行。

现在大家已经准备好对文件进行追踪了。在理想状态下,我们可以在下图中的每个点内设置分接器。如果不具备分接器,大家也可以利用SPAN或者交换机上的镜像端口捕捉相关流量。当然,大家也可以在防火墙以及负载均衡器上的入站与出站端口使用tcpdump。其中的关窍在于,我们必须在全部四个位置一次性捕捉数据包,从而通过四种不同的角度审视传输会话。

在捕捉到数据之后,大家必须从全部四个跟踪文件当中找到同时存在的单一会话。一般来讲,大家能够通过过滤器找出请求与完成的两个IP地址。不过请注意,负载均衡器是在服务器端执行NAT的,因此对客户端IP进行过滤对服务器端追踪工作并无效果。

从第四层出发则能够解决这一难题。大家可以在TCP报头当中过滤序列号。不过需要注意的是,Wireshark会在默认情况下显示相关序列号,因此我们最终可能会得到成百上千个以序列号1开头的数据包。解决问题的关键在于关闭TCP设置当中的相关序列号功能。只需要取消勾选项,过滤结果就会显示实际十位序列号,而非作为会话开头的第一位数字。在对全部四个跟踪文件进行相同序列号过滤之后,大家应该会在每个文件中找到对应的惟一数据包。

麻烦的部分在于,如果大家的负载均衡器在NAT端自行创建出了指向服务器的数据包,那么各个文件当中的序列字段将不再完全相同。在这种情况下,最理想的办法是从应用层内选择惟一字段。对于HTTP,我建议大家使用Cookie字段;而对于HTTPS,Client Hello中的Random Bytes字段则最为合适。

最后,我们终于能够捕捉到单一会话,并对该痕迹进行访问了。首先,查看丢包情况。在Wireshark Expert Analysis当中,这些数据包会被标为“Previous segment no captured(即前段未被捕捉)。”这种情况可能出现在一个或者多个跟踪文件当中,但不会是全部。举例来说,如果大家在防火墙跟踪文件的出站端而非入站端发现了来自服务器的响应,那么就会判断出该数据包被防火墙丢弃。

在丢包查找完成后,检查TCP握手以确保各TCP选项没有在路径中受到篡改。当路径中的某个对话框自行创建数据包、而非以透明化方式直接经过时,则窗口缩放与选择性应答会出现消失趋势。这两个选项对于评估数据吞吐量而言非常重要,千万不要忽略。

最后一个需要解决的问题就是在跟踪文件中寻找高时间增量。通过对四个不同检查点进行数据捕捉,大家肯定能够发现的就是延迟水平的提升。首先查看握手,并以同步请求(SYN)与同步响应(SYN/ACK)之间的时间长度作为参考基准。查看跟踪文件中指向最接近客户端的防火墙的入站请求与响应。

对于那些时间增量达到1秒甚至更高的请求/响应组合,我们需要排查整个追踪过程,直到找出显著增加延迟水平的对应端口。其是否来自CPU处于运行峰值的防火墙?还是某个未能正常追踪其NAT表的负载均衡器?当然,也可能是存在太多并发连接的服务器。排查整个追踪流程将帮助大家了解问题的出现位置,同时明确哪些位置运转正常。

在网络排查工作当中,设置数据包捕捉可能会占用大量宝贵时间,但从长久角度看、这却是一种节约时间的良好习惯。

鼎峰胡佳雄
QQ.2881064155
Skype.live:2881064155

时间: 2024-10-13 10:48:47

排查网络故障实践:解决负载均衡的难题的相关文章

大开测试:性能- 如何解决负载均衡将压力作用到一台机器(连载15)

7.15  如何解决负载均衡将压力作用到一台机器 1.问题提出 如由IP地址为192.168.1.30.192.168.1.31.192.168.1.32的3台机器组成的Apache.Tomcat集群和负载均衡系统,发现客户端发出请求后,都将请求发送到了IP为192.168.1.30的机器上,请问这是为什么呢? 2.问题解答 随着互联网络技术的飞速发展,越来越多的应用已经从最早的单机操作变成基于互联网的操作.由于网络用户数量激增,网络访问路径过长,用户的访问质量容易受到严重影响,尤其是当用户与网

如何运用PHP+REDIS解决负载均衡后的session共享问题

一.为什么要使用Session共享? 稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网站,用户系统是统一的,即一套用户名.密码在整个网站的各个模块中都是可以登录使用的.各个服务器共享用户数据是比较容易实现的,只需要在后端放个数据库服务器,各个服务器通过统一接口对用户数据进行访问即可.但还存在一个问题,就是用户在这个服务器登录之后,进入另一个服务器的别的模块时,仍然需要重新登录,这就是一次登录,全部通行的问题,映射到技术上,其实就是各个

Linux内核软RPS实现网络接收软中断的负载均衡分发

例行的Linux软中断分发机制与问题 Linux的中断分为上下两半部,一般而言(事实确实也是如此),被中断的CPU执行中断处理函数,并在在本CPU上触发软中断(下半部),等硬中断处理返回后,软中断随即开中断在本CPU运行,或者wake up本CPU上的软中断内核线程来处理在硬中断中pending的软中断.       换句话说,Linux和同一个中断向量相关的中断上半部和软中断都是在同一个CPU上执行的,这个可以通过raise_softirq这个接口看出来.这种设计的逻辑是正确的,但是在某些不甚

使用tengine解决负载均衡的session问题

事情的经过时这样的~~,我看了好多好多百度中nginx负载均衡中解决session问题的方式,我选择了研究url_hash的方式.经过一番配置之后,我越发觉得这百度搜出来的帖子也太过久远了吧,去http://wiki.nginx.org/上找了找这个模块 ,在github下载的位置上看到了这样一段话: NOTE: This module is obsolete as of Nginx 1.7.2, which includes the hashdirective. This repository

Sink Prosessor - Flume的可靠性保证:故障转移、负载均衡

Flume的一些组件(如Spooling Directory Source.File Channel)能够保证agent挂掉后不丢失数据. 1.负载均衡 1)Load balancing Sink Processor source里的event流经channel,进入sink组,在sink组内部根据负载算法(round_robin.random)选择sink,后续可以选择不同机器上的agent实现负载均衡. 实例如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

搞懂分布式技术10:LVS实现负载均衡的原理与实践

搞懂分布式技术10:LVS实现负载均衡的原理与实践 浅析负载均衡及LVS实现 原创: fireflyc 写程序的康德 2017-09-19 负载均衡 负载均衡(Load Balance,缩写LB)是一种网络技术,它在多个备选资源中做资源分配,以达到选择最优.这里有三个关键字: 网络技术,LB要解决的问题本质上是网络的问题,所以它实际上就是通过修改数据包中MAC地址.IP地址字段来实现数据包的"中转": 资源,这里的资源不仅仅是计算机也可以是交换机.存储设备等: 最优,它则是针对业务而言

实践出真知——一文教你搭建Nginx+Tomcat集群,实现负载均衡及动静分离

实践出真知--一文教你搭建Nginx+Tomcat集群,实现负载均衡及动静分离 前言 ? 想必大家对于Nginx和Tomcat都非常熟悉了,Nginx的应用非常广泛,不仅是对web静态资源非常友好,而且也是非常实用的反向代理和负载均衡软件.结合后端Tomcat的服务,从而搭建Nginx+Tomcat集群. ? 对于直接想要实践的朋友而言可以获取本文的链接中的软件包后直接看第三备份的内容. 一.集群搭建结构及拓扑 1.1集群架构图示 Nginx+Tomcat集群的结构示意图如下: 1.2系统环境与

负载均衡中四层和七层的介绍(转帖)

四层负载与其层负载的介绍 转自http://kb.cnblogs.com/page/188170/ (一) 简单理解四层和七层负载均衡: ① 所谓四层就是基于IP+端口的负载均衡:七层就是基于URL等应用层信息的负载均衡:同理,还有基于MAC地址的二层负载均衡和基于IP地址的三层负载均衡. 换句换说,二层负载均衡会通过一个虚拟MAC地址接收请求,然后再分配到真实的MAC地址:三层负载均衡会通过一个虚拟IP地址接收请求,然后再分配到真实的IP地址:四层通过虚拟IP+端口接收请求,然后再分配到真实的

四层和七层负载均衡的区别

(一) 简单理解四层和七层负载均衡: ① 所谓四层就是基于IP+端口的负载均衡:七层就是基于URL等应用层信息的负载均衡:同理,还有基于MAC地址的二层负载均衡和基于IP地址的三层负载均衡. 换句换说,二层负载均衡会通过一个虚拟MAC地址接收请求,然后再分配到真实的MAC地址:三层负载均衡会通过一个虚拟IP地址接收请求,然后再分配到真实的IP地址:四层通过虚拟IP+端口接收请求,然后再分配到真实的服务器:七层通过虚拟的URL或主机名接收请求,然后再分配到真实的服务器. ② 所谓的四到七层负载均衡