Учитывает ли Nginx атрибут веса при последовательном хешировании?

Точнее, это сработает?

upstream backend {
    hash $request_uri consistent;

    server backend1.example.com weight=1;
    server backend2.example.com weight=2;
}

получит ли backend2.example.com вдвое больше трафика?

А также, что произойдет, если изменится вес или к смеси будет добавлен другой сервер. Сохранится ли "только несколько ключей будет переназначено"?

Необязательный параметр согласованности хеш-директивы включает согласованную балансировку хеш-нагрузки кетама. Запросы будут равномерно распределяться по всем вышестоящим серверам на основе заданного пользователем значения хешированного ключа. Если вышестоящий сервер добавляется или удаляется из вышестоящей группы, только несколько ключей будут переназначены, что минимизирует промахи кеша в случае балансировки нагрузки кеш-серверов и других приложений, которые накапливают состояние.

из https://www.nginx.com/resources/admin-guide/load-balancer/


person mihaic    schedule 02.02.2017    source источник
comment
Я немного поэкспериментировал с этим, и похоже, что атрибут веса соблюдается. backend2.example.com действительно получает удвоенный трафик (ну, конечно, с учетом request_uri). Все еще не уверен насчет переназначения.   -  person mihaic    schedule 08.03.2017
comment
оп, есть обновления по этому поводу?   -  person adiggo    schedule 05.01.2018


Ответы (1)


В этой конфигурации согласованный хэш более важен, чем вес.

Другими словами, если один восходящий поток представляет и вес, и согласованный хеш, тогда главным будет согласованный хеш.

И хэши распределяются по серверам в зависимости от веса.

upstream consistent_test {
    server consistent_test.example.ru:80 weight=90;
    server consistent_test2.example.ru:80 weight=10;
    hash $arg_consistent consistent;
}

Эксперимент

1) Состояние по умолчанию

upstream balancer_test {

hash $arg_someid consistent;
server server1.example.ru:8080;
server server2.example.ru:8080;
server server3.example.ru:8080 down;

}

Хэши запросов прикреплены к хостам:

server1.example.ru ==> 535

server2.example.ru ==> 462

server3.example.ru ==> 0

2) Первый шаг: включите узел и установите вес

upstream balancer_test {

hash $api_sessionid consistent;
server server1.example.ru:8080 weight=250;
server server2.example.ru:8080 weight=500;
server server3.example.ru:8080 weight=250;

}

Хэши запросов прикреплены к хостам:

server1.example.ru:8080 ==> 263

server2.example.ru:8080 ==> 473

server3.example.ru:8080 ==> 254

3) Второй шаг: Закончить трансляцию трафика и отключить старый узел

upstream balancer_test {

hash $api_sessionid consistent;
server1.example.ru:8080 down;
server2.example.ru:8080;
server3.example.ru:8080;

}

Хэши запросов прикреплены к хостам:

server1.example.ru:8080 ==> 0

server2.example.ru:8080 ==> 533

server3.example.ru:8080 ==> 464

server1.example.ru:

1) before = 463

2) на шаге_2 = 533

3) хеш-хиты = 306

server2.example.ru:

1) before = 536

2) на шаге_1 = 263

3) хеш-хиты = 148

server3.example.ru:

1) before = 255

2) на шаге 1 = 464

3) хеш-хиты = 115

person therb1    schedule 14.11.2018