dubbo负载均衡策略
负载均衡算法 在集群负载均衡时,Dubbo提供了4种均衡策略,如:Random LoadBalance(随机均衡算法)、;
RoundRobin LoadBalance(权重轮循均衡算法)、LeastAcon LoadBalance(最少活跃调用数均衡算法)、 ConsistentHash LoadBalance(一致性Hash均衡算法)。缺省时为Random随机调用。这四种算法的原理简要介绍 如下:
1、RoundRobin LoadBalance Round-Robin既是轮询算法,是按照公约后的权重设置轮询比率,即权重轮询算法(Weighted RoundRobin) ,它是基于轮询算法改进而来的。这里之所以写RoundRobin是为了跟Dubbo中的内容保持一致。 轮询调度算法的原理是:每一次把来自用户的请求轮流分配给内部中的服务器。如:从1开始,一直到N(其 中,N是内部服务器的总个数),然后重新开始循环。 该算法的优点: 其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。 该算法的缺点: 轮询调度算法假设所有服务器的处理性能都相同,不关心每台服务器的当前连接数和响应速度。当请求服 务间隔时间变化比较大时,轮询调度算法容易导致服务器间的负载不平衡。 所以此种均衡算法适合于服务器组中的所有服务器都有相同的软硬件配置并且平均服务请求相对均衡的情 况。但是,在实际情况中,可能并不是这种情况。由于每台服务器的配置、安装的业务应用等不同,其处 理能力会不一样。所以,我们根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受 相应权值数的服务请求。 权重轮询调度算法流程 假设有一组服务器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; }
这种算法的逻辑实现如图2所示,图中我们假定四台服务器的处理能力为3:1:1:1。
权重轮询调度实现逻辑图示 由于权重轮询调度算法考虑到了不同服务器的处理能力,所以这种均衡算法能确保高性能的服务器得到更 多的使用率,避免低性能的服务器负载过重。所以,在实际应用中比较常见。 2、ConsistentHash LoadBalance 一致性Hash,相同参数的请求总是发到同一个提供者。一:一致性Hash算法可以解决服务提供者的增加、 移除及挂掉时的情况,能尽可能小的改变已存在 key 映射关系,尽可能的满足单调性的要求。二:一致性 Hash通过构建虚拟节点,能尽可能避免分配失衡,具有很好的平衡性。 一致性Hash下面就来按照 5 个步骤简单讲讲 consistent hash算法的基本原理。因为以下资料来自于互联 网,现说明几点:一、下面例子中的对象就相当于Client发的请求,cache相当于服务提供者。 环形hash 空间 考虑通常的hash 算法都是将 value 映射到一个 32 为的 key 值,也即是 0~2^32-1 次方的数值空间;我 们可以将这个空间想象成一个首(0)尾(2^32-1)相接的圆环,如下面图 2 所示的那样。
环形 hash 空间 把对象映射到hash 空间 接下来考虑4个对象 object1~object4,通过 hash 函数计算出的 hash 值 key 在环上的分布如图 3所示。 hash(object1) = key1; … … hash(object4) = key4;
4个对象的 key 值分布