Почему Nginx реализует метод балансировки нагрузки ip_hash с этими тремя простыми числами - PullRequest
0 голосов
/ 22 октября 2018

Я заметил, что 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, а iphp->addr[0] - первый октет адреса IPv4, iphp->addr[1] - второй, ...

...