Nginx负载均衡

Nginx内置的负载均衡策略有三种:轮询、加权轮询和ipHash。

upstream backend {
	server 1;
	server 2;
}

轮询是最简单的,每个服务器轮着分发。加权轮询更优化一点,大致算法如下:

  1. 求出所有节点权值的最大公约数C

  2. 所有节点权重除以C,求出此时所有权重之和X。

  3. 比如此时所有节点权重为 3,4,5,2, 则n % X 属于[1,3]则路由到节点1,n % X 属于[4,8] 则路由到节点2.

但是这种轮询方法求得的序列是 aaabbbbcccccdd这种,不平滑。

而Nginx对于加权轮询采取的是平滑的轮询方式。

算法大概如下:每个节点有两个weight:

  1. 设定的weight。

  2. effective_weight,初始值为设定的weight。

调度的过程大致如下:

  1. 初始化每个节点的effective_weight为配置的权重,并求得权重之和。

  2. 选出当前effective最大的节点,此节点即为选中的节点。并且将该节点的effective_weight减去权重之和。

  3. 将每个节点的effective_weight加上配置权重

  4. 每次调度时重复 步骤2和3

这样会产生一个比较平滑的序列。

1️⃣平滑性:直观感受每一轮选择都把权值最大的节点的权值分给了其他节点,平滑性比较容易看出。

2️⃣均匀性:设所有权值之和为S,每个节点权重为A1,A2,…,An.

Written on August 12, 2018