# конспект · шаг 5 из 5
Конспект: методы балансировки
Группа серверов вместо одного адреса - и пять способов выбрать, кому уйдёт запрос.
Группа
upstream app {
server app-1:8000 weight=3; # получит втрое больше запросов
server app-2:8000; # weight=1 по умолчанию
}
location /api/ {
proxy_pass http://app; # имя группы вместо хоста
proxy_set_header Host $host; # иначе бэкенд увидит Host: app
}
Шесть методов
| Метод | Как выбирает | Когда |
|---|---|---|
| round-robin (по умолчанию) | по очереди с учётом весов | однородные бэкенды без состояния |
least_conn |
меньше всего активных соединений | запросы разной длительности |
least_time header |
меньше среднее время ответа | разное железо; открыт всем с 1.31 |
ip_hash |
по первым трём октетам адреса | липкость, когда сессия в памяти |
hash <ключ> |
по любому выражению ($request_uri, cookie) |
липкость по своему ключу |
random [two least_conn] |
случайно (или лучший из двух) | много балансировщиков перед общим пулом |
Плюс sticky cookie - с 1.29.6 он есть и в открытой версии, и это
единственная настоящая привязка: метка сервера живёт в куке клиента.
Что показал замер
| опыт | результат |
|---|---|
| пять долгих запросов заняли серверы неровно, следом шесть лёгких | round-robin раздал по кругу, least_conn отдал все шесть свободному |
ip_hash, меняем последний октет адреса |
сервер тот же |
ip_hash, меняем третий октет |
сервер меняется |
| добавили четвёртый сервер к трём, 300 ключей | hash перенёс 76% ключей, consistent - 26% |
consistent, раскладка ключей |
94 / 65 / 62 / 79 против ровных 77 / 73 / 73 / 77 у обычного |
Ловушки джокера
- Round-robin не знает, что сервер занят. Очередь общая по счёту, а не по
нагрузке: круг продолжает грузить тех, кто уже собрал долгие запросы. Лечит
least_conn. ip_hashза CDN бесполезен - все клиенты приходят с адресов CDN. Сначалаrealip, потомip_hash; лучше -sticky cookie, ему NAT не мешает.consistentпокупает устойчивость ценой ровности. Для кеширующего слоя это правильный размен, для раскидывания нагрузки - нет.- Липкость - не отказоустойчивость. Сервер выбыл - его клиенты перераспределены, сессии в памяти потеряны. Настоящее лечение - хранить их снаружи процесса.
backupнесовместим сhash,ip_hashиrandom: конфиг не соберётся,balancing method does not support parameter "backup".slow_startв открытой версии нет -invalid parameter. Вернувшийся сервер сразу получает полную долю трафика.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий