Я заметил, что 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]
- второй, ...