Nginx负载均衡
Nginx内置的负载均衡策略有三种:轮询、加权轮询和ipHash。
upstream backend {
server 1;
server 2;
}
轮询是最简单的,每个服务器轮着分发。加权轮询更优化一点,大致算法如下:
-
求出所有节点权值的最大公约数C
-
所有节点权重除以C,求出此时所有权重之和X。
-
比如此时所有节点权重为 3,4,5,2, 则n % X 属于[1,3]则路由到节点1,n % X 属于[4,8] 则路由到节点2.
但是这种轮询方法求得的序列是 aaabbbbcccccdd这种,不平滑。
而Nginx对于加权轮询采取的是平滑的轮询方式。
算法大概如下:每个节点有两个weight:
-
设定的weight。
-
effective_weight,初始值为设定的weight。
调度的过程大致如下:
-
初始化每个节点的effective_weight为配置的权重,并求得权重之和。
-
选出当前effective最大的节点,此节点即为选中的节点。并且将该节点的effective_weight减去权重之和。
-
将每个节点的effective_weight加上配置权重
-
每次调度时重复 步骤2和3
这样会产生一个比较平滑的序列。
1️⃣平滑性:直观感受每一轮选择都把权值最大的节点的权值分给了其他节点,平滑性比较容易看出。
2️⃣均匀性:设所有权值之和为S,每个节点权重为A1,A2,…,An.
Written on August 12, 2018