09 July 2013

在服务器集群中,为了避免某一台服务器因过载而崩溃,除了每台服务器限定了最大连接数外,还对服务器的负载进行了均分。本文介绍了几个常见的负载均衡算法。

随机

通过随机数生成算法从服务器组中选取一个,然后把请求发送给它。

轮询

所有的服务器组成一个队列,不管连接数、响应时间,从队列首取出一个,然后放到队尾,不断循环。最终把所有的请求平均分给所有的服务器。适用于服务器性能差异不大的情况。

加权轮询

给每台服务器加一个权重值,高权重的服务器将被分配高比例的连接。假设有一组服务器S = {S0, S1, …, Sn-1},W(Si)表示服务器Si的权值,一个指示变量i表示上一次选择的服务器,指示变量cw表示当前调度的权值,max(S)表示集合S中所有服务器的最大权值,gcd(S)表示集合S中所有服务器权值的最大 公约数。变量i初始化为-1,cw初始化为零。

while (true) {
  i = (i + 1) mod n;
  if (i == 0) {
     cw = cw - gcd(S);
     if (cw <= 0) {
       cw = max(S);
       if (cw == 0)
         return NULL;
     }
  }
  if (W(Si) >= cw)
    return Si;
} 此算法的思想是先把请求分配给高权重的机器,然后降低其权值,直到有一个机器的权值小于它,才把请求分配给权值第二大的机器。

最少连接

由于各服务器处理请求的时间不同,因此同一时刻各服务器的当前连接数都不同。此算法将到来的请求分配给当前连接数最少的服务器。处理速度越快的服务器将被分配到越多的连接。

哈希

可以用来hash的输入有很多,比如源IP地址,URL,cookie

参考

1、解析nginx负载均衡

2、加权轮叫调度(Weighted Round-Robin Scheduling)