负载均衡(Load Balance),其意思就是将负载(工作任务)进行平衡、分摊到多个操作单元上进行执行。在负载均衡中可以分为两种方式,硬件方式与软件方式。硬件负载均衡主要是有F5、思科,软件方式(不区分四层与七层负载均衡)主要包括http重定向、DNS重定向、反向代理(如nginx)、NAT转换等。
WRR算法
假设有3台机器a、b、c,权重分别为5,1,1, WRR(Weighted Round Robin)算法实现方式是:每次选出权重最大的机器,其权重减1,直到权重全部为0。然后按照生成的序列循环。
最终得到的循环序列为:a,a,a,a,a,b,c,虽然此时负载是均衡的(5:1:1),但是前五次访问都打到a机器,b和c机器是空闲的。理想状态是在均衡的情况下让访问次数也均衡分布,于是就有了SWRR算法(Smooth Weighted Round Robin),平滑加权轮训调度算法。
SWRR算法
对于上面的案例,SWRR算法策略是:
1、从权重中选出最大的,减去总权重
2、然后再给每个权重加上自身权重初始值
3、再次轮训,直到权重为0,确定序列
得到的最终循环序列是:a,a,b,a,c,a,a,访问效果比WRR算法更优。
但是SWRR算法在大量并发来临的时候,第一次始终会选择a机器,就有可能导致a机器瘫痪。解决方案为:对于生成的序列随机选择一个开始,比如有5台负载的机器,都生成了a,a,b,a,c,a,a的序列,但是每台机器不完全按照这个序列轮训,而是随机选择一个开始,那生成的序列就可能变成下面这样:
这样能降低流量突增时第一台机器被打瘫痪的概率。