若是想了解web 6大负载均衡算法,参考:六大Web负载均衡原理与实现html
主要是三点:负载均衡算法,健康检查和会话保持java
1:首先,咱们要了解,咱们的应用程序,好比java web程序,里面配置了10个zookeeper服务器的地址?那么用户经过网页访问咱们的程序,具体是访问到了哪个zookeeper服务器上呢?web
固然zookeeper尚未这么简单,zookeeper集群还要保证用户链接的某一个zookeeper服务器的数据是最新的,因此里面还有一个选举算法,而后将最新状态的服务器暴露给Java web程序访问。 算法
负载均衡设备做为纵跨网络2-7层协议的设备,每每放置在网络设备和应用设备的链接处,对工程师在网络和应用基本知识方面的要求远高于其余设备,因此咱们要在基本功能的理解上下更多的功夫。负载均衡设备还有另一个称呼:4/7层交换机,但它首先是个2-3层交换机,这要求咱们首先掌握2-3层的基本知识,而后才是本文介绍的内容。服务器
服务器负载均衡有三大基本Feature:负载均衡算法,健康检查和会话保持,这三个Feature是保证负载均衡正常工做的基本要素。其余一些功能都是在这三个功能之上的一些深化。下面咱们具体介绍一下各个功能的做用和原理。网络
在没有部署负载均衡设备以前,用户直接访问服务器地址(中间或许有在防火墙上将服务器地址映射成别的地址,但本质上仍是一对一的访问)。当单台服务器因为性能不足没法处理众多用户的访问时,就要考虑用多台服务器来提供服务,实现的方式就是负载均衡。负载均衡设备的实现原理是把多台服务器的地址映射成一个对外的服务IP(咱们一般称之为VIP,关于服务器的映射能够直接将服务器IP映射成VIP地址,也能够将服务器IP:Port映射成VIP:Port,不一样的映射方式会采起相应的健康检查,在端口映射时,服务器端口与VIP端口能够不相同),这个过程对用户端是透明的,用户实际上不知道服务器是作了负载均衡的,由于他们访问的仍是一个目的IP,那么用户的访问到达负载均衡设备后,如何把用户的访问分发到合适的服务器就是负载均衡设备要作的工做了,具体来讲用到的就是上述的三大Feature。负载均衡
咱们来作一个详细的访问流程分析:post
用户(IP:207.17.117.20)访问域名www.a10networks.com,首先会经过DNS查询解析出这个域名的公网地址:199.237.202.124,接下来用户207.17.117.20会访问199.237.202.124这个地址,所以数据包会到达负载均衡设备,接下来负载均衡设备会把数据包分发到合适的服务器,看下图:性能
负载均衡设备在将数据包发给服务器时,数据包是作了一些变化的,如上图所示,数据包到达负载均衡设备以前,源地址是: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,而后转发给用户,保证了访问的一致性。
以上是单个数据包的处理流程。那么负载均衡设备是怎么选择服务器的呢? 这就是咱们要介绍的第一个Feature:
负载均衡算法
(跟Dubbo的负载均衡算法相似,能够参考:Dubbo学习(二) Dubbo 集群容错模式-负载均衡模式)
通常来讲负载均衡设备都会默认支持多种负载均衡分发策略,例如:
Ø 轮询(RoundRobin)将请求顺序循环地发到每一个服务器。当其中某个服务器发生故障,AX就把其从顺序循环队列中拿出,不参加下一次的轮询,直到其恢复正常。
Ø 比率(Ratio):给每一个服务器分配一个加权值为比例,根椐这个比例,把用户的请求分配到每一个服务器。当其中某个服务器发生故障,AX就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。
Ø 优先权(Priority):给全部服务器分组,给每一个组定义优先权,将用户的请求分配给优先级最高的服务器组(在同一组内,采用预先设定的轮询或比率算法,分配用户的请求);当最高优先级中全部服务器或者指定数量的服务器出现故障,AX将把请求送给次优先级的服务器组。这种方式,实际为用户提供一种热备份的方式。
Ø 最少链接数(LeastConnection):AX会记录当前每台服务器或者服务端口上的链接数,新的链接将传递给链接数最少的服务器。当其中某个服务器发生故障,AX就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。
Ø 最快响应时间(Fast Reponse time):新的链接传递给那些响应最快的服务器。当其中某个服务器发生故障,AX就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。
以上为通用的负载均衡算法,还有一些算法根据不一样的需求也可能会用到,例如:
Ø 哈希算法( hash): 将客户端的源地址,端口进行哈希运算,根据运算的结果转发给一台服务器进行处理,当其中某个服务器发生故障,就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。
Ø 基于策略的负载均衡:针对不一样的数据流设置导向规则,用户可自行编辑流量分配策略,利用这些策略对经过的数据流实施导向控制。
Ø 基于数据包的内容分发:例如判断HTTP的URL,若是URL中带有.jpg的扩展名,就把数据包转发到指定的服务器。
继续看图分析,第二个用户207.17.117.21也访问www.a10networks.com,负载均衡设备根据负载均衡算法将第二个用户的请求转发到第二台服务器来处理。
假设在工做过程当中,忽然有一台服务器出现问题怎么办? 这就涉及到咱们要介绍的第二个Feature:
健康检查
健康检查用于检查服务器开放的各类服务的可用状态。负载均衡设备通常会配置各类健康检查方法,例如Ping,TCP,UDP,HTTP,FTP,DNS等。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。健康检查的间隔时间和尝试次数要根据综合状况来设置,原则是既不会对业务产生影响,又不会对负载均衡设备形成较大负担。
假设是同一个用户继续访问,后续的链接会怎么处理呢? 看下图:
用户207.17.117.25以前发起的第一个链接是207.17.117.25:4003-〉199.237.202.127:80,负载均衡设备将该链接转发到了172.16.20.4,接着发起第二个链接207.17.117.25:4004-〉199.237.202.127:80,咱们看到该链接仍是转发到了服务器172.16.20.4,为何呢?由于负载均衡设备配置了会话保持。
会话保持
会话保持用于保持会话的连续性和一致性,因为服务器之间很难作到实时同步用户访问信息,这就要求把用户的先后访问会话保持到一台服务器上来处理。举个例子,用户访问一个电子商务网站,若是用户登陆时是由第一台服务器来处理的,但用户购买商品的动做却由第二台服务器来处理,第二台服务器因为不知道用户信息,因此本次购买就不会成功。这种状况就须要会话保持,把用户的操做都经过第一台服务器来处理才能成功。固然并非全部的访问都须要会话保持,例如服务器提供的是静态页面好比网站的新闻频道,各台服务器都有相同的内容,这种访问就不须要会话保持。
负载均衡设备通常会默认配置一些会话保持的选项,例如源地址的会话保持,Cookie会话保持等,基于不一样的应用要配置不一样的会话保持,不然会引发负载的不均衡甚至访问异常。具体可参考本人的另外一篇拙做:《不一样应用环境下会话保持方式的选择》。
本文介绍了负载均衡的基本功能和实现原理,看起来并不难,但负载均衡涉及的知识其实很是的普遍,根据各个用户系统的不一样,咱们要熟悉不一样的协议和应用流程,甚至涉及到某些开发语言和软件平台,不然在出现故障的时候,咱们可能没有能力作出有效的判断,从这个意义上来讲,一个负载均衡设备的工程师要掌握网络,应用和系统等各方面的知识,这些都要看成基础来积累。