Балансировка нагрузки между несколькими приложениями, бэкендами и серверами является частью процесса оптимизации ресурсов, повышения производительности и отказоустойчивости сервиса.
Nginx в качестве балансировщика нагрузки
Этот веб-сервер считается одним из самых популярных и производительных решений, поскольку обладает самой широкой функциональностью и гибкостью при настройке. Поэтому Nginx часто используется для балансировки нагрузки.
Существует несколько подходов и реализаций, но сначала проверьте наличие модуля ngx_http_upstream_module:
1 | nginx -V |
Если он отсутствует, то вам придется перестроить Nginx, добавив этот модуль. После этого можно приступать к настройке веб-сервера. Чтобы включить балансировку, добавьте директиву upstream (секция http) в конфигурационный файл Nginx:
1 2 3 4 5 | upstream backend { server backend1.server.local; server backend2.server.local; server backend3.server.local; } |
Теперь необходимо указать перенаправление нужной группы:
1 2 3 4 5 | server { location / { proxy_pass http://backend; } } |
Кроме того, Nginx поддерживает дополнительные параметры и методы балансировки нагрузки.
Выбор метода балансировки
Nginx предлагает несколько методов балансировки нагрузки.
Round-robin
По умолчанию веб-сервер равномерно распределяет запросы между бэкендами (но с учетом веса). Это стандартный метод в Nginx, поэтому директива включения отсутствует.
least_conn
Запросы сначала отправляются на бэкенд с наименьшим количеством активных соединений (но с учетом веса):
1 2 3 4 5 | upstream backend { least_conn; server backend1.server.local; server backend2.server.local; } |
Хэш и IP-хэш
Используя этот метод, вы можете создать своего рода постоянное соединение между клиентами и бэкендами. Для каждого запроса Nginx вычисляет хэш, состоящий из текста, переменных веб-сервера или их комбинации, а затем сопоставляет его с бэкендами:
1 2 3 4 5 6 7 | upstream backend { hash $scheme$request_uri; server backend1.server.local; server backend2.server.local; server backend3.server.local; } |
IP-хэш работает только с HTTP, это предопределенная опция, в которой хэш вычисляется по IP-адресу клиента:
1 2 3 4 5 6 7 | upstream backend { ip_hash; server backend1.server.local; server backend2.server.local; server backend3.server.local; } |
Вес бэкенда
Если некоторые бэкенды в стеке мощнее других, то пригодятся веса:
1 2 3 4 5 6 | upstream backend { server backend1.server.local weight=10; server backend2.server.local weight=5; server backend3.server.local; server 192.168.0.122 backup; } |
В этом примере из каждых 16 запросов первый бэкенд обработает 10, второй - 5, а третий - 1. В этом случае резервный сервер будет получать запросы только в том случае, если три основных бэкенда будут недоступны.
Мониторинг
Если Nginx считает, что внутренний сервер недоступен, он временно прекращает отправку запросов к нему. За это отвечают две директивы:
max_fails - устанавливает количество неудачных попыток соединения, после которых бэкенд считается недоступным в течение определенного времени;
fail_timeout - время, в течение которого сервер считается недоступным.
Параметры выглядят следующим образом:
1 2 3 4 5 | upstream backend { server backend1.server.local; server backend2.server.local max_fails=3 fail_timeout=30s; server backend3.server.local max_fails=2; } |
Заключение
Выбор подходящего метода балансировки позволит более равномерно распределить нагрузку. Не забывайте о весах бэкенда, мониторинге и отказоустойчивости сервера.