学习笔记——《周志明的软件架构课》20 | 常见的四层负载均衡的工作模式是怎样的?
负载均衡的两种模式
无论我们在网关内部建立了多少级的负载均衡,从形式上来说都可以分为两种:四层负载均衡和七层负载均衡。
整体原则:
- 四层负载均衡的优势是性能高,七层负载均衡的优势是功能强。
- 做多级混合负载均衡,通常应该是低层的负载均衡在前,高层的负载均衡在后。
现在人们所说的“四层负载均衡”,其实是多种均衡器工作模式的统称。“四层”的意思是说,这些工作模式的共同特点是都维持着同一个 TCP 连接,而不是说它就只工作在第四层。
常见的四层负载均衡的工作模式
数据链路层负载均衡
数据链路层负载均衡所做的工作,是修改请求的数据帧中的 MAC 目标地址,让用户原本是发送给负载均衡器的请求的数据帧,被二层交换机根据新的 MAC 目标地址,转发到服务器集群中,对应的服务器(后面都叫做“真实服务器”,Real Server)的网卡上,这样真实服务器就获得了一个原本目标并不是发送给它的数据帧。
我们在使用这种负载均衡模式的时候,需要把真实物理服务器集群所有机器的虚拟 IP 地址(Virtual IP Address,VIP),配置成跟负载均衡器的虚拟 IP 一样,这样经均衡器转发后的数据包,就能在真实服务器中顺利地使用。
这是因为第三层的数据包,也就是 IP 数据包中,包含了源(客户端)和目标(均衡器)的 IP 地址,只有真实服务器保证自己的 IP 地址与数据包中的目标 IP 地址一致,这个数据包才能被正确处理。
也正是因为实际处理请求的真实物理服务器 IP 和数据请求中的目的 IP 是一致的,所以响应结果就不再需要通过负载均衡服务器进行地址交换,我们可以把响应结果的数据包直接从真实服务器返回给用户的客户端,避免负载均衡器网卡带宽成为瓶颈,所以数据链路层的负载均衡效率是相当高的。
整个请求响应过程如下:
数据链路层负载均衡的工作模式是,只有请求会经过负载均衡器,而服务的响应不需要从负载均衡器原路返回,整个请求、转发、响应的链路形成了一个“三角关系”。所以,这种负载均衡模式也被很形象地称为“三角传输模式”(Direct Server Return,DSR),也有人叫它是“单臂模式”(Single Legged Mode)或者“直接路由”(Direct Routing)。
不过,二层负载均衡器直接改写目标 MAC 地址的工作原理,决定了它与真实服务器的通讯必须是二层可达的。通俗地说,就是它们必须位于同一个子网当中,无法跨 VLAN。
所以,数据链路层负载均衡最适合用来做数据中心的第一级均衡设备,用来连接其他的下级负载均衡器。
网络层负载均衡
网络层中,源和目标 IP 地址代表了“数据是从分组交换网络中的哪台机器发送到哪台机器的”,所以我们就可以沿用与二层改写 MAC 地址相似的思路,通过改变这里面的 IP 地址,来实现数据包的转发。
具体的话,有两种方式:
第一种是保持原来的数据包不变,新创建一个数据包,把原来数据包的 Headers 和 Payload 整体作为另一个新的数据包的 Payload,在这个新数据包的 Headers 中,写入真实服务器的 IP 作为目标地址,然后把它发送出去。
当真实服务器收到数据包后,就必须在接收入口处,设计一个针对性的拆包机制,把由负载均衡器自动添加的那层 Headers 扔掉,还原出原来的数据包来进行使用。
尽管因为要封装新的数据包,IP 隧道的转发模式比起直接路由的模式,效率会有所下降,但因为它并没有修改原有数据包中的任何信息,所以 IP 隧道的转发模式仍然具备三角传输的特性
最终请求响应过程如下:
因为 IP 隧道工作在网络层,所以可以跨越 VLAN
不过,这种模式仍然必须通过专门的配置,必须保证所有的真实服务器与均衡器有着相同的虚拟 IP 地址。因为真实服务器器在回复该数据包的时候,需要使用这个虚拟 IP 作为响应数据包的源地址,这样客户端在收到这个数据包的时候才能正确解析。
第二种改变目标数据包的方式:直接把数据包 Headers 中的目标地址改掉,修改后原本由用户发给均衡器的数据包,也会被三层交换机转发送到真实服务器的网卡上,而且因为没有经过 IP 隧道的额外包装,也就无需再拆包了。
我们可以让应答流量继续回到负载均衡,负载均衡把应答包的源 IP 改回自己的 IP,然后再发给客户端,这样才能保证客户端与真实服务器之间正常通信。这种负载均衡的模式的确就被称为 NAT 模式。(进一步的,还有SNAT模式)
请求响应过程如下:
需要注意的是,在流量压力比较大的时候,NAT 模式的负载均衡会带来较大的性能损失,比起直接路由和 IP 隧道模式,甚至会出现数量级上的下降。
这样的好处是真实服务器连网关都不需要配置了,它能让应答流量经过正常的三层路由,回到负载均衡器上,做到了彻底的透明。
但它的缺点是由于做了 SNAT,真实服务器处理请求时就无法拿到客户端的 IP 地址了,在真实服务器的视角看来,所有的流量都来自于负载均衡器,这样有一些需要根据目标 IP 进行控制的业务逻辑就无法进行了。
应用层负载均衡
四层负载均衡的工作模式都属于“转发”,即直接将承载着 TCP 报文的底层数据格式(IP 数据包或以太网帧),转发到真实服务器上,此时客户端到响应请求的真实服务器维持着同一条 TCP 通道。
但工作在四层之后的负载均衡模式就无法再进行转发了,只能进行代理。此时正式服务器、负载均衡器、客户端三者之间,是由两条独立的 TCP 通道来维持通讯的。
具体区别如下:
如果只论网络性能,七层负载均衡器肯定是无论如何比不过四层负载均衡器的。毕竟它比四层负载均衡器至少要多一轮 TCP 握手,还有着跟 NAT 转发模式一样的带宽问题,而且通常要耗费更多的 CPU,因为可用的解析规则远比四层丰富。
七层负载均衡器的底气就来源于,它是工作在应用层的,可以感知应用层通讯的具体内容,往往能够做出更明智的决策,玩出更多的花样来。
负载均衡器的实现
从实现角度来看,负载均衡器的实现有“软件均衡器”和“硬件均衡器”两类。
在软件均衡器方面,又分为直接建设在操作系统内核的均衡器和应用程序形式的均衡器两种。前者的代表是 LVS(Linux Virtual Server),后者的代表有 Nginx、HAProxy、KeepAlived,等等;前者的性能会更好,因为它不需要在内核空间和应用空间中来回复制数据包;而后者的优势是选择广泛,使用方便,功能不受限于内核版本。
在硬件均衡器方面,往往会直接采用应用专用集成电路(Application Specific Integrated Circuit,ASIC)来实现。因为它有专用处理芯片的支持,可以避免操作系统层面的损耗,从而能够达到最高的性能。这类的代表就是著名的 F5 和 A10 公司的负载均衡产品。
参考资料
本文内容来源于极客时间周志明老师的公开课《周志明的软件架构课》,原文链接为:time.geekbang.org/column/arti…