负载均衡又分为四层负载均衡和七层负载均衡。四层负载均衡工作在OSI模型的传输层,主要工作是转发,它在接收到客户端的流量以后通过修改数据包的地址信息将流量转发到应用服务器。
![img_9b37cf2f404f4dc53417ae16bc171713.png](https://yqfile.alicdn.com/img_9b37cf2f404f4dc53417ae16bc171713.png?x-oss-process=image/resize,w_1400/format,webp)
七层负载均衡工作在OSI模型的应用层,因为它需要解析应用层流量,所以七层负载均衡在接到客户端的流量以后,还需要一个完整的TCP/IP协议栈。七层负载均衡会与客户端建立一条完整的连接并将应用层的请求流量解析出来,再按照调度算法选择一个应用服务器,并与应用服务器建立另外一条连接将请求发送过去,因此七层负载均衡的主要工作就是代理。
既然四层负载均衡做的主要工作是转发,那就存在一个转发模式的问题,目前主要有四层转发模式:DR模式、NAT模式、TUNNEL模式、FULLNAT模式。
![img_61f10bc5d266e7c2f91b96dfcd49d1b5.png](https://yqfile.alicdn.com/img_61f10bc5d266e7c2f91b96dfcd49d1b5.png?x-oss-process=image/resize,w_1400/format,webp)
DR模式也叫作三角传输,通过修改数据包的目的MAC地址来让流量经过二层转发到达应用服务器,这样应用服务器就可以直接将应答发给应用服务器,性能比较好。由于这种模式需要依赖二层转发,因此它要求负载均衡服务器和应用服务器必须在一个二层可达的环境内,并且需要在应用服务器上配置VIP。
NAT模式通过修改数据包的目的IP地址,让流量到达应用服务器,这样做的好处是数据包的目的IP就是应用服务器的IP,因此不需要再在应用服务器上配置VIP了。缺点是由于这种模式修改了目的IP地址,这样如果应用服务器直接将应答包发给客户端的话,其源IP是应用服务器的IP,客户端就不会正常接收这个应答,因此我们需要让流量继续回到负载均衡,负载均衡将应答包的源IP改回VIP再发到客户端,这样才可以保证正常通信,所以NAT模式要求负载均衡需要以网关的形式存在于网络中。
TUNNEL模式的优缺点和DR是一样的,并且TUNNEL模式要求应用服务器必须支持TUNNEL功能。
FULLNAT模式是在NAT模式的基础上做一次源地址转换(即SNAT),做SNAT的好处是可以让应答流量经过正常的三层路由回到负载均衡上,这样负载均衡就不需要以网关的形式存在于网络中了,对网络环境要求比较低,缺点是由于做了SNAT,应用服务器会丢失客户端的真实IP地址。
![img_704bbabd424a1f89248029c1e41861b9.png](https://yqfile.alicdn.com/img_704bbabd424a1f89248029c1e41861b9.png?x-oss-process=image/resize,w_1400/format,webp)
下面详细介绍一下FULLNAT模式。首先负载均衡上需要存在一个localip池,在做SNAT时的源IP就是从localip池中选择的。当客户端流量到达负载均衡设备以后,负载均衡会根据调度策略在应用服务器池中选择一个应用服务器,然后将数据包的目的IP改为应用服务器的IP。同时从localip池中选择一个localip将数据包的源IP改为localip,这样应用服务器在应答时,目的IP是localip,而localip是真实存在于负载均衡上的IP地址,因此可以经过正常的三层路由到达负载均衡。由于FULLNAT比NAT模式多做了一次SNAT,并且SNAT中有选端口的操作,因此其性能要逊色于NAT模式,但是其较强的网络环境适应性。
个人介绍:
高广超:多年一线互联网研发与架构设计经验,擅长设计与落地高可用、高性能、可扩展的互联网架构。
本文首发在 高广超的简书博客 转载请注明!
![img_31e2e3075b097cabfd9b3643cd9abaa5.png](https://yqfile.alicdn.com/img_31e2e3075b097cabfd9b3643cd9abaa5.png?x-oss-process=image/resize,w_1400/format,webp)
![img_3b1610566b09db3358ca5dcb3e015a52.png](https://yqfile.alicdn.com/img_3b1610566b09db3358ca5dcb3e015a52.png?x-oss-process=image/resize,w_1400/format,webp)