一篇读懂分布式架构下的负载均衡

微信公众号:IT一刻钟, 大型现实非严肃主义现场, 一刻钟与你分享优质技术架构与见闻,作一个有剧情的程序员。程序员

什么是负载均衡?

百度词条里的解释是:负载均衡,英文叫Load Balance,意思就是将请求或者数据分摊到多个操做单元上进行执行,共同完成工做任务。 它的目的就经过调度集群,达到最佳化资源使用,最大化吞吐率,最小化响应时间,避免单点过载的问题。算法

负载均衡分类

负载均衡能够根据网络协议的层数进行分类,咱们这里以ISO模型为准,从下到上分为: 物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。 当客户端发起请求,会通过层层的封装,发给服务器,服务器收到请求后通过层层的解析,获取到对应的内容。后端

二层负载均衡

二层负债均衡是基于数据链路层的负债均衡,即让负债均衡服务器和业务服务器绑定同一个虚拟IP(即VIP),客户端直接经过这个VIP进行请求,那么如何区分相同IP下的不一样机器呢?没错,经过MAC物理地址,每台机器的MAC物理地址都不同,当负载均衡服务器接收到请求以后,经过改写HTTP报文中以太网首部的MAC地址,按照某种算法将请求转发到目标机器上,实现负载均衡。 这种方式负载方式虽然控制粒度比较粗,可是优势是负载均衡服务器的压力会比较小,负载均衡服务器只负责请求的进入,不负责请求的响应(响应是有后端业务服务器直接响应给客户端),吞吐量会比较高。缓存

三层负载均衡

三层负载均衡是基于网络层的负载均衡,通俗的说就是按照不一样机器不一样IP地址进行转发请求到不一样的机器上。 这种方式虽然比二层负载多了一层,但从控制的颗粒度上看,并无比二层负载均衡更有优点,而且,因为请求的进出都要通过负载均衡服务器,会对其形成比较大的压力,性能也比二层负载均衡要差。服务器

四层负载均衡

四层负载均衡是基于传输层的负载均衡,传输层的表明协议就是TCP/UDP协议,除了包含IP以外,还有区分了端口号,通俗的说就是基于IP+端口号进行请求的转发。相对于上面两种,控制力度缩小到了端口,能够针对同一机器上的不用服务进行负载。 这一层以LVS为表明。微信

七层负载均衡

七层负载均衡是基于应用层的负载均衡,应用层的表明协议有HTTP,DNS等,能够根据请求的url进行转发负载,比起四层负载,会更加的灵活,所控制到的粒度也是最细的,使得整个网络更"智能化"。例如访问一个网站的用户流量,能够经过七层的方式,将对图片类的请求转发到特定的图片服务器并可使用缓存技术;将对文字类的请求能够转发到特定的文字服务器并可使用压缩技术。能够说功能是很是强大的负载。网络

这一层以Nginx为表明。架构

在普通的应用架构中,使用Nginx彻底能够知足需求,对于一些大型应用,通常会采用DNS+LVS+Nginx的方式进行多层次负债均衡,以上这些说明都是基于软件层面的负载均衡,在一些超大型的应用中,还会在前面多加一层物理负载均衡,好比知名的F5。负载均衡

负载均衡算法

负载均衡算法分为两类: 一种是静态负载均衡,一种是动态负载均衡。函数

静态均衡算法:

一、轮询法

将请求按顺序轮流地分配到每一个节点上,不关心每一个节点实际的链接数和当前的系统负载。 优势:简单高效,易于水平扩展,每一个节点知足字面意义上的均衡 缺点:没有考虑机器的性能问题,根据木桶最短木板理论,集群性能瓶颈更多的会受性能差的服务器影响。 

二、随机法

将请求随机分配到各个节点。由几率统计理论得知,随着客户端调用服务端的次数增多,其实际效果愈来愈接近于平均分配,也就是轮询的结果。 优缺点和轮询类似。

三、源地址哈希法

源地址哈希的思想是根据客户端的IP地址,经过哈希函数计算获得一个数值,用该数值对服务器节点数进行取模,获得的结果即是要访问节点序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会落到到同一台服务器进行访问。 优势:相同的IP每次落在同一个节点,能够人为干预客户端请求方向,例如灰度发布 缺点:若是某个节点出现故障,会致使这个节点上的客户端没法使用,没法保证高可用。当某一用户成为热点用户,那么会有巨大的流量涌向这个节点,致使冷热分布不均衡,没法有效利用起集群的性能。因此当热点事件出现时,通常会将源地址哈希法切换成轮询法。

四、加权轮询法

不一样的后端服务器可能机器的配置和当前系统的负载并不相同,所以它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,下降其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。 加权轮询算法要生成一个服务器序列,该序列中包含n个服务器。n是全部服务器的权重之和。在该序列中,每一个服务器的出现的次数,等于其权重值。而且,生成的序列中,服务器的分布应该尽量的均匀。好比序列{a, a, a, a, a, b, c}中,前五个请求都会分配给服务器a,这就是一种不均匀的分配方法,更好的序列应该是:{a, a, b, a, c, a, a}。 优势:能够将不一样机器的性能问题归入到考量范围,集群性能最优最大化; 缺点:生产环境复杂多变,服务器抗压能力也没法精确估算,静态算法致使没法实时动态调整节点权重,只能粗糙优化。

五、加权随机法

与加权轮询法同样,加权随机法也根据后端机器的配置,系统的负载分配不一样的权重。不一样的是,它是按照权重随机请求后端服务器,而非顺序。

六、键值范围法

根据键的范围进行负债,好比0到10万的用户请求走第一个节点服务器,10万到20万的用户请求走第二个节点服务器……以此类推。 优势:容易水平扩展,随着用户量增长,能够增长节点而不影响旧数据 缺点:容易负债不均衡,好比新注册的用户活跃度高,旧用户活跃度低,那么压力就全在新增的服务节点上,旧服务节点性能浪费。并且也容易单点故障,没法知足高可用。

(注:以上所提到的单点故障,均可以用主从方式来解决,从节点监听主节点心跳,当发现主节点死亡,从节点切换成主节点顶替上去。这里能够思考一个问题,怎么设计集群主从能够最大程度上下降成本)

动态负债均衡算法:

一、最小链接数法

根据每一个节点当前的链接状况,动态地选取其中当前积压链接数最少的一个节点处理当前请求,尽量地提升后端服务的利用效率,将请求合理地分流到每一台服务器。俗称闲的人不能闲着,你们一块儿动起来。 优势:动态,根据节点情况实时变化 缺点:提升了复杂度,每次链接断开须要进行计数 实现:将链接数的倒数当权重值

二、最快响应速度法

根据请求的响应时间,来动态调整每一个节点的权重,将响应速度快的服务节点分配更多的请求,响应速度慢的服务节点分配更少的请求,俗称能者多劳,扶贫救弱。 优势:动态,实时变化,控制的粒度更细,跟灵敏 缺点:复杂度更高,每次须要计算请求的响应速度 实现:能够根据响应时间进行打分,计算权重

三、观察模式法

观察者模式是综合了最小链接数和最快响应度,同时考量这两个指标数,进行一个权重的分配。

说在后面话

还有哪些负载均衡的算法,或者有更好的想法或问题,欢迎留言交流!

 

相关文章
相关标签/搜索