round-robin

Тема дорожной карты · Nginx

Round-robin — алгоритм балансировки нагрузки по умолчанию в Nginx, последовательно распределяющий входящие запросы между всеми работоспособными серверами, определёнными в блоке upstream, так что каждый бэкенд получает равную долю трафика с течением времени. Когда блок upstream перечисляет несколько серверов без дополнительных директив, Nginx автоматически применяет балансировку round-robin, циклически перебирая список по порядку для каждого нового соединения или запроса. Балансировка нагрузки round-robin в Nginx не имеет состояния и не требует дополнительной конфигурации помимо блока upstream, что делает её простейшим подходом для распределения нагрузки между однородными экземплярами бэкенда в конфигурации обратного прокси или API-шлюза. Для серверов с неодинаковой мощностью параметр weight модифицирует поведение round-robin, назначая более мощным серверам пропорционально больше запросов — например, server backend1 weight=3 заставляет Nginx отправлять три запроса на backend1 на каждый запрос к другим серверам с одинаковым весом. Round-robin хорошо подходит для приложений без состояния, где любой бэкенд может обработать любой запрос, но для рабочих нагрузок с прилипанием сессий следует рассмотреть IP hash или постоянство на основе куков.

Как это работает

round-robin распределяет трафик между upstream-backend. Методы: round-robin (дефолт), least_conn (наименьшее число активных соединений), ip_hash (sticky session по client IP), hash $request_uri consistent (consistent hashing для кешей). Помечайте backend как backup (backup) или down (down). Health checks: пассивный (помечает down после N сбоев через max_fails + fail_timeout); активный health check требует nginx-plus или third-party модулей.

Когда применять

least_conn лучше round-robin, когда время запросов варьируется (одни быстрые, другие медленные). ip_hash — только если backend реально нуждается в sticky session (stateless приложения нет). max_fails 3 fail_timeout 30s — для пометки нездоровых backend. Комбинируйте с health-эндпойнтом backend + реальным health check-тулом (Consul, k8s probes); пассивный health check грубый.

Типичные ошибки

Ловушки round-robin: ip_hash + клиенты за корпоративным NAT (все на один backend); нет таймаутов — зависший backend никогда не помечен down; round-robin на backend разной capacity (перегружают меньший); вообще нет health check (сбойный backend получает трафик до ручного вмешательства).

Связанные понятия

Полезные ресурсы