zoukankan      html  css  js  c++  java
  • 负载均衡的常用算法

    1、随机算法:

    负载均衡方法随机的把负载分配到各个可用的服务器上,通过随机数生成算法选取一个服务器,然后把连接发送给它。同样一个请求一会落到机器A,一会落到机器B上,Cache会被频繁淘汰,使得cache命中率低。

    2、轮询算法:

    轮询算法按顺序把每个新的连接请求分配给下一个服务器,最终把所有请求平分给所有的服务器。轮询算法在大多数情况下都工作的不错,但是如果负载均衡的设备在处理速度、连接速度和内存等方面不是完全均等,那么效果就会不好。当然cache命中率也不高

    3、加权轮询算法:

    每个机器接受的连接数量是按权重比例分配的。这是对普通轮询算法的改进,比如你可以设定:第三台机器的处理能力是第一台机器的两倍,那么负载均衡器会把两倍的连接数量分配给第3台机器。

    4、动态轮询算法:

    类似于加权轮询,但是,权重值基于对各个服务器的持续监控,并且不断更新。这是一个动态负载均衡算法,基于服务器的实时性能分析分配连接,比如每个节点的当前连接数或者节点的最快响应时间等。

    5、最快响应算法:

    平衡器记录自身到每一个集群节点的网络响应时间,并将下一个到达的连接请求分配给响应时间最短的节点;

    6、最少连接算法:

    平衡器纪录目前所有活跃连接,把下一个新的请求发给当前含有最少连接数的节点。

    7、哈希散列算法:

    散列法也叫哈希法(HASH),通过单射不可逆的HASH函数,按照某种规则将网络请求发往集群节点,将具有相同源地址的数据包发给同一服务器。以后对相同的请求, 相同的服务器组,计算出来的hash结果相同,从而达到HASH分布的效果。

    根据不同的均衡要求选择不同的均衡算法

    当然:对于哈希散列算法我们

    计算全部服务器的idx_key=hash(query_key+server_idx),其中计算得到idx_key最大的server_idx就是需要的idx。
    假设开始3台后端服务器,请求用标志串 req = "abcd" 来标志,服务器用 S1, S2, S3来标志, 那么,通过对 req + Sx 合并起来计算签名就可以对每个服务器得到一个数值:
    (req = "abcd" + S1) = K1
    (req = "abcd" + S2) = K2
    (req = "abcd" + S3) = K3
    计算的方法可以使用crc,也可以使用MD5,目的的得到一个*散列*的数字,这样在K1,K2,K3中 必定有一个最大的数值,假设是K2,那么可以将请求req扔给S2,这样,以后对相同的请求, 相同的服务器组,计算出来的结果必定是K2最大,从而达到HASH分布的效果。
    巧妙的地方在于,新增或者删除一台服务器的时候,不会引起已有服务器的cache大规模失效, 假设新增一台服务器S4,那么对S1,S2,S3计算的K值都完全相同,那么对S4可以计算得到一个新值K4,如果计算K的算法足够散列,那么原先计算到 S1,S2,S3的请求,理论上都会有1/4的请求新计算得到的K4比原先的K大, 那么这1/4的请求会转移到S4,从而新增的S4服务器会负担1/4的请求,原先的S1,S2,S3也只会负担原先的3/4。

    cache命中率最高,并且新增和删除(考虑到服务器宕机的情况)服务器的影响最小

  • 相关阅读:
    Spark算子--join
    Spark算子--filter
    Spark算子--reduceByKey
    Spark算子--mapPartitions和mapPartitionsWithIndex
    Spark算子--map和flatMap
    Flume环境搭建_五种案例
    枚举深入剖析
    Oracle_基本函数查询综合
    Oracle_复杂查询综合
    softmax 杂谈
  • 原文地址:https://www.cnblogs.com/cdwp8/p/4070007.html
Copyright © 2011-2022 走看看