负载均衡

负载均衡是什么鬼?从字面意思来看,它应该有两层意思分别是负载和均衡。而对于系统负载均衡它同样具有两层意思,其中系统负载指的系统能够承载的最大访问流量,系统均衡指的是前端请求要均匀地分配给后端机器,同时,同一用户要尽可能分配给同一机器。系统通过负载均衡以后具有如下好处:

1、避免资源浪费。如果我们均衡算法选的不好,就会导致后端资源浪费。比如:如果选择一致Hash算法,可以很好利用cache的容量。而如果用随机,有可能会让cache效果大打折扣。

2、避免服务不可用。当我们不考虑系统的承载能力,有可能直接把某台机器压垮,比如当机器的CPU利用率达到80%,如果再有大量的请求,那么该机器直接宕机,甚至于导致雪崩情况(一台机器宕机,对应的请求会分给其他机器上,那么其他机器也会出现宕机,以至于全部机器都宕机)。

理论基础

系统要实现负载均衡,背后肯定需要一些算法支撑,下面就来看下对应的算法。

1、负载算法

既然要解决后端系统的承载能力,那我们就有很多方式,常用的有以下几种:

静态配置

这种方式对于中小系统来讲是最有效最稳定的。因为后端机器的性能配置、上面部署哪些服务,还能有多大的承载能力等等,我们是最清楚的。比如,我们经常看到nginx的配置:

image

动态调整

当碰到机器故障,以及由于性能问题无法处理请求时,如果此时还将新来的请求分配到该节点,那么可能导致该节点宕机。因此,根据节点的实际负载动态调整节点的权重是非常重要的。当然,要得到节点的真正负载,以及如何定义负载,无论负载是否及时收集,都是需要考虑的问题。

动态调整首先计算所有节点的请求响应时间,对于响应较快的节点,我们可以多分配请求给它,然后增加它的请求数,当它的响应变慢时再慢慢减少它的请求数,慢慢地我们找到这个节点最佳平衡点,即分配多少请求给它。通过相同方法我们找到所有节点的平衡点。

这种方法的好处在于可以动态平衡后面服务器的处理能力。不过,任何事物都有两面性。这种方案如果遇到极端情况,可能会造成雪崩。当某台机器出现短暂网络抖动的时候,它的响应就可能变慢,这个时候,前端服务就会将它的请求分配给其他机器。如果分配的很多,就有可能造成某些机器响应也变慢。然后又将这些机器的请求分配给另外机器。如此这般,就会造成雪崩。

2、均衡算法

均衡算法主要解决将请求如何发送给后端服务。经常会用到以下三种算法:随机(random)、轮询(round-robin)和 哈希算法。

随机算法

随机算法就是通过一个随机函数将所有请求分散到各个节点上, 该方法比较简单,且能做到将请求均匀地分散到各个节点上,因此经常使用随机算法。

轮询算法

轮询算法就是将所有节点以同样的概率向外提供服务,但是它没有考虑各个节点之间的性能差别,对于同样数目的请求,性能好的节点能够轻松完成,而性能差的节点完成的比较费力。因此,我们提出了加权轮询算法,为不同性能的节点赋予不同权重。

哈希算法

通常将用户 id 或 ip 作为key,计算出对应的hash值,然后再对节点数量取模,即hash(key) mode n,其中n为节点数,得到该用户请求落到哪个节点上。该方法可以做到让同一个请求落到同一个节点中,但是当节点数量发生动态变化时,该方法就不太适应了。此时,就应该使用一致性hash算法。一致性hash算法就是把每台server分成v个虚拟节点,再把所有虚拟节点(n*v)随机分配到一致性哈希的圆环上,这样所有的用户从自己圆环上的位置顺时针往下取到第一个vnode就是自己所属的节点。当此节点存在故障时,再顺时针取下一个作为替代节点。更加具体的描述可以参考一致性Hash这篇文章,这里就不展开了。

具体实现

目前负载均衡系统有Nginx、LVS、F5,其总会难过Nginx是软件的7层负载均衡,LVS是内核的4层负载均衡,F5是硬件的4层负载均衡。

软件和硬件的区别在于性能,硬件远远高于软件,Nginx的性能是万级的,一般的Linux服务器上安装一个Nginx能达到每秒5万并发请求;而F5的性能能达到百万级,从200万每秒到800万每秒都有,不过价格很贵。

4层和7层的区别在于协议和灵活性,Nginx是7层的,它支持HTTP等协议,而LVS和F5是4层协议,它们和协议无关,几乎所有应用都可以做。


作者:木可大大
链接:https://juejin.im/post/5b161550e51d45069928e084
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值