nginx upstream模块初始化分分析
- 现在项目越来越多的用到了现在nginxtcp和udp的proxy功能,配置简单,也非常的好用,但在好用的同时,也有一些注意的地方,特别是配置方面。我们来看看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