负载均衡
负载均衡,英语直译为LoadBanlance,简单说来就是把一堆请求按实际情况均衡分配到各节点服务器,以此来解决大量并发访问问题,毕竟单台服务器的能力是有极限的,服务器群体却是没有极限且具有扩展性的。
负载均衡方式
负载均衡有硬负载均衡,常见的有F5,Array;软负载均衡,常见的有Nginx,LVS,HAProxy。根据负载基于ip+port还是url,也可以分为四层负载均衡和七层负载均衡。负载均衡算法
负载均衡算法就是负载过程采用什么机制去均衡分配,常见的算法有随机,加权随机,轮询,一致性哈希,最小活跃数等。
随机算法比较简单,把节点服务器ip放入集合之中,按随机生成数访问集合中的某个元素(ip地址),纯粹的随机。基于无限大的样本,随机到某个节点的概率是一样的。但是实际情况是请求数量有高峰和低谷,服务器性能也有高有低,于是就有了加权随机。加权随机套路也比较朴素,给每个节点赋予权重属性,一个节点将按照权重变成多个节点加入到节点集合中,显然节点的权重越大,节点的数量就越多,这样按照节点数量值进行随机生成数,那么权重大的节点无疑被选中的几率要高于权重低的节点。当然也可以按照权重比例,生成随机数,根据随机数产生的范围比率,去选择对应的权重节点。
轮询算法顾名思义就是一台一台的轮流着服务,比较公平,但是实际情况貌似不太需要公平,如果也加一个加权轮询,采用复制的套路有点类似加权随机。这里还可以将请求编号化,将权重横轴平铺开来,根据请求编号对节点数进行取模运算,然后根据模运算结果,找到对应的节点区域。但是这样又会造成节点持续服务,于是有了平滑加权轮询。
平滑加权轮询就是要把轮询中的节点持续服务问题优化,例如10次请求三个权重分别为[6,3,1]的A、B、C三节点集合,轮询可能产生AAAAAABBBC的结果,如果B、C可以穿插到A连续服务当中,那是再合适不过了。可以给节点权重之外,再增加一个当前权重属性,权重值不变,当前权重动态调整,当前权重初始等于权重值,每轮选罢,当前权重最大值减去权重总和,并与权重值相加得到新一轮当前权重值,选出最大的当前权重作为天选节点返回,显然AAABBACABA更加平滑。一致性哈希就是利用哈希算法,将请求按照ip或url或请求数据等信息计算出哈希值,然后将哈希值映射到服务器节点上,这样相同的请求就总是落在相同的服务器节点上。通常我们使用哈希环,来将哈希值映射到节点区间,并返回区间端点节点。当然如果有节点退出时,可能会造成某个节点负载过高,于是有了虚拟节点概念,即将实际节点虚拟到节点哈希环上,使节点之间的负载均衡更加平滑。最小活跃数算法,上述的几种思路在于朴素的将各路请求均衡到各个节点上,但是单单考虑到节点均衡是不够的,一次请求调用时间也是需要考虑的,这就是最小活跃数要解决的问题。其实思路也很朴素,每个节点初始都有一个最小活跃数,经过一段时间的请求处理,服务正常且性能较好的节点往往处理速度更快,最小活跃数就小,这样的节点适合处理更多的请求,这就是基本思想。当然,在此基础上,还可以按需分配权重,使得相同活跃数的节点权重大的更优先获得请求处理权。
















