我注意到Nginx选择了3个质数89、113和6271来实现ip_hash负载平衡方法,为什么要使用这3个质数?
这不仅比% number of servers
还公平吗?
$ factor 89 113 6271
89: 89
113: 113
6271: 6271
// https://github.com/nginx/nginx/blob/4bf4650f2f10f7bbacfe7a33da744f18951d416d/src/http/modules/ngx_http_upstream_ip_hash_module.c
static ngx_int_t
ngx_http_upstream_init_ip_hash_peer(ngx_http_request_t *r,
ngx_http_upstream_srv_conf_t *us)
{
// ...
ngx_http_upstream_ip_hash_peer_data_t *iphp;
iphp = ngx_palloc(r->pool, sizeof(ngx_http_upstream_ip_hash_peer_data_t));
// ...
iphp->hash = 89;
// ...
}
static ngx_int_t
ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc, void *data)
{
// ...
for ( ;; ) {
for (i = 0; i < (ngx_uint_t) iphp->addrlen; i++) {
hash = (hash * 113 + iphp->addr[i]) % 6271;
}
// ...
}
// ...
iphp->hash = hash;
}
如文档所述,“将客户端IPv4地址的前三个八位字节或整个IPv6地址用作哈希密钥。”,因此,我们有一个IPv4地址iphp->addrlen = 3
和{ {1}}是IPv4地址的第一个八位位组,iphp->addr[0]
是第二个IPv4地址,...