四层负载均衡 vs 七层负载均衡

439 阅读7分钟

负载均衡(Load Balance)在整个互联网集群系统架构中是个比较重要的概念,其可将用户的访问流量,水平均匀的打散到后端多个服务单元上进行数据加工和处理,从而理论上只要不断的增加后端的服务单元,就可以做到服务容量的无限水平扩展。而我们平时经常会听到四层负载均衡和七层负载均衡的概念,他们到底是什么意思?两者到底有什么样的差异性?本文做个简单的科普。

1、概念介绍

OSI七层模型

在了解两者差异性之前,首先我们先了解下OSI的七层模型。OSI全称Open Systems Interconnection,他是网络通信中的第一个标准模型,创建于1983。而现代比较流行的标准反而不是OSI模型,是大名鼎鼎的TCP/IP协议模型。

我们首先看看OSI模型中到底是哪七层,每层分别是什么作用?

如下图所示,从高到低,从应用层越来越偏物理底层。

第七层应用层Application Layer,这一层是面向终端用户软件使用的,比如浏览器,邮件客户端等。属于这一层的协议包括 HTTP 超文本协议,FTP 文件传输协议,POP ,SMTP,DNS等

第六层表示层Presentation Layer,该层是为应用层准备数据,定义两个设备之间应该如何做编码,加密,压缩等数据处理方式,以便两端能够正确的接受到数据信息。

第五层会话层Session Layer,该层在设备之间创建通信信道,负责在两端进行数据传输期间保持通信信道的通畅,并在通信结束时候关闭会话,并且还可以做到断点续传的能力。

第四层传输层Transport Layer,该层接收上层会话层传输的数据,并在发送端将其分成“段(segments)”。并负责重组接收端接收到的段,将其组装为会话层可以使用的数据。传输层可以在发送端执行流控制,按照接收设备的数据可接受速率来发送数据。除此以外还可以做错误控制,检查数据是否被正确地接收。

第三层网络层Network Layer,该层有两种主要功能。一种是将上层产生的数据段分解成网络数据包,在网络上进行传输,并在接收端重新组装为段。另一种是通过发现物理网络上的最佳路径来路由数据包。网络层使用网络地址(通常是Internet协议地址)将数据包路由到目的节点。

第二层数据链路层Data Link Layer,该层建立并终止网络上两个物理连接节点之间的连接。它将数据包分解成帧,并将它们从源地址发送到目的地。该层由两部分组成:逻辑链路控制(LLC),用于识别网络协议、执行错误检查和同步帧;媒体访问控制(MAC),用于使用MAC地址连接设备并定义传输和接收数据的权限。

第一层物理层Physical Layer,该层负责网络节点之间的物理电缆或无线连接。它定义了连接设备的连接器、电缆或无线技术,并负责原始数据的传输,即简单的0和1 bit,同时负责比特率的控制。

2、四层负载均衡

顾名思义,四层的概念指的是OSI模型的第四层传输层+第三层网络层,统称为四层负载均衡。如上图所示,当客户端发起网络请求时候,客户端与负载均衡器Load Balancer建立了TCP连接,然后负载均衡器再复用该相同的TCP连接去和后端的服务器建立连接。重点:TCP连接是复用的,没有再新创建。

上图可以看到,在第四层传输层增加了源和目的地的端口号;在第三层网络层增加了源和目的地的IP地址。当请求从客户端发起TCP连接到负载均衡器,再到后端目标服务器的过程中,负载均衡器使用NAT(Network address translation)的方式更改了每个数据包的源和目标IP。

上图前半段为客户端到负载均衡器的数据包,后半段为负载均衡器到后端服务器的数据包。在四层负载均衡的方式下,我们是不理解传输的数据,我们只能根据IP和端口号进行路由,而不能够通过请求数据的数据含义来做业务的路由决策。

curl -X GET http://apis.pay.com/v1/payments/${paymentId}
 -H 'Authorization:Basic fdklakglkadskl='

举个例子,比如假设我们要发起一下的网络请求,假设你希望如果http头里面Authorization为空,则返回401登录失败的能力,对于四层负载均衡就没法做了,因为你无法获取到请求数据的内容。

如果考虑到多路复用(multiplexing 指的是单个连接可以发送多个请求),或者连接保活(kept-alive 指的是在一段时间内不关闭连接),就会出现比较大的问题。如上图所示,当A通过负载均衡第一次路由连接到C之后,该链接就会一直建立保持;类似B连接到D,这样如果A-C的请求是50TPS,而B-D的请求只有1TPS,就会导致流量极度不平均,也违背了负载均衡的初衷。

所以总结下来,四层负载均衡有如下的限制:

  • 没法通过请求的数据内容来做到更加智能的负载平衡

  • 不适用于streaming/keep-alive的连接

  • 无TLS终止(TLS Termination)可查:5.术语详解

我们通常所熟知的LVS,就是做四层负载均衡的。

3、七层负载均衡

七层负载均衡,包括了OSI模型中的第5层(会话层),第6层(表示层),第7层(应用层),统称为七层。如上图,当客户端发起请求时,与负载均衡器建立一个TCP连接,然后负载均衡器在于上游的服务器再建立一个新的TCP连接,这个地方就和四层负载不一样了,四层负载此时是仅仅一个TCP连接。

因为我们在第七层,所以我们就可以理解网络请求中的数据,就能够相对于四层负载均衡做更多的事情:

  • 身份验证,当请求头中没有对应的身份信息数据则直接返回401

  • 智能路由,可以根据请求数据判断业务场景路由到不同的后端服务

  • TLS termination

七层负载均衡在多路复用(multiplexed)和连接保活(keep-alive)的情况下能够完成的更加完美。如上图,七层负载平衡器为单个客户端连接创建与每个上游的TCP连接,而不是选择单个上游。这意味着当A创建与负载平衡器的连接时,负载平衡器将创建两个连接,一个与C连接,另一个与D连接。

我们熟知的Nginx其实就可以做到七层负载均衡

4、最佳实践

针对一般比较大规模的服务器集群,为了应对大量的服务请求,基本采用LVS(四层)+Nginx(七层)的组合来实践落地。LVS基于四层负载均衡,由于仅仅做IP和端口的转发,工作效率会更高;而Nginx是基于七层的负载均衡,当单台Nginx无法承受访问压力时候,就需要配置Nginx集群,而LVS则顶在前面充当Nginx集群的调度者,由LVS将请求分流到某台Nginx,再由Nginx做数据层面的路由,并且将响应直接返回给到客户端,无须再经过LVS。如下图所示。

5、术语详解

TLS Termination

TLS Terminal的主要作用就在于客户端发起HTTPS的加密TLS流量,在网关处通过TLS termination将证书卸载,解密为HTTP明文,再将流量转发到内部的某个服务。这样TLS对所有内部服务都是透明的,无需对每个服务再去配置证书和私钥。

6、参考文献

《L4 vs L7 Load Balancing》

levelup.gitconnected.com/l4-vs-l7-lo…

《TLS termination and TLS Origination》

blog.csdn.net/zhongbeida_…

《What Is the OSI Model》

www.imperva.com/learn/appli…

《Forward proxy vs. reverse proxy: What's the difference?》

www.theserverside.com/feature/For…

《为什么要使用 LVS + Nginx?》

www.youtube.com/watch?v=4os…