1. 1
  2. 2
  3. 3
  4. 4
  5. 5

# конспект · шаг 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. Вернувшийся сервер сразу получает полную долю трафика.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.