凤凰架构:构建可靠的大型分布式系统
上QQ阅读APP看书,第一时间看更新

4.5.3 应用层负载均衡

前面介绍的四层负载均衡工作模式都属于“转发”,即直接将承载着TCP报文的底层数据格式(IP数据包或以太网帧)转发到真实服务器上,此时客户端与响应请求的真实服务器维持着同一条TCP通道。但工作在四层之后的负载均衡模式就无法再转发了,只能代理,此时真实服务器、负载均衡器、客户端三者之间由两条独立的TCP通道来维持通信。转发与代理的区别如图4-11所示。

图4-11 转发与代理

“代理”这个词,根据“哪一方能感知到”的原则,可以分为“正向代理”“反向代理”和“透明代理”三类。正向代理就是我们通常简称的代理,指在客户端设置的,代表客户端与服务器通信的代理服务,它是客户端可知,而对服务器透明的。反向代理是指在服务器侧设置的,代表真实服务器与客户端通信的代理服务,此时它对客户端来说是透明的。至于透明代理是指对双方都透明的,配置在网络中间设备上的代理服务,譬如,架设在路由器上的透明翻墙代理。

根据以上定义,很显然,七层负载均衡器属于反向代理的一种。如果只论网络性能,七层负载均衡器肯定比不过四层负载均衡器,它比四层负载均衡器至少多一轮TCP握手,有着跟NAT转发模式一样的带宽问题,而且通常要耗费更多的CPU,因为可用的解析规则远比四层丰富。所以如果用七层负载均衡器去做下载站、视频站这种流量应用是不合适的,起码不能作为第一级均衡器。但是,如果网站的性能瓶颈不是网络性能,而是整个服务集群对外所体现出来的服务性能,那么七层负载均衡器就有它的用武之地了。因为七层负载均衡器工作在应用层,可以感知应用层通信的具体内容,往往能够做出更明智的决策,玩出更多的花样。

举个生活中的例子,四层负载均衡器就像银行的自助排号机,转发效率高且不知疲倦,每一个到达银行的客户根据排号机的顺序,选择对应的窗口接受服务;而七层负载均衡器就像银行大堂经理,他会先确认客户需要办理的业务,再安排排号。对于理财、存取款等业务,大堂经理会根据银行内部资源进行统一协调处理,以加快客户业务办理流程;而对于无须柜台办理的业务,大堂经理会直接自行处理。回到七层负载均衡器中,反向代理能够实现静态资源缓存,所以对于静态资源的请求,反向代理会直接返回,而无须转发到真实服务器。

代理的工作模式相信大家已经比较熟悉了,这里不再展开,只是简单列举一些七层代理可以实现的功能,以便读者对它的“功能强大”有个直观的感受。

·前面介绍CDN应用时,所有CDN可以做的缓存方面的工作(CDN根据物理位置就近返回这类优化链路的工作除外),七层负载均衡器全都可以实现,譬如静态资源缓存、协议升级、安全防护、访问控制,等等。

·七层负载均衡器可以实现更智能化的路由。譬如,根据Session路由,以实现亲和性的集群;根据URL路由,实现专职化服务(此时就相当于网关的职责);甚至根据用户身份路由,实现对部分用户的特殊服务(如某些站点的贵宾服务器),等等。

·某些安全攻击可以由七层负载均衡器来抵御,譬如一种常见的DDoS手段是SYN Flood攻击,即攻击者控制众多客户端,使用虚假IP地址对同一目标大量发送SYN报文。从技术原理上看,由于四层负载均衡器无法感知上层协议的内容,这些SYN攻击都会被转发到后端的真实服务器上;而七层负载均衡器下这些SYN攻击会在负载均衡设备上被过滤掉,不会影响到后面服务器的正常运行。类似地,可以在七层负载均衡器上设定多种策略,譬如过滤特定报文,以防御如SQL注入等应用层面的特定攻击手段。

·在很多微服务架构的系统中,链路治理措施都需要在七层中进行,譬如服务降级、熔断、异常注入,等等。譬如,一台服务器只有出现物理层面或者系统层面的故障,导致无法应答TCP请求时才能被四层负载均衡器感知,进而被剔除出服务集群。如果一台服务器能够应答,只是一直在报500错,那四层负载均衡器对此是完全无能为力的,只能由七层负载均衡器来解决。