所谓的四到七层负载均衡,就是在对后台的服务器进行负载均衡时,依据四层的信息或七层的信息来决定怎么样转发流量。比如四层的负载均衡,就是通过发布三层的IP地址(VIP),然后加四层的端口号,来决定哪些流量需要做负载均衡,对需要处理的流量进行NAT处理,转发至后台服务器,并记录下这个TCP或者UDP的流量是由哪台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理。七层的负载均衡,就是在四层的基础上(没有四层是绝对不可能有七层的),再考虑应用层的特征,比如同一个Web服务器的负载均衡,除了根据VIP加80端口辨别是否需要处理的流量,还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。举个例子,如果你的Web服务器分成两组,一组是中文语言的,一组是英文语言的,那么七层负载均衡就可以当用户来访问你的域名时,自动辨别用户语言,然后选择对应的语言服务器组进行负载均衡处理。
同理,还有基于MAC地址的二层负载均衡和基于IP地址的三层负载均衡。 换句换说,二层负载均衡会通过一个虚拟MAC地址接收请求,然后再分配到真实的MAC地址;三层负载均衡会通过一个虚拟IP地址接收请求,然后再分配到真实的IP地址;
四层就是基于IP+端口的负载均衡,通过虚拟IP+端口接收请求,然后再分配到真实的服务器。
四层负载均衡工作于传输控制协议层,意味着LB只获取TCP表头的基本信息:来源IP、目的IP等,请求体的内容对LB是透明的,也就是说LB看不到请求的内容,只知道它从何处来要往何处去,带了多重的“行李”。
L4层的LB可以实现简单的轮询、随机、或者基于IP的地址位置请求分发。
七层就是基于URL等应用层信息的负载均衡,七层通过虚拟的URL或主机名接收请求,然后再分配到真实的服务器。
七层负载均衡工作于应用层,例如最常用的 HTTP 协议层,则可以根据 HTTP 的方法、URL、版本、HTTP 头部信息甚至是根据请求体的内容,请求体都需要过 LB 这个安检机器,LB 知道“行李”装的是什么。当然,它的行程和重量,LB 也一清二楚(即实际上 LB 同时工作于 L4 和 L7 层)。
工作于 L7 层相比于 L4 层会更损耗性能,但在今天这个性能过剩的时代,这点损耗是可以接受的。
有了这个能力,LB 可以:
nginx 单台物理机可支持QPS达到3W~5W个并发请求,所以当用户访问的并发量增多,单台Nginx已经无法支撑,必须要部署Nginx集群。而四层负载均衡就可以实现基于IP和端口将用户请求分发到不同的Nginx服务器,做nginx集群的转发。这些下一级的Nginx服务器,做的是七层的负载均衡,根据应用层业务的不同,分发到不同的服务器。
只用四层负载均衡的情况,主要是后端TCP/IP业务的负载,比如MySQL集群、Redis、k8s集群等。
只用七层负载均衡的情况,主要是中小型站点的web服务,并发量比较小。
总的来说,基于IP+端口的四层负载均衡更快,尤其是LVS,在内核空间处理,不走用户空间。适合用于大型站点,放在网站接入层的最前端,专注做数据转发,后面结合七层负载均衡,用来处理更负载的业务。
四层负载均衡,主要通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。
以常见的TCP为例,负载均衡设备在接收到第一个来自客户端的SYN 请求时,即通过上述方式选择一个最佳的服务器,并对报文中目标IP地址进行修改(改为后端服务器IP),直接转发给该服务器。TCP的连接建立,即三次握手是客户端和服务器直接建立的,负载均衡设备只是起到一个类似路由器的转发动作。在某些部署情况下,为保证服务器回包可以正确返回给负载均衡设备,在转发报文的同时可能还会对报文原来的源地址进行修改。
七层负载均衡也称为“内容交换”,主要通过报文中的应用层内容,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。
以常见的TCP为例,负载均衡设备如果要根据真正的应用层内容再选择服务器,只能先代理最终的服务器和客户端建立连接(三次握手)后,才可能接受到客户端发送的真正应用层内容的报文,然后再根据该报文中的特定字段,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。负载均衡设备在这种情况下,更类似于一个代理服务器。负载均衡和前端的客户端以及后端的服务器会分别建立TCP连接。所以从这个技术原理上来看,七层负载均衡明显的对负载均衡设备的要求更高,处理七层的能力也必然会低于四层模式的部署方式。