作者:小洋,燕洋天

一般而言,负载均衡在服务器和网络之前起到一个中间桥梁的作用  

正如之前所说的,负载均衡大体包含以下几类:

服务器负载均衡

全球服务器负载均衡

防火墙负载均衡

 

其中,服务器负载均衡主要是讲负载请求分散到后端的每个服务器上,克服一台服务器引发的问题,从而达到可伸缩性和容错性。

全球服务器负载均衡主要是将全球不同地区的用户的请求转发到各对应地区的服务器处理中心,从而为用户提供更快的响应,同时,也可以起到很好的容错性:一个地区的服务器全部挂了也没用问题,因为其他的地区还有服务器,并且还可以从总的数据中心将数据恢复。

防火墙出现的目的主要是安全,同时为了避免防火墙成为站点的性能瓶颈,采用多个防火墙来达到负载均衡,

下面,我们来看看一些负载均衡产品。

负载均衡的产品,基本可以分为三大类:软件,硬件,交换器!

软件负载均衡:这个产品通过直接一些算法来协调请求。例如采用服务器权重算法,服务器亲缘行算法,服务器资源使用状态等等。

硬件负载均衡:很多时候,就是几大厂商生产的一些设备,包括硬件和特定的软件,这个设备对于我们来说,就是一个黑盒,我们只要按照说明使用就行了。

 

到这里,也谈了不少,但是一直没有谈到朋友们真正关心的东西!下面,我们就逐步进入吧。

首先,非常非常有必要普及一些知识:网络地址转换,TCP请求流程,服务器请求处理流程。

 

网络地址转换

在这里,会简要的介绍OSI模型中的第2层和第3层的一些数据转发功能是如何在负载均衡中发挥作用的。

 

首先,我们知道一个MAC地址为硬件在整个网络中提供了唯一的标识。同时,一个IP地址也唯一的标识了一个主机。

       在交换器中,如果一个端口负责接收数据报,那么这个端口就称之为“入口”,同理,如果一个端口负责发送数据报,那么这个端口就是“出口” 。当交换器把数据报接到了之后,就由它来决定将数据报发往那个出口,这个时候,在发送之前,交换器还会修改这个数据报中的一些信息。

 

好,基础的铺垫做完了,一些概念也讲了。下面我们将之串起来:

 

        当第2层交换器收到一个数据包,交换器基于第2层的数据包头信息(如MAC地址)决定下一个目的地,并转发数据包给第3层。同理,第3层交换器查看数据报的头信息(如,IP地址),通过改变数据报中的目的地的MAC地址,从而决定将数据报发送到下一个地方。第3层的交换器也被称之为“路由器”,第3层交换器所做的工作就称之为“路由”。

   

         负载均衡处在第4层,或者第5层,第6层,第7层,通过查看发给这些层的数据报的信息来决定请求的转发。 

 

TCP请求流程

为了后续文章可以更好的看懂,这里我们来讲讲TCP的请求与处理的流程,

        首先,如何客户端想要和服务端进行数据交换,客户端会先发送一个SYN的数据报给服务端。在这个SYN数据报中比较重要的信息就是:请求源的IP地址(请求源就是指的发出请求的一方,这个时候,是我们客户端发送请求的),请求源的端口号,目标IP地址(指的就是被请求一方的IP地址,这个时候就是服务器),还有目标的端口号。

同时,在SYN数据报中还含有一个表示顺序的数字,每次有新的数据报从客户端发送到服务端的时候的,这个数字就会递增。

当服务端接受到了SYN数据报之后,它就发送一个SYN ACK的应答给客户端,这个SYN ACK应答包含了服务端的一个表示顺序的数字。

       客户端接收到了应答之后,就会回发一个ACK应答给服务端,这个时候,一个连接就建立起来了。之后客户端和服务器之间就通过这个连接通道开始数据的交换。

 

        每一个建立起来的TCP连接可以用四个值来唯一的标识:源IP地址,源端口号,目标IP地址,目标端口号。而且,当连接建立好了之后,每一个在TCP连接传递的数据报都包含这四个信息。另外需要特别注意的就是:“源”与“目标”的角色在客户端与服务端之间不断的转变。即,如果数据报是从客户端发送到服务端的,那么客户端就是“源”,服务端就是“目标”;反之,如果数据报从服务端发送给客户端,那么服务端就是“源”,客户端就是“目标”。一切都是以数据报的流出流入为参考。总结一句话就是:“源”就是数据流出的端,“目标”,就是数据报要被发往的端。理解这一点是理解负载均衡的关键之一。

 

       当客户端和服务端数据交换完成之后,客户端就发送一个FIN数据报,之后服务端返回一个FIN ACK的应答,这个时候,TCP连接就被销毁了。

 

服务器请求处理流程

我们这里主要是请求一个网页的具体的流程来分析一下。

注:到现在为止可以看出:技术做的越深,需要掌握的东西越多。做一个应用,不再是拖拖控件,搞大量的增删改查就OK了的。需要考虑和深度掌握的东西太多了。

 

       假设用户打开浏览器,输入了:www.agilesharp.com在地址栏中,当用户点击Enter之后,我们就看到了站点的页面就显示在我们的眼前。其实在这过程中,背后做了很多的操作。我们就来看看。

 

        首先,当用户点击Enter之后,浏览器首先就将www.agilesharp.com这个域名解析为IP地址。在解析的过程中,浏览器首先会去检查本地的DNS服务器。本地的DNS服务器就会使用相关的协议和方法去获取这个域名的IP地址,然后返回给浏览器。如果在本地的DNS服务器中没有找到这个域名的IP地址,那么,这个时候,就要去远程的DNS服务器上去查找(在性能调优的时候,这也是一个考虑点)。一旦找到了IP地址之后,这个时候,浏览器就会采用我们之前讲说的三次握手,建立一个TCP连接。

 

        连接建立好了之后,浏览器就会发送Http请求给服务端去请求www.agilesharp.com的页面。

服务端接受请求之后,就开始处理请求,然后将响应发送回来,

 

注意,这个响应分为两个部分:一个头信息,一个是页面的内容。它们之间使用一个换行来隔开的。

 

        服务端把响应发送回来之后,浏览器就接受响应。这个时候,浏览器加载页面的Html结构,之后,就按照从上到下的顺序开始解析并且呈现页面,如果需要去请求资源,例如js,css,图片等,浏览器会先从缓存中查找,如果没有,就再次根据资源的地址,进行域名解析,发送请求,获取数据,一直到整个页面全部解析完毕!这其中的详细步骤,我这里就不罗嗦了,因为重心不在这里!