Назад | Перейти на главную страницу

Как я могу равномерно распределить клиентов по серверам с помощью hash_ip в Nginx в качестве балансировщика нагрузки?

Я знаю, что Nginx может использовать hash_ip для привязки определенных клиентов к серверу.

Мой вопрос: когда Nginx выполняет хеширование с IP-адресом клиента, равномерно ли он распределяет клиентов по серверам независимо от того, какой IP-адрес клиента используется, или это может быть в зависимости от того, какой IP-адрес используется?

Если он зависит от IP-адреса клиента, как я могу равномерно распределить клиентов по серверу?

Кроме того, есть ли способ проверить хэш-таблицу, которую Nginx создает с помощью hash_ip?

У вас практически гарантировано неравномерное распределение, потому что клиентские IP-адреса не будут идеально хешироваться. Кроме того, частота запросов с этих клиентских IP-адресов также не будет идеально сбалансирована. Однако при достаточно большом количестве различных IP-адресов клиентов неравномерность будет относительно небольшой, и ее можно игнорировать для практических целей.

Если вам нужна абсолютная равномерность распределения, вы попадете в мир боли. Круговое распределение обеспечит равномерность запроса считать, однако это невероятно редкая система, в которой для обработки всех запросов требуется одинаковое количество времени, поэтому грузить на множестве бэкэндов с циклическим распределением не будет идеально. Вы можете несколько улучшить ситуацию с загрузкой, несмотря на сильно различающееся и непредсказуемое время обслуживания, за счет использования алгоритма маршрутизации с наименьшим количеством подключений, когда балансировщик нагрузки отправляет задание на бэкэнд с наименьшим количеством «незавершенных» рабочих мест, исходя из предположения, что каждое одновременное соединение вносит примерно равный вклад в мгновенную загрузку системы.

Для дальнейшего улучшения ситуации требуется использование одного из любого числа все более сложных алгоритмы планирования чтобы попытаться выровнять нагрузку, но без точных априорных знаний о ресурсах, необходимых для обслуживания каждого запроса, вы обречены на приближения. Обратите внимание, что, насколько мне известно, в nginx нет каких-либо расширенных алгоритмов планирования.

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

Да, это сложная проблема. Вот почему каждый просто настраивает свой балансировщик нагрузки для циклического перебора или минимального количества подключений, централизованно хранит свои сеансы и кэш и отправляется в паб.

Не уверен, что это все еще работает, но я наткнулся на это:

https://github.com/gnosek/nginx-upstream-fair