负载均衡是什么鬼?从字面意思来看,它应该有两层意思分别是负载和均衡。而对于系统负载均衡它一样具备两层意思,其中系统负载指的系统可以承载的最大访问流量,系统均衡指的是前端请求要均匀地分配给后端机器,同时,同一用户要尽量分配给同一机器。系统经过负载均衡之后具备以下好处:前端
一、避免资源浪费。若是咱们均衡算法选的很差,就会致使后端资源浪费。好比:若是选择一致Hash算法,能够很好利用cache的容量。而若是用随机,有可能会让cache效果大打折扣。node
二、避免服务不可用。当咱们不考虑系统的承载能力,有可能直接把某台机器压垮,好比当机器的CPU利用率达到80%,若是再有大量的请求,那么该机器直接宕机,甚至于致使雪崩状况(一台机器宕机,对应的请求会分给其余机器上,那么其余机器也会出现宕机,以致于所有机器都宕机)。nginx
系统要实现负载均衡,背后确定须要一些算法支撑,下面就来看下对应的算法。算法
一、负载算法后端
既然要解决后端系统的承载能力,那咱们就有不少方式,经常使用的有如下几种:服务器
静态配置微信
这种方式对于中小系统来说是最有效最稳定的。由于后端机器的性能配置、上面部署哪些服务,还能有多大的承载能力等等,咱们是最清楚的。好比,咱们常常看到nginx的配置:网络
动态调整并发
当碰到机器故障,以及因为性能问题没法处理请求时,若是此时还将新来的请求分配到该节点,那么可能致使该节点宕机。所以,根据节点的实际负载动态调整节点的权重是很是重要的。固然,要获得节点的真正负载,以及如何定义负载,不管负载是否及时收集,都是须要考虑的问题。负载均衡
动态调整首先计算全部节点的请求响应时间,对于响应较快的节点,咱们能够多分配请求给它,而后增长它的请求数,当它的响应变慢时再慢慢减小它的请求数,慢慢地咱们找到这个节点最佳平衡点,即分配多少请求给它。经过相同方法咱们找到全部节点的平衡点。
这种方法的好处在于能够动态平衡后面服务器的处理能力。不过,任何事物都有两面性。这种方案若是遇到极端状况,可能会形成雪崩。当某台机器出现短暂网络抖动的时候,它的响应就可能变慢,这个时候,前端服务就会将它的请求分配给其余机器。若是分配的不少,就有可能形成某些机器响应也变慢。而后又将这些机器的请求分配给另外机器。如此这般,就会形成雪崩。
二、均衡算法
均衡算法主要解决将请求如何发送给后端服务。常常会用到如下三种算法:随机(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层协议,它们和协议无关,几乎全部应用均可以作。
欢迎关注微信公众号:木可大大,全部文章都将同步在公众号上。