负载均衡(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 的序列,但是每台机器不完全按照这个序列轮训,而是随机选择一个开始,那生成的序列就可能变成下面这样:
这样能降低流量突增时第一台机器被打瘫痪的概率。