`

服务器负载均衡的基本功能和实现原理

阅读更多

负载均衡设备作为纵跨网络2-7层协议的设备,往往放置在网络设备和应用设备的连接处,对工程师在网络和应用基本知识方面的要求远高于其他设备,所以我们要在基本功能的理解上下更多的功夫。负载均衡设备还有另外一个称呼:4/7层交换机,但它首先是个2-3层交换机,这要求我们首先掌握2-3层的基本知识,然后才是本文介绍的内容。

服务器负载均衡有三大基本Feature:负载均衡算法,健康检查和会话保持,这三个Feature是保证负载均衡正常工作的基本要素。其他一些功能都是在这三个功能之上的一些深化。下面我们具体介绍一下各个功能的作用和原理。

在没有部署负载均衡设备之前,用户直接访问服务器地址(中间或许有在防火墙上将服务器地址映射成别的地址,但本质上还是一对一的访问)。当单台服务器由于性能不足无法处理众多用户的访问时,就要考虑用多台服务器来提供服务,实现的方式就是负载均衡。负载均衡设备的实现原理是把多台服务器的地址映射成一个对外的服务IP(我们通常称之为VIP,关于服务器的映射可以直接将服务器IP映射成VIP地址,也可以将服务器IP:Port映射成VIP:Port,不同的映射方式会采取相应的健康检查,在端口映射时,服务器端口与VIP端口可以不相同),这个过程对用户端是透明的,用户实际上不知道服务器是做了负载均衡的,因为他们访问的还是一个目的IP,那么用户的访问到达负载均衡设备后,如何把用户的访问分发到合适的服务器就是负载均衡设备要做的工作了,具体来说用到的就是上述的三大Feature

我们来做一个详细的访问流程分析:

<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"/> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0"/> <v:f eqn="sum @0 1 0"/> <v:f eqn="sum 0 0 @1"/> <v:f eqn="prod @2 1 2"/> <v:f eqn="prod @3 21600 pixelWidth"/> <v:f eqn="prod @3 21600 pixelHeight"/> <v:f eqn="sum @0 0 1"/> <v:f eqn="prod @6 1 2"/> <v:f eqn="prod @7 21600 pixelWidth"/> <v:f eqn="sum @8 21600 0"/> <v:f eqn="prod @7 21600 pixelHeight"/> <v:f eqn="sum @10 21600 0"/> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/> <o:lock v:ext="edit" aspectratio="t"/> </v:shapetype><v:shape id="图片_x0020_1" o:spid="_x0000_i1033" type="#_x0000_t75" alt="http://img1.51cto.com/attachment/201107/181416330.png" href="http://img1.51cto.com/attachment/201107/181416330.png" target="&quot;_blank&quot;" style='width:474.75pt;height:357.75pt;visibility:visible;mso-wrap-style:square' o:button="t"> <v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image001.png" o:title="181416330"/> </v:shape><![endif]--><!--[if !vml]-->http://img1.51cto.com/attachment/201107/181416330.png<!--[endif]-->

用户(IP:207.17.117.20)访问域名www.a10networks.com,首先会通过DNS查询解析出这个域名的公网地址:199.237.202.124,接下来用户207.17.117.20会访问199.237.202.124这个地址,因此数据包会到达负载均衡设备,接下来负载均衡设备会把数据包分发到合适的服务器,看下图:

 

<!--[if gte vml 1]><v:shape id="图片_x0020_2" o:spid="_x0000_i1032" type="#_x0000_t75" alt="http://img1.51cto.com/attachment/201107/181501837.png" href="http://img1.51cto.com/attachment/201107/181501837.png" target="&quot;_blank&quot;" style='width:474pt;height:356.25pt;visibility:visible;mso-wrap-style:square' o:button="t"> <v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image003.png" o:title="181501837"/> </v:shape><![endif]--><!--[if !vml]-->http://img1.51cto.com/attachment/201107/181501837.png<!--[endif]-->

 

负载均衡设备在将数据包发给服务器时,数据包是做了一些变化的,如上图所示,数据包到达负载均衡设备之前,源地址是:207.17.117.20,目的地址是:199.237.202.124, 当负载均衡设备将数据包转发给选中的服务器时,源地址还是:207.17.117.20,目的地址变为172.16.20.1,我们称这种方式为目的地址NAT(DNAT)。一般来说,在服务器负载均衡中DNAT是一定要做的(还有另一种模式叫做服务器直接返回-DSR,是不做DNAT的,我们将另行讨论),而源地址根据部署模式的不同,有时候也需要转换成别的地址,我们称之为:源地址NAT(SNAT),一般来说,旁路模式需要做SNAT,而串接模式不需要,本示意图为串接模式,所以源地址没做NAT

我们再看服务器的返回包,如下图所示,也经过了IP地址的转换过程,不过应答包中源/目的地址与请求包正好对调,从服务器回来的包源地址为172.16.20.1,目的地址为207.17.117.20,到达负载均衡设备后,负载均衡设备将源地址改为199.237.202.124,然后转发给用户,保证了访问的一致性。

 

<!--[if gte vml 1]><v:shape id="图片_x0020_3" o:spid="_x0000_i1031" type="#_x0000_t75" alt="http://img1.51cto.com/attachment/201107/181543509.png" href="http://img1.51cto.com/attachment/201107/181543509.png" target="&quot;_blank&quot;" style='width:474pt;height:356.25pt;visibility:visible;mso-wrap-style:square' o:button="t"> <v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image005.png" o:title="181543509"/> </v:shape><![endif]--><!--[if !vml]-->http://img1.51cto.com/attachment/201107/181543509.png<!--[endif]-->

以上是单个数据包的处理流程。那么负载均衡设备是怎么选择服务器的呢? 这就是我们要介绍的第一个Feature:

负载均衡算法

一般来说负载均衡设备都会默认支持多种负载均衡分发策略,例如:

Ø  轮询(RoundRobin)将请求顺序循环地发到每个服务器。当其中某个服务器发生故障,AX就把其从顺序循环队列中拿出,不参加下一次的轮询,直到其恢复正常。

Ø  比率(Ratio):给每个服务器分配一个加权值为比例,根椐这个比例,把用户的请求分配到每个服务器。当其中某个服务器发生故障,AX就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。

Ø  优先权(Priority):给所有服务器分组,给每个组定义优先权,将用户的请求分配给优先级最高的服务器组(在同一组内,采用预先设定的轮询或比率算法,分配用户的请求);当最高优先级中所有服务器或者指定数量的服务器出现故障,AX将把请求送给次优先级的服务器组。这种方式,实际为用户提供一种热备份的方式。

Ø  最少连接数(LeastConnection):AX会记录当前每台服务器或者服务端口上的连接数,新的连接将传递给连接数最少的服务器。当其中某个服务器发生故障,AX就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。

Ø  最快响应时间(Fast Reponse time):新的连接传递给那些响应最快的服务器。当其中某个服务器发生故障,AX就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。

以上为通用的负载均衡算法,还有一些算法根据不同的需求也可能会用到,例如:

Ø  哈希算法( hash):  将客户端的源地址,端口进行哈希运算,根据运算的结果转发给一台服务器进行处理,当其中某个服务器发生故障,就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。

Ø  基于策略的负载均衡:针对不同的数据流设置导向规则,用户可自行编辑流量分配策略,利用这些策略对通过的数据流实施导向控制。

Ø  基于数据包的内容分发:例如判断HTTPURL,如果URL中带有.jpg的扩展名,就把数据包转发到指定的服务器。

 

继续看图分析,第二个用户207.17.117.21也访问www.a10networks.com,负载均衡设备根据负载均衡算法将第二个用户的请求转发到第二台服务器来处理。

 

<!--[if gte vml 1]><v:shape id="图片_x0020_4" o:spid="_x0000_i1030" type="#_x0000_t75" alt="http://img1.51cto.com/attachment/201107/181700753.png" href="http://img1.51cto.com/attachment/201107/181700753.png" target="&quot;_blank&quot;" style='width:474pt;height:356.25pt;visibility:visible;mso-wrap-style:square' o:button="t"> <v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image007.png" o:title="181700753"/> </v:shape><![endif]--><!--[if !vml]-->http://img1.51cto.com/attachment/201107/181700753.png<!--[endif]-->

 

<!--[if gte vml 1]><v:shape id="图片_x0020_5" o:spid="_x0000_i1029" type="#_x0000_t75" alt="http://img1.51cto.com/attachment/201107/182329890.png" href="http://img1.51cto.com/attachment/201107/182329890.png" target="&quot;_blank&quot;" style='width:474.75pt;height:357pt;visibility:visible;mso-wrap-style:square' o:button="t"> <v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image009.png" o:title="182329890"/> </v:shape><![endif]--><!--[if !vml]-->http://img1.51cto.com/attachment/201107/182329890.png<!--[endif]-->

假设在工作过程中,突然有一台服务器出现问题怎么办? 这就涉及到我们要介绍的第二个Feature:

健康检查

健康检查用于检查服务器开放的各种服务的可用状态。负载均衡设备一般会配置各种健康检查方法,例如PingTCPUDPHTTPFTPDNS等。Ping属于第三层的健康检查,用于检查服务器IP的连通性,而TCP/UDP属于第四层的健康检查,用于检查服务端口的UP/DOWN,如果要检查的更准确,就要用到基于7层的健康检查,例如创建一个HTTP健康检查,Get一个页面回来,并且检查页面内容是否包含一个指定的字符串,如果包含,则服务是UP的,如果不包含或者取不回页面,就认为该服务器的Web服务是不可用(DOWN)的。如下图所示,负载均衡设备检查到172.16.20.3这台服务器的80端口是DOWN的,负载均衡设备将不把后面的连接转发到这台服务器,而是根据算法将数据包转发到别的服务器。创建健康检查时可以设定检查的间隔时间和尝试次数,例如设定间隔时间为5秒,尝试次数为3,那么负载均衡设备每隔5秒发起一次健康检查,如果检查失败,则尝试3次,如果3次都检查失败,则把该服务标记为DOWN,然后服务器仍然会每隔5秒对DOWN的服务器进行检查,当某个时刻发现该服务器健康检查又成功了,则把该服务器重新标记为UP。健康检查的间隔时间和尝试次数要根据综合情况来设置,原则是既不会对业务产生影响,又不会对负载均衡设备造成较大负担。

 

<!--[if gte vml 1]><v:shape id="图片_x0020_6" o:spid="_x0000_i1028" type="#_x0000_t75" alt="http://img1.51cto.com/attachment/201107/181758934.png" href="http://img1.51cto.com/attachment/201107/181758934.png" target="&quot;_blank&quot;" style='width:474pt;height:357.75pt;visibility:visible;mso-wrap-style:square' o:button="t"> <v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image011.png" o:title="181758934"/> </v:shape><![endif]--><!--[if !vml]-->http://img1.51cto.com/attachment/201107/181758934.png<!--[endif]-->

 

 

<!--[if gte vml 1]><v:shape id="图片_x0020_7" o:spid="_x0000_i1027" type="#_x0000_t75" alt="http://img1.51cto.com/attachment/201107/181958387.png" href="http://img1.51cto.com/attachment/201107/181958387.png" target="&quot;_blank&quot;" style='width:474pt;height:357.75pt;visibility:visible;mso-wrap-style:square' o:button="t"> <v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image013.png" o:title="181958387"/> </v:shape><![endif]--><!--[if !vml]-->http://img1.51cto.com/attachment/201107/181958387.png<!--[endif]-->

 

假设是同一个用户继续访问,后续的连接会怎么处理呢? 看下图:

 

 

<!--[if gte vml 1]><v:shape id="图片_x0020_8" o:spid="_x0000_i1026" type="#_x0000_t75" alt="http://img1.51cto.com/attachment/201107/093104353.png" href="http://img1.51cto.com/attachment/201107/093104353.png" target="&quot;_blank&quot;" style='width:487.5pt;height:366.75pt;visibility:visible;mso-wrap-style:square' o:button="t"> <v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image015.png" o:title="093104353"/> </v:shape><![endif]--><!--[if !vml]-->http://img1.51cto.com/attachment/201107/093104353.png<!--[endif]-->

 

<!--[if gte vml 1]><v:shape id="图片_x0020_9" o:spid="_x0000_i1025" type="#_x0000_t75" alt="http://img1.51cto.com/attachment/201107/093143173.png" href="http://img1.51cto.com/attachment/201107/093143173.png" target="&quot;_blank&quot;" style='width:487.5pt;height:366pt;visibility:visible;mso-wrap-style:square' o:button="t"> <v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image017.png" o:title="093143173"/> </v:shape><![endif]--><!--[if !vml]-->http://img1.51cto.com/attachment/201107/093143173.png<!--[endif]-->

 

用户207.17.117.25之前发起的第一个连接是207.17.117.254003-199.237.202.127:80,负载均衡设备将该连接转发到了172.16.20.4,接着发起第二个连接207.17.117.254004-199.237.202.127:80,我们看到该连接还是转发到了服务器172.16.20.4,为什么呢?因为负载均衡设备配置了会话保持。

会话保持

会话保持用于保持会话的连续性和一致性,由于服务器之间很难做到实时同步用户访问信息,这就要求把用户的前后访问会话保持到一台服务器上来处理。举个例子,用户访问一个电子商务网站,如果用户登录时是由第一台服务器来处理的,但用户购买商品的动作却由第二台服务器来处理,第二台服务器由于不知道用户信息,所以本次购买就不会成功。这种情况就需要会话保持,把用户的操作都通过第一台服务器来处理才能成功。当然并不是所有的访问都需要会话保持,例如服务器提供的是静态页面比如网站的新闻频道,各台服务器都有相同的内容,这种访问就不需要会话保持。

负载均衡设备一般会默认配置一些会话保持的选项,例如源地址的会话保持,Cookie会话保持等,基于不同的应用要配置不同的会话保持,否则会引起负载的不均衡甚至访问异常。具体可参考本人的另一篇拙作:《不同应用环境下会话保持方式的选择》。

本文介绍了负载均衡的基本功能和实现原理,看起来并不难,但负载均衡涉及的知识其实非常的广泛,根据各个用户系统的不同,我们要熟悉不同的协议和应用流程,甚至涉及到某些开发语言和软件平台,否则在出现故障的时候,我们可能没有能力做出有效的判断,从这个意义上来说,一个负载均衡设备的工程师要掌握网络,应用和系统等各方面的知识,这些都要当作基础来积累。

wyl.

 

本文出自 “ADC技术博客” 博客,请务必保留此出处http://virtualadc.blog.51cto.com/3027116/615836

 

 

分享到:
评论

相关推荐

    服务器负载均衡是什么意思(服务器负载均衡的基本功能和实现原理)

    服务器负载均衡是一种网络技术,用于在多台服务器之间有效地分散网络流量,以确保单一服务器不会过载,从而提高整体服务的稳定性和可用性。这种技术尤其适用于高流量的网站、在线服务和企业应用,能够保证即使在高峰...

    服务器负载均衡F5基本功能配置介绍

    【服务器负载均衡F5基本功能配置介绍】 在IT行业中,服务器负载均衡是一项至关重要的技术,它能够有效地分发网络流量,提高系统可用性,确保服务的连续性和高性能。F5 Networks是全球领先的负载均衡解决方案提供商...

    F5服务器负载均衡基本原理2

    ### F5服务器负载均衡基本原理深入解析 #### 一、服务器负载平衡的市场需求与背景 在互联网技术迅猛发展的背景下,尤其是随着电子商务、电子政务等领域的不断扩张,对网络服务的需求日益高涨,这不仅体现在访问量...

    服务器负载均衡解决方案

    下面将详细阐述服务器负载均衡的基本原理、类型、实现方式以及它在实际应用中的重要作用。 一、负载均衡基本原理 负载均衡的主要目标是通过将工作负载分散到多个服务器上,避免单一服务器过载,确保服务的稳定性和...

    负载均衡软件、硬件实现方案

    ### 负载均衡原理与实现方案 #### 一、负载均衡原理 负载均衡是一种用于在网络中分散工作负载的技术,其主要目的是优化资源利用、提高响应速度和避免单点故障。负载均衡通常应用于多服务器环境,通过对服务器之间...

    nginx负载均衡实现

    #### 二、负载均衡基本原理 负载均衡的基本思想是通过多台服务器协同工作,共同完成对外的服务。这种架构下,每台服务器都具有相同的地位和功能,都能够独立地处理来自客户端的请求。负载均衡器负责将外部的请求...

    负载均衡讲解,讲解负载均衡的基本原理

    通过深入理解负载均衡的基本原理、实现方式和各种算法,开发者可以设计出更高效、更可靠的分布式系统,以应对互联网时代的高并发挑战。无论是硬件还是软件解决方案,负载均衡都是构建大型、高可用性服务不可或缺的一...

    服务器负载均衡技术:使用apache部署集群实现负载均衡

    服务器负载均衡技术是网络服务中的重要概念,它旨在通过分散网络流量到多个服务器,从而提高系统的可用性和响应速度,防止单点故障。Apache作为一款广泛应用的开源Web服务器,可以通过一些扩展实现负载均衡功能,...

    web集群服务的负载均衡方案选择与实现

    - **基本概念**:RR-DNS是通过DNS服务器轮流返回多个IP地址来实现负载均衡的。当客户端向DNS服务器查询某个域名时,DNS服务器会从多个IP地址中轮流选择一个返回给客户端,使得客户端请求能够均匀地分配到不同的...

    深信服负载均衡AD5.3用户手册

    - **DNS负载均衡原理**: 通过DNS服务器返回多个IP地址的方式实现负载均衡。 - **DNS负载均衡策略**: 配置DNS负载均衡的具体策略。 **7.2 DNS解析策略** - **DNS解析策略配置**: 设置DNS解析的具体策略,如轮询、...

    spring-cloud-discoveryClient技术实现负载均衡操作(负载原理).zip

    通过理解负载均衡的原理和Spring Cloud的相关组件,我们可以构建更健壮、高效的分布式系统。在实际开发中,还需要根据业务需求和服务器性能调整负载均衡策略,以达到最佳的系统性能和用户体验。

    服务器均衡负载的开源代码

    它实现了基本的负载均衡算法,如轮询(round-robin)和最少连接(least connections),帮助分发请求到不同的服务器节点。 负载均衡器的核心功能包括: 1. **流量分配**:根据预设的策略,如轮询、最少连接、IP...

    java 简易负载均衡例子

    在Java编程领域,负载均衡是一种重要的技术,用于在多个服务器之间分发工作负载,以优化资源...通过深入研究源代码和相关文件,我们可以更好地理解Java NIO的工作原理,以及如何设计和实现一个基本的负载均衡解决方案。

    nginx1.8 负载均衡

    一、Nginx 负载均衡的基本原理 Nginx 作为前端服务器,接收来自客户端的请求,然后根据预设的策略将这些请求分发到后端的一组服务器上。这种机制可以确保多个服务器共同处理工作负载,提高整体性能,同时确保即使...

    负载均衡 jumpserver-master.zip

    下面将详细讨论负载均衡的基本概念、工作原理以及JumpServer如何实现负载均衡。 负载均衡是一种网络架构策略,它通过分散网络流量到多个服务器,防止单一服务器过载,从而提高服务的响应速度和系统的可用性。在软件...

    负载均衡解决方案

    ### 负载均衡解决方案——F5 BIG-IP V9...通过采用F5 BIG-IP V9应用交换机实现服务器负载均衡,不仅可以提高系统的可靠性和性能,还能有效降低成本,增强网络和应用的安全性,从而为企业带来更高的业务适应性和竞争力。

    fuzaijunhen.rar_负载_负载均衡_负载均衡 C

    《负载均衡技术详解——以C语言实现为例》 ...掌握负载均衡的原理和实现方法,对于IT从业者来说,是提升系统架构能力的重要一步。在C语言环境下实现负载均衡,既锻炼了底层编程能力,又加深了对负载均衡技术的理解。

    oracle WEB服务负载均衡

    #### 二、负载均衡的基本原理 负载均衡技术的核心目的是通过分配来自客户端的流量至多个后端服务器,从而提高系统的可用性和响应速度。这一过程通常由专门的负载均衡器来完成,它可以是硬件设备也可以是软件程序。...

Global site tag (gtag.js) - Google Analytics