美文网首页
负载均衡 Nginx、Dubbo、Ribbon

负载均衡 Nginx、Dubbo、Ribbon

作者: 黄靠谱 | 来源:发表于2019-02-11 11:48 被阅读69次

概述

  1. Dubbo负载均衡:支持4种,引入了JVM预热时间加权、权重自定义配置的规则,同时支持控制台动态配置权重值参数,所以最灵活。
  2. Nginx负载均衡:支持4种,自带 轮询(支持权重)、IP_Hash(避免Session共享的问题)、最少连接数策略,可以扩展fair(响应时间)策略,更专注于功能
  3. Ribbon负载均衡:支持6种,不支持权重:轮询、随机、最少连接数、最短响应时间(随机+响应时间加权)、过滤异常节点+轮询,负载策略最全

Dubbo 负载均衡(2.6.2)

Dubbo提供4种负载均衡算法,引入了JVM预热时间加权、权重自定义配置的规则,同时支持控制台动态配置权重值参数,所以最灵活。

四种算法:

  1. Random LoadBalance:按照权重随机分配Provider,比如随机且权重Node1:Node2= 2:1,那么运行30次,大约有20次在Node1上,10次在Node2上。

  2. RoundRobin LoadBalance:按照权重轮询分配。比如权重Node1:Node2= 20:10,那么运行30次:前20次里面轮询Node1和Node2大家各10次,第20次到30次,全部选择Node1。因为Dubbo默认是不会做公约数的处理,只有完成一个完整的20+10次运算,才能保证负载均衡的权重比例准确,如果Consumer只调用了20次,那么这里配置的权重的结果就是1:1了,该算法很不平滑。在2.6.5版本中修复了,跟Nginx的实现方法一样。

  3. LeastActive LoadBalance:节点处理越快分配更多,避免慢节点堆积,每次筛选Provider的时候,都只取Active值最小的节点,如果最小Active值的节点有多个,则按照权重随机选取。Provider每获取到一个任务Active值++,每结束一个任务Active值--

  4. ConsistentHash LoadBalance:唯一忽略权重配置和JVM预热的算法。先把所有Provider都分配160个虚拟节点,通过Hash算法,全部分散到Hash圆上。每次Consumer调用时,会根据参数值做Hash换算,最后映射到Hash圆上,找到邻近的虚拟节点,最终获取到提供服务的Provider。但是Dubbo在实现的时候违背了Hash一致性的原则,每次Porvider发生改变的时候(新增或者剔除),都会重新创建一个Hash圆,而不是在之前的Hash圆上新增或者剔除不合格的Porvider

Nginx 负载均衡算法

轮询(支持配置权重)、IP_Hash、least_conn,可以扩展 fair策略(响应时间来分配)

Nginx目前有4种负载均衡配置:

  1. round_robin,加权轮询,是默认的HTTP负载均衡算法,适用于知道机器的性能,且默认所有的请求对于服务器而言,处理的时间相差不大。比如我Server1 比Server2的配置要高一倍,我设置为2:1的权重,可以实现比较科学的负载。算法实现上,简单的轮询很简单,给每个Server依次编号,然后只要记录一个调用index,既可以实现轮询。

  2. ip_hash,IP哈希,可保持会话

  3. least_conn; 避免了慢堆积,会取连接数最小的server提供服务,可以避免有些请求耗时长,有些耗时端的情况。根据实际的连接数选择服务器。

  4. fair,需要插件扩展该功能,根据后端服务器的响应时间来分配请求,响应时间短的优先分配,避免慢堆积。

权重配置:而且采用的是平滑的负载均衡算法,比如node1:node2:node3=1:2:5 --> node3,node3,node2,node3,node1,node3,node2,node3

Ribbon 负载均衡概述

  1. RoundRobinRule:轮询。默认超过10次获取到的server都不可用,会返回一个空的server
  2. RandomRule:随机,如果随机到的server为null或者不可用的话,会while不停的循环选取
  3. RetryRule:一定时限内循环重试。默认继承RoundRobinRule,也支持自定义注入,RetryRule会在每次选取之后,对选举的server进行判断,是否为null,是否alive,并且在500ms内会不停的选取判断。而RoundRobinRule失效的策略是超过10次,RandomRule是没有失效时间的概念,只要serverList没都挂。
    @Bean
    public IRule ribbonRule() {
        return new RetryRule(new BestAvailableRule());//这里配置策略,和配置文件对应
    }
  1. BestAvailableRule:最小连接数。遍历serverList,选取出可用的且连接数最小的一个server。该算法里面有一个LoadBalancerStats的成员变量,会存储所有server的运行状况和连接数。如果选取到的server为null,那么会调用RoundRobinRule重新选取。

  2. WeightedResponseTimeRule:最小响应时间。这个策略整合了随机算法和响应时间加权算法。会开启定时任务,每30秒计算一次所有Provider的响应时间,以响应时间作为权重,响应时间越短的服务器被选中的概率越大。
    比如Node1:node2:node3的平均响应时间为100ms:200ms:300ms,那么nodes的的权重值是300:500:600,每次以600为基础*随机值,那么落在 0--300的概率为50%,300--500的概率33%,100--600的概率为17%,也就是平均响应时间越短的节点,被选中的概率越大

    double totalResponseTime = 0;
    //遍历获取所有节点的总的平均响应时间
    for (Server server : nlb.getAllServers()) {
        ServerStats ss = stats.getSingleServerStat(server);
        totalResponseTime += ss.getResponseTimeAvg();
    }
    Double weightSoFar = 0.0;
    //然后从第一个节点开始设置自增的weightSoFar,每个结点的权重值weight为总响应时间-自己的相应时间,也就是说,node的响应时间越短,weight的值就越大,就越有可能被随机数命中
    List<Double> finalWeights = new ArrayList<Double>();
    for (Server server : nlb.getAllServers()) {
        ServerStats ss = stats.getSingleServerStat(server);
        double weight = totalResponseTime - ss.getResponseTimeAvg();
        weightSoFar += weight;
        finalWeights.add(weightSoFar);   
    }
    setWeights(finalWeights);
  1. AvailabilityFilteringRule 过滤+轮询策略,先过滤出故障的或并发请求大于阈值一部分服务实例,然后再轮询
    private boolean shouldSkipServer(ServerStats stats) {        
        if ((CIRCUIT_BREAKER_FILTERING.get() && stats.isCircuitBreakerTripped()) || stats.getActiveRequestsCount() >= activeConnectionsLimit.get()) {
            return true;
        }
        return false;
    }
  1. ZoneAvoidanceRule 扩展了轮询策略,继承了2个过滤器:ZoneAvoidancePredicate和AvailabilityPredicate,除了过滤超时和链接数过多的server,还会过滤掉不符合要求的zone里面的所有节点

相关文章

  • 【Ribbon+Nginx】两者之间有什么区别

    Nginx属于服务端负载均衡,而Ribbon属于本地负载均衡。

  • 负载均衡 Nginx、Dubbo、Ribbon

    概述 Dubbo负载均衡:支持4种,引入了JVM预热时间加权、权重自定义配置的规则,同时支持控制台动态配置权重值参...

  • ribbon负载均衡

    ribbon负载均衡与nginx负载均衡区别1.nginx是客户端所有请求统一交给nginx,由nginx进行实现...

  • Ribbon与Nginx的区别

    一、Ribbon与Nginx的区别 我们知道负载均衡有硬件负载均衡与软件的负载均衡方案 硬件负载均衡:比如 F5、...

  • Zuul和Nginx区别

    Nginx是采用服务器实现负载均衡进行转发。 Zuul是通过eureka和ribbon进行本地负载均衡转发。 Zu...

  • SpringCloud-Ribbon:认识Ribbon及配置负载

    SpringCloud-Ribbon(1)认识Ribbon及配置负载均衡 什么是负载均衡? LB,即负载均衡(Lo...

  • Spring Cloud初步理解

    Ribbon实现负载均衡 关键字:Feign、Ribbon、eureka、负载均衡 大致:步骤,启动eureka服...

  • SpringCloud-Ribbon-02负载规则

    内置负载均衡规则 负载均衡规则是Ribbon的核心,下面来看一下Ribbon内置的负载均衡规则。 RandomRu...

  • springCloud(5)

    ribbon(retry) 1.负载均衡Ribbon 1.1消费者设置负载均衡策略 1.添加ribbon依赖(eu...

  • spring cloud6负载均衡

    一、负载均衡负载均衡不仅仅是ribbon,还包括zuul1,客户端的负载均衡:ribbon负载均衡作为客户端应用的...

网友评论

      本文标题:负载均衡 Nginx、Dubbo、Ribbon

      本文链接:https://www.haomeiwen.com/subject/rjfqeqtx.html