为什么Nginx用这三个素数实现ip_hash负载平衡方法

时间:2018-10-22 11:52:26

标签: nginx primes

我注意到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地址,...

0 个答案:

没有答案