nginx upstream模块小分析

2017-05-10  本文已影响0人  鱼_cc1f

nginx upstream模块初始化分分析


for(j =0; j < server[i].naddrs; j++) {
  peer[n].sockaddr= server[i].addrs[j].sockaddr;   /*连接的服务器地址*/
  peer[n].socklen= server[i].addrs[j].socklen;  /*长度*/
  peer[n].name= server[i].addrs[j].name;  //donamin name  
  peer[n].weight= server[i].weight;  //权值
  peer[n].effective_weight= server[i].weight ;  //可影响的权值
  peer[n].current_weight=0; //当前的权值
  peer[n].max_fails= server[i].max_fails;  //最大的失败次数
  peer[n].fail_timeout= server[i].fail_timeout;  //超时时间
  peer[n].down= server[i].down;  //down机
  peer[n].server= server[i].name;  //服务名称
n++;

可以看得很清楚,nignx在做rr负载的时候,使用了几个参数 ,weight,current_weight,effevtive_weight,三个数据来计算节点的权值

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

每一次请求的时候,给的所有的effective_weight都是0,在每一次请求的时候,都会给各自的currevt_weight + 上effective_weight,在小于这一个值的时候,权值会再加+,直到小于所配定的权值。一个动态去调整的权值,保证整体的数据可以分流到各个服务上。若某台压力会比较大,就可以轻松的调整权值,等到压力小的时候,也可以自动的分配到原本timeout的节点。(所以为什么有的时候,请求周期长的服务器会请求量比其他的少一些。就是这个情况,因为请求生命周期太长)
再看一个配置的检测,关于配置了Backup的配置:

for (i = 0; i < us->servers->nelts; i++) {

if (server[i].backup) {

continue;

}

n += server[i].naddrs;

w += server[i].naddrs * server[i].weight;

}

if (n == 0) {

ngx_log_error(NGX_LOG_EMERG, cf->log, 0,

"no servers in upstream \"%V\" in %s:%ui",

&us->host, us->file_name, us->line);

return NGX_ERROR;

}

上面的代码用于reaload的时候,做配置检测,在检测的时候,会把backup的节点排除在外,若你的upstream里面只配置了backup的节点,就无法启动。而某个国内的开源的版本,少了上一段 ,所以在configTest的时候,少了上面这一段 (backup 的节点并不算实地的存活节点,在初始化的时候,作为链表放在单独的链表上了,backup->peer。 实际使用的是perrs->peer),会在实际reload nginx的时候,会导致nginx炸掉。。 项目质量很重要。。很重要。。很重要。。


源文件地址:
https://github.com/nginx/nginx/blob/branches/stable-1.10/src/http/ngx_http_upstream_round_robin.c 1.2

上一篇下一篇

猜你喜欢

热点阅读