zoukankan      html  css  js  c++  java
  • 六种负载均衡算法介绍

    六种负载均衡算法

    目录

    轮询法

    轮询法是分布式系统中最简单的一种算法。这也是最简洁的。当有N个服务器的时候,其是从1开始,一直到N循环。结束了之后,继续重新开始循环

    比如下面的例子,有5个服务器,(IP地址是虚拟的),那么我们便从头开始,一次过后,仍从头开始

    服务器地址 访问次序
    192.168.0.1 1
    192.168.0.2 2
    192.168.0.3 3
    192.168.0.4 4
    192.168.0.5 5
    192.168.0.1 6
    192.168.0.2 7
    192.168.0.3 8
    192.168.0.4 9
    192.168.0.5 10

    即使服务器IP之间有权重关系(通常权重是衡量每一个服务器的性能区别。一般来说,权重越大,说明服务器运行能力越大。),但是轮询算法与权重无关。其假设每台服务器的处理能力都相同,不关心每一台服务器的运行效率。也就是说,当服务器性能或者处理能力不均衡的时候,会出现有些服务器会"休息",也有些服务器会"经常工作"。

    每个服务器都能够被轮到。算法的主要优点是简洁性。也是一种无状态调度,因为轮询算法无需记录当前所有连接的状态。

    过程的大致伪代码

    
    Integer index=0;
    Map<String,Integer>serverMap=getServerMap();
    if(index> serverMap's size)
      index=0;
    else{
      index++;
      return serverMap.get(index);
    }
    
    

    back

    随机法

    随机算法也就是从服务器的列表中随机抽取一台服务器进行访问。如果我们假设足够平均,那么其是趋向于轮询算法的,也就是能够达到了轮询算法的效果。和轮询算法差不多,只不过其访问服务器的次序有所不一样,其是随机分配

    服务器地址 访问次序
    192.168.0.1 1
    192.168.0.3 2
    192.168.0.5 3
    192.168.0.1 4
    192.168.0.2 5
    192.168.0.4 6
    192.168.0.2 7
    192.168.0.5 8
    192.168.0.1 9
    192.168.0.3 10

    由概率论的知识可以知道,当样本次数足够大的时候,其是趋向于平均的,也就是轮询的效果。如果平均趋向不正常,那么可能都被集中访问到一两台服务器上。

    其大致的伪代码如下:

    
    //获取随机数
    int randomNumber=getRandomNumber();
    //根据服务数返回服务器
    return serverMachine.get(randomNumber);
    
    

    back

    源地址哈希法

    源地址哈希法根本思想就是根据消费者请求客户端,也就是服务器的IP地址进行哈希值运算之后,得到的哈希值与服务器个数进行求模,然后再分配到相对应的服务器上。如果服务器列表不变,那么访问的将会是同一个服务器。

    源地址哈希法与服务器权重没有关系,只与源地址有关系。

    如果有大量的活跃用户的源地址被映射到同一个哈希值上,那么就可能会导致同一个服务器被大量的用户所访问。这样的景象就会导致多个服务器分配不均匀,也就单一个服务器特别繁忙,其他的可能处于空闲状态。

    其次,如果该服务器宕机了,那么就会导致被映射到该服务器上的用户无法正常访问,出现问题。

    
    //获取请求服务端的IP
    ip=getServerIP();
    //获取哈希值
    int hash=ip.getHash()%serverMachineNumber;
    //根据哈希值返回服务机器
    return serverMachine.get(hash);
    
    

    back

    加权轮询法

    一般来说,每一个后台服务器也是有其自己的配置的,因此每个服务器的抗压能力也不一样。因此当服务器的配置高,它所能够接受很高的抗压能力。从另一个方面说,配置高的服务器分配更高的权重,配置低的就分配低的权重,从而有效升降系统的负载能力。使用加权轮询法,就很好的处理了这个问题。加权轮询法是在轮询法的基础上添加了权数。加权轮询法能够按照请求顺序,且按照权重分配到后端。

    比如服务器的权重如下:

    服务器地址 权重
    192.168.0.1 10
    192.168.0.2 4
    192.168.0.3 1
    192.168.0.4 8
    192.168.0.5 5

    那么,如果有多个客户端进行访问,服务器的访问顺序可能为:

    服务器地址 服务顺序
    192.168.0.1 1
    192.168.0.4 2
    192.168.0.5 3
    192.168.0.2 4
    192.168.0.3 5

    (访问的服务器地址不一定相同)

    back

    加权随机法

    加权随机法其实是为这几个服务器创建一个概论的权重。还是那几个服务器。我们分别给他们赋予相对应的权重,但是这个权重只是一个随机的概论。也就是说,他还是有概率被其他的服务器接收到并且工作的。

    加权随机法是在随机法的基础上为每一个服务器添加了权重之后的结果。系统的负载分配不同的权重,与加权轮询法不同的是,加权随机法并不是按照顺序去分配的,而是按照权重分配随机的。

    服务器地址 权重
    192.168.0.1 1
    192.168.0.2 4
    192.168.0.3 3
    192.168.0.4 1
    192.168.0.5 2

    那么就会列表里面大概就会称为:

    服务器地址 大致序号
    192.168.0.1 1
    192.168.0.2 2
    192.168.0.2 3
    192.168.0.2 4
    192.168.0.2 5
    192.168.0.3 6
    192.168.0.3 7
    192.168.0.3 8
    192.168.0.4 9
    192.168.0.5 10
    192.168.0.5 11

    然后按照随机的方法进行抽选。由上面的列表可知,总权重为11,那么对应的概率就应该为:

    服务器地址 权重
    192.168.0.1 1/11
    192.168.0.2 4/11
    192.168.0.3 3/11
    192.168.0.4 1/11
    192.168.0.5 2/11

    如果数量特别大,并且足够平均,是可以达到理论值的。

    back

    最小连接数法

    最小连接数法其实很简单。其主要的思想是,设定一个中止值,如果有询问该服务器的,并且本次连接能够进行通信的,那么我们为这个服务器的连接数加一。如果不能进行通信或者通信结束了,那么我们为其减一。也就是用一个数去记录各个服务器之间的在进行通信的数目。当有下一个需要访问服务器的,我们就为它分配连接数最少的那一个服务器。如果有权重参与,那么我们就为其分配连接数最少,权重最大的那个服务器,让其进行通信。当权重为0时,我们可以定义为服务器不可用。

    使用最小连接数这种方法,是为了能够动态分配服务器的资源,尽可能地提高利用率。

    back


    出自

    地址 https://www.cnblogs.com/Yunrui-blogs/p/13830676.html

    如需转载,请标明出处。

    这是小睿的博客,如果需要转载,请标注出处啦~ヾ(≧▽≦*)o谢谢。
  • 相关阅读:
    缓慢画点功能实现的两个方法
    c++编译器对新建字符型数组内部数据的初始化
    在win7下用net命令无法实现对用户的创建(未完成)
    关于sleep函数的一些问题和资料
    C++ 临时笔记
    boost::progress_timer 与 boost::progress_display
    《C++ Primer》 Part IV(ObjectOriented and Generic Programming)
    Linux下常用软件
    《C++STL基础及应用》读书笔记
    boost::asio
  • 原文地址:https://www.cnblogs.com/Yunrui-blogs/p/13830676.html
Copyright © 2011-2022 走看看