首页 > 系统相关 >Nginx加权轮询负载均衡

Nginx加权轮询负载均衡

时间:2022-12-07 22:23:10浏览次数:60  
标签:负载 weight 轮询 Nginx peer ngx 节点 best

Nginx官方支持的后端服务负载均衡策略有加权轮询和IP哈希,默认采用加权轮询策略。

加权轮询流程图

代码流程

static ngx_http_upstream_rr_peer_t *
ngx_http_upstream_get_peer(ngx_http_upstream_rr_peer_data_t *rrp)
{
    time_t                        now;
    uintptr_t                     m;
    ngx_int_t                     total;
    ngx_uint_t                    i, n, p;
    ngx_http_upstream_rr_peer_t  *peer, *best;

    now = ngx_time();

    best = NULL;
    total = 0;

#if (NGX_SUPPRESS_WARN)
    p = 0;
#endif

    for (peer = rrp->peers->peer, i = 0;
         peer;
         peer = peer->next, i++)
    {
        n = i / (8 * sizeof(uintptr_t));
        m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t));

        if (rrp->tried[n] & m) {
            continue;
        }

        if (peer->down) {
            continue;
        }

        if (peer->max_fails
            && peer->fails >= peer->max_fails
            && now - peer->checked <= peer->fail_timeout)
        {
            continue;
        }

        if (peer->max_conns && peer->conns >= peer->max_conns) {
            continue;
        }

        peer->current_weight += peer->effective_weight;
        total += peer->effective_weight;

        if (peer->effective_weight < peer->weight) {
            peer->effective_weight++;
        }

        if (best == NULL || peer->current_weight > best->current_weight) {
            best = peer;
            p = i;
        }
    }

    if (best == NULL) {
        return NULL;
    }

    rrp->current = best;

    n = p / (8 * sizeof(uintptr_t));
    m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t));

    rrp->tried[n] |= m;

    best->current_weight -= total;

    if (now - best->checked > best->fail_timeout) {
        best->checked = now;
    }

    return best;
}

weight

始终是初始权重

currentWeight

开始是初始权重,后面会变化

effectiveWeight

开始是初始权重,节点异常后-1,遍历选择时<初始权重后+1

1. 所有节点的effectiveWeight之和作为totalWeight
2. 遍历所有节点,currentWeight += effectiveWeight,effectiveWeight<初始权重后+1
3. currentWeight值最大的节点作为选中节点
4. 选中节点currentWeight -= totalWeight

3个节点正常,权重分别为4、2、1。

经过7次加权轮询后,serverA、serverB、serverC的权重又变回了4、2、1。

参考资料

《深入剖析Nginx》
Nginx负载均衡算法--加权轮询(golang 实现)

标签:负载,weight,轮询,Nginx,peer,ngx,节点,best
From: https://www.cnblogs.com/WJQ2017/p/16964726.html

相关文章

  • 显示本机IP并判断IP地址,批量创建用户,安装nginx服务并启动
    完成一个shell脚本,脚本的作用。1.运行脚本可以显示出本机的ip地址2.如果ip地址中有3这个数字,那么就打印出当前的系统时间3.如果ip地址中不含3这个数字,就批量建立用户mag......
  • 关于hashmap的负载因子
    也就是loadFactor这个属性,这个属性主要用在resize方法。在putVal的方法里:1.size=0的时候,就重新设置Map的大小2.加入对象后,size++>map的大小,则重新设置Map的大小重新设置Ma......
  • 使用 NGINX 在 Kubernetes 中对 TCP 和 UDP 流量进行负载均衡
    原文作者:AmirRawdatofF5原文链接:​​​​使用NGINX在Kubernetes中对TCP和UDP流量进行负载均衡​​转载来源:NGINX官方网站除了HTTP流量之外,NGINXIngressCont......
  • 什么是负载均衡?高防DNS如何实现负载均衡?-中科三方
    在配置域名解析的时候,我们可以将一个域名指向多个IP吗?答案是可以的,这也是我们通过DNS实现负载均衡的常见做法。   一、什么是负载均衡? 一些大型的视频、游戏网站......
  • Zabbix监控Nginx
      在实际生产中会经常需要自定义一些各种中间件的监控项,自己一个个添加的话太繁琐了,之所以在zabbix官网和第三方网站都会提供大量的监控模板,有的写的非常可以,我们在生产中......
  • Nginx常用命令
    查看版本号./nginx-v启动./nginx查看状态ps-ef|grepnginx停止./nginx-sstop重启./nginx-sreload ......
  • SpringCloud-负载均衡和通信(Ribbon、Feign)
    1.Ribbon:负载均衡(基于客户端)1.1负载均衡以及RibbonRibbon是什么?SpringCloudRibbon是基于NetflixRibbon实现的一套客户端负载均衡的工具。简单的说,Ribbon是......
  • nginx: [emerg] no "events" section in configuration
    添加events,如下图http{includemime.types;default_typeapplication/octet-stream;keepalive_timeout65;server{listen80......
  • CentOS下nginx版本平稳升级记录
    起因:系统漏洞扫描出高危漏洞:CVE-2019-9513/CVE-2019-9511/CVE-2019-9516,需升级nginx。下载地址:https://nginx.org/en/download.html,选择了稳定版本1.22.1。将下载......
  • 在windows下导入react项目并且打包编译后部署到nginx上
     在windows下导入react项目并且打包编译后部署到nginx上一、安装npm二、创建react项目三、安装nginx四、总结最近接手了公司的一个django项目,这是应该前后端分......