4.3 根据OSI网络模型分类
OSI 是一个开放性的通信系统互连参考模型,如上图所示。
在OSI参考模型中,分别有:
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层
从上图可以看出:
TELNET、HTTP、FTP、NFS、SMTP、DNS 等属于第七层应用层的概念;
TCP、UDP、SPX 等属于第四层传输层的概念;
IP、IPX 等属于第三层网络层的概念;
ATM、FDDI 等属于第二层数据链路层的概念。
根据负载均衡技术实现在 OSI 七层模型的不同层次,我们给负载均衡分类:
七层负载均衡:工作在应用层的负载均衡称;
四层负载均衡:工作在传输层的负载均衡称;
三层负载均衡:工作在网络层的负载均衡;
二层负载均衡:工作在数据链路层的负载均衡。
其中最常用的是四层和七层负载均衡。
下面我们将从OSI模型从下往上的顺序,来详细讲解上述几种负载均衡。
二层负载均衡
工作在数据链路层的负载均衡称之为二层负载均衡(又称为数据链路层负载均衡),通过在通信协议的数据链路层修改 mac 地址进行负载均衡。
二层负载均衡是基于数据链路层的负载均衡,即让负载均衡服务器和业务服务器绑定同一个虚拟 IP(即VIP),客户端直接通过这个 VIP 进行请求集群。集群中不同的机器采用相同IP地址,但是机器的 MAC 地址不一样。当负载均衡服务器接受到请求之后,通过改写报文的目标 MAC 地址的方式将请求转发到目标机器实现负载均衡。
数据链路层负载均衡所做的工作,是修改请求的数据帧中的 MAC 目标地址,让用户原本是发送给负载均衡器的请求的数据帧,被二层交换机根据新的 MAC 目标地址转发到服务器集群中对应的服务器(真实服务器)的网卡上,这样真实服务器就获得了一个原本目标并不是发送给它的数据帧。
为了便于理解,我们假设负载均衡器所在的 IP 地址为 192.168.1.1,后端服务实例的 MAC 地址分别为 52:54:00:A1:CB:F7、61:52:00:A2:BD、71:63:52:A3:CA。
如下图所示:
二层负载均衡
在上图中,用户的请求首先到达 IP 为 192.168.1.1 的二层负载均衡器。然后二层负载均衡器通过采取一定的策略,选中了 MAC 地址为 71:63:52:A3:CA,然后将流量转发至该服务实例。
需要注意的是,上述只有请求经过负载均衡器,而服务的响应无须从负载均衡器原路返回的工作模式,整个请求、转发、响应的链路形成一个“三角关系”,所以这种负载均衡模式也常被很形象地称为“三角传输模式”,也有叫“单臂模式”或者“直接路由”。
二层负载均衡器直接改写目标 MAC 地址的工作原理决定了它与真实的服务器的通信必须是二层可达的。通俗地说就是必须位于同一个子网当中,无法跨 VLAN。优势(效率高)和劣势(不能跨子网)共同决定了数据链路层负载均衡最适合用来做数据中心的第一级均衡设备,用来连接其他的下级负载均衡器。
三层负载均衡
三层负载均衡是基于网络层的负载均衡,因此又叫网络层负载均衡。通俗的说就是按照不同机器不同IP地址进行转发请求到不同的机器上。
根据 OSI 七层模型,在第三层网络层传输的单位是分组数据包,这是一种在分组交换网络中传输的结构化数据单位。以 IP 协议为例,一个 IP 数据包由 Headers 和 Payload 两部分组成, Headers 长度最大为 60Bytes,其中包括了 20Bytes 的固定数据和最长不超过 40Bytes 的可选的额外设置组成。
三层负载均衡服务器对外依然提供一个VIP(虚IP),但是集群中不同的机器采用不同的 IP 地址。当负载均衡服务器接受到请求之后,根据不同的负载均衡算法,通过IP将请求转发至不同的真实服务器。
学过计算机网络的都知道,在 IP 分组的数据报 header 中有源 IP 和目标 IP。源 IP 和目标 IP 代表分组交换中数据是从哪台机器到哪台机器的。那么,我们可以采用跟修改二层负载均衡中MAC地址的方式一样,直接修改目标IP,以达到数据转发的目的。
修改目标 IP 的方式有两种:
1) 原有的数据包保持不变,生成一个新的数据包
原数据包的 Header 和 Payload 作为新数据包的 Payload。在这个新数据包的 Headers 中写入真实服务器的 IP 作为目标地址,然后把它发送出去。
真实服务器收到数据包后,必须在接收入口处设计一个针对性的拆包机制,把由负载均衡器自动添加的那层 Headers 扔掉,还原出原来的数据包来进行使用。这样,真实服务器就同样拿到了一个原本不是发给它(目标 IP 不是它)的数据包,达到了流量转发的目的。这种数据传输方式叫做 IP 隧道传输。
尽管因为要封装新的数据包,IP 隧道的转发模式比起直接路由模式效率会有所下降,但由于并没有修改原有数据包中的任何信息,所以 IP 隧道的转发模式仍然具备三角传输的特性,即负载均衡器转发来的请求,可以由真实服务器去直接应答,无须在经过均衡器原路返回。而且由于 IP 隧道工作在网络层,所以可以跨越 VLAN,因此摆脱了直接路由模式中网络侧的约束。
此模式从请求到响应如下图所示:
IP 隧道模式负载均衡
优点:
可以跨越 VLAN 缺点;
要求真实服务器必须支持 IP 隧道协议,也就是说服务器需要自己会拆包;
必须通过专门的配置,必须保证所有的真实服务器与均衡器有着相同的虚拟 IP 地址。因为回复该数据包时,需要使用这个虚拟 IP 作为响应数据包的源地址,这样客户端收到这个数据包时才能正确解析。
基于以上原因,就有了第二种修改方式。
2) 改变目标数据包
直接把数据包 Headers 中的目标地址改为真实服务器地址,修改后原本由用户发给均衡器的数据包,也会被三层交换机转发送到真实服务器的网卡上,而且因为没有经过 IP 隧道的额外包装,也就无须再拆包了。
因为这种模式是通过修改目标 IP 地址才到达真实服务器的。如果真实服务器直接将应答包返回客户端的话,这个应答数据包的源 IP 是真实服务器的 IP,也即均衡器修改以后的 IP 地址,客户端不可能认识该 IP,自然就无法再正常处理这个应答了。因此,只能让应答流量继续回到负载均衡,由负载均衡把应答包的源 IP 改回自己的 IP,再发给客户端,这样才能保证客户端与真实服务器之间的正常通信。
这种修改目标 IP 的方式叫 NAT 模式,这种通过修改目标 IP 的方式达到负载均衡目的的方式叫做 NAT 负载均衡。
如下图所示:
NAT 模式负载均衡
四层负载均衡
所谓四层负载均衡,也就是主要通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。
由于四层负载均衡是作用在传输层,因此,我们就以常见的 TCP 进行举例。
负载均衡设备在接收到第一个来自客户端的 SYN 请求时,即通过上述方式选择一个最佳的服务器,并对报文中目标 IP 地址进行修改(改为后端服务器 IP),直接转发给该服务器。TCP 的连接建立,即三次握手是客户端和服务器直接建立的,负载均衡设备只是起到一个类似路由器的转发动作。在某些部署情况下,为保证服务器回包可以正确返回给负载均衡设备,在转发报文的同时可能还会对报文原来的源地址进行修改。
四层负载均衡
四层负载均衡主要是基于 TCP 协议报文,可以做任何基于 TCP/IP 协议软件负载均衡,比如 Haproxy、LVS 等。
七层负载均衡
所谓七层负载均衡,也称为“内容交换”,也就是主要通过报文中的真正有意义的应用层内容,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。
应用层协议较多,常用 HTTP、RADIUS、DNS 等。七层负载就可以基于这些协议来负载。
我们仍然以 TCP 为例。负载均衡设备如果要根据真正的应用层内容再选择服务器,只能先代理最终的服务器和客户端建立连接后(三次握手),才可能接受到客户端发送的真正应用层内容的报文。
然后,根据该报文中的特定字段,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。负载均衡设备在这种情况下,更类似于一个代理服务器。负载均衡和前端的客户端以及后端的服务器会分别建立 TCP 连接。所以从这个技术原理上来看,七层负载均衡明显的对负载均衡设备的要求更高,处理七层的能力也必然会低于四层模式的部署方式。
七层负载均衡器会与客户端以及后端的服务实例分别建立连接。
七层负载均衡
七层负载均衡基本都是基于 HTTP 协议的,适用于 Web 服务器的负载均衡,比如 Nginx 等。
五、对比四层负载均衡和七层负载均衡
1) 智能性
七层负载均衡由于具备 OSI 七层的所有功能,所以在处理用户需求上能更加灵活。从理论上讲,七层模型能对用户的所有跟服务端的请求进行修改。例如对文件 header 添加信息,根据不同的文件类型进行分类转发。
四层模型仅支持基于网络层的需求转发,不能修改用户请求的内容。
2) 安全性
七层负载均衡由于具有 OSI 模型的全部功能,能更容易抵御来自网络的攻击。
四层模型从原理上讲,会直接将用户的请求转发给后端节点,无法直接抵御网络攻击。
3) 复杂度
四层模型一般比较简单的架构,容易管理、容易定位问题。
七层模型架构比较复杂,通常也需要考虑结合四层模型的混用情况,出现问题定位比较复杂。
4) 效率比
四层模型基于更底层的设置,通常效率更高,但应用范围有限。
七层模型需要更多的资源损耗,在理论上讲比四层模型有更强的功能,现在的实现更多是基于 HTTP 应用。