`

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

阅读更多

负载均衡设备作为纵跨网络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

 

 

分享到:
评论

相关推荐

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

    主要介绍了服务器负载均衡是什么意思,服务器负载均衡的基本功能和实现原理,需要的朋友可以参考下

    LVS集群系统网络核心原理分析(系统管理) .doc

    摘要本文主要介绍了LVS系统采用2.4内核的NetFilter的功能实现负载均衡的基本原理和技术手段 主要介绍了3个比较重要的NetFilter钩子函数,最后描述了LVS的平衡算法 (2002 07 3***:30:20)By iamafanInternet的快速增长...

    c语言c++项目源代码_C语言http代理服务器的实现(程序).rar

    此外,项目还提供了丰富的API接口,方便您添加新的功能模块,如缓存、负载均衡和安全性增强等。 利用这个源代码,您可以快速搭建一个高性能的HTTP代理服务器,为您的网络应用或数据分析提供强大的支持。同时,它也...

    Nginx开发从入门到精通

    从最初作为一个简单的HTTP服务器诞生,到现在成为一个强大且功能丰富的反向代理服务器、负载均衡器和HTTP缓存器,Nginx在整个Web服务领域扮演着越来越重要的角色。掌握Nginx不仅能够提高Web应用程序的性能和可靠性,还...

    Nginx技术的学习 加油

    负载均衡: 探讨Nginx如何实现负载均衡,分担流量以确保系统的高可用性和稳定性。 安全性配置: 提供有关如何通过Nginx配置加密、访问控制和其他安全性特性的信息。 性能优化: 分析如何优化Nginx服务器性能,包括...

    集群好书《高性能Linux服务器构建实战》 试读章节下载

    14.2 heartbeat + DRBD高可用性方案的实现原理 14.3 部署MySQL高可用高扩展集群 14.3.1 配置之前的准备 14.3.2 DRBD的部署 14.3.3 DRBD的配置 14.3.4 DRBD的维护和管理 14.3.5 DRBD的性能优化 14.3.6...

    基于Vue+SpringCloud博客的设计与实现 有论文

    博客采用了高可用Eureka(可以替换成其他微服务组件)以及高可用Zuul,使用以Es搜索引擎作为Zpkin的存储方式去跟踪定位博客的微服务的Api指标,微服务之间负载均衡使用Feign接口,整个项目均写了回退不会发生级联...

    Nginx配置入门教程

    这么做当然不是为了实现翻越长城,而是为了实现安全和负载均衡等一系列的功能。所谓安全指客户端的请求不会直接落到内网的服务器上而是通过代理做了一层转发,在这一层就可以实现安全过滤,流控,防 DDOS 等一系列...

    《Java-web程序设计》教案.doc

    从只有一个小的Jar文件就可以运行Servlet/JSP,到由多台服务器 进行集群和负载均衡,到多台Application进行事务处理,消息处理,一台服务器到无数 台服务器,Java显示了一个巨大的生命力。 多样化和功能强大的开发...

    php网络开发完全手册

    目录 ...1.1.4 相关资源及自学提示 4 ...1.2.4 其他案例 6 ...1.5 几种综合网络服务器系统的安装 14 ...2.1 语言构成与工作原理 24 ...2.3 运算符和关键字 29 ...2.7.1 使用require和require_once语句 ...18.2.1 查看留言功能...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    负载均衡 152 【网络】说说你对Http协议和Socket协议的理解 153 http协议 153 Tcp协议 154 【网络】HTTPS的工作原理说明HTTPS是安全的 155 【消息队列】为什么要使用消息队列 156 【消息队列】ActiveMQ服务器宕机...

    asp.net知识库

    利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的内容是否合法 asp.net报表解决方法 SQLDMO类的使用 SQL过程自动C#封装,支持从表到基本存储过程生成 使用SQLDMO控制 SQL Server 使用SQL...

    网络架构师148讲视频课程

    │ 第04节:Git基本原理和安装配置使用.avi │ 第05节:TortoiseGit的本地使用.avi │ 第06节:Egit的本地使用.avi │ 第07节:远程使用以及冲突解决.avi │ 第08节:基本业务功能和数据字典.avi │ 第09节:搭建...

    源自新浪的TCP性能分析工具Tcpdive.zip

     目前Tcpdive已经部署到作为流量入口的负载均衡服务器上,在新浪的线上环境7*24h运行,可以说是比较稳定的。 Tcpdive的主要功能 作为一个TCP协议的性能评测工具,Tcpdive提供了大量的性能指标,从以下维度来对每...

    Eclipse开发分布式商城系统+完整视频代码及文档

    │ 04.nginx的反向代理及负载均衡.avi │ 05.FastDFS介绍.avi │ 06.FastDFS安装步骤-文件上传.avi │ 07.配置nginx插件访问图片.avi │ 08.测试图片上传.avi │ 09.FastDFS工具类的使用.avi │ 10.图片上传过程分析...

    网络工程师考试考点分析与真题详解.网络设计与管理篇.part2

    193 7.12.1 负载均衡概念 193 7.12.2 传输链路聚合 194 7.12.3 带均衡策略的服务器集群 194 7.12.4 高层交换 194 7.12.5 Web内容智能交换技术 194 7.13 电子身份认证 196 7.13.1 电子身份认证 ...

    网络工程师考试考点分析与真题详解.网络设计与管理篇.part7

    193 7.12.1 负载均衡概念 193 7.12.2 传输链路聚合 194 7.12.3 带均衡策略的服务器集群 194 7.12.4 高层交换 194 7.12.5 Web内容智能交换技术 194 7.13 电子身份认证 196 7.13.1 电子身份认证 ...

    网络工程师考试考点分析与真题详解.网络设计与管理篇

    193 7.12.1 负载均衡概念 193 7.12.2 传输链路聚合 194 7.12.3 带均衡策略的服务器集群 194 7.12.4 高层交换 194 7.12.5 Web内容智能交换技术 194 7.13 电子身份认证 196 7.13.1 电子身份认证 ...

Global site tag (gtag.js) - Google Analytics