Почему паттерны трафика требуют разных алгоритмов
Каждый классический алгоритм опирается на допущение о vService, которому он служит. Round-robin считает бэкенды взаимозаменяемыми. Least-connections считает, что количество сессий коррелирует с нагрузкой на бэкенд. Source-IP предполагает привязку пользователя к бэкенду без явной персистентности. Cache-affinity хэши считают, что ключ запроса — URL, заголовок или сессия — стабилен. Когда допущение справедливо, алгоритм даёт правильный ответ.
Трудные случаи — когда допущения перестают работать: бэкенды «дрейфуют» по производительности в течение рабочего дня, поколения оборудования смешиваются при rolling-обновлении, региональная задержка меняется от запроса к запросу, или у рабочей нагрузки есть пиковые тяжёлые запросы, не коррелирующие с числом запросов. В таких сценариях выбор реально самого быстрого бэкенда для каждого запроса — или использование hash-алгоритма, поглощающего изменения бэкендов без перераспределения всего — сохраняет видимую пользователю задержку.
Правильный ответ — сопоставить алгоритм с рабочей нагрузкой — per vService, а не глобально.
Выбор алгоритма, per vService
vService в TR7 объединяет frontend-слушатель, правила трафика, проверки работоспособности и группу бэкендов в единый объект конфигурации — шире, чем классическая концепция pool, разносящая эти компоненты по разным местам. Каждый vService выбирает собственный алгоритм из выпадающего списка — без пересборки, без перезапуска. Комбинируйте на одном экземпляре TR7: round-robin на vService статических ресурсов, Fastest+ на vService API, Maglev hash на vService кэш-уровня. Фильтрация по типу сервиса происходит автоматически; UI показывает только алгоритмы, подходящие для протокола vService.
Алгоритм per vService
Выбор алгоритма живёт в объекте vService, а не в глобальной конфигурации ADC. Разные vService работают с разными алгоритмами на одном экземпляре TR7.
Фильтрация с учётом протокола
UI показывает только алгоритмы, имеющие смысл для протокола vService — HTTP, TCP или сетевые vService каждый получают свой подмножество, никаких догадок оператора.
Совместим с персистентностью сессий
Алгоритм выбирает бэкенд для первого запроса; персистентность сессий затем закрепляет последующие запросы того же пользователя. Оба уровня настраиваются независимо per vService.
Горячая замена (без перезапуска)
Измените алгоритм на работающем vService — трафик немедленно перейдёт на новую логику. Перезапуск сервиса не нужен, drain соединений не требуется.
14 алгоритмов в составе TR7 ADC
Каждый классический алгоритм, два современных варианта consistent hash, один алгоритм наименьшей задержки, плюс фирменный движок Fastest+ от TR7. Все доступны per vService — выбираются из выпадающего списка, конфигурационный код не нужен.
Round-robin (взвешенный + статический)
Равномерное распределение по vService, взвешенное или без весов. Стандартный вариант по умолчанию для однородных vService, где каждый бэкенд имеет одинаковую ёмкость.
Least-connections (взвешенный)
Маршрутизирует к бэкенду с наименьшим числом текущих открытых соединений. Высокоэффективен для долгоживущих сессий, где число сессий коррелирует с нагрузкой на бэкенд. Взвешенный вариант учитывает различия в ёмкости.
Наименьшее время отклика
Направляет на сервер, который отвечает быстрее всех прямо сейчас; измерение непрерывное, а не выборочное. Подходит для пулов, где ёмкость одинакова, но задержка на узлах плавает — прогревающийся кэш, узел под нагрузкой GC, шумный сосед.
Наименьшая полоса
Направляет на сервер, который в данный момент передаёт меньше всего трафика. Верный критерий там, где ответы различаются размером, а не количеством — медиа, загрузка файлов, выгрузка отчётов, — где число соединений ничего не говорит о реальной нагрузке.
First-available
Всегда маршрутизирует к первому в списке бэкенду с ёмкостью; переходит к следующему только при перегрузке. Полезен для упорядочивания бэкендов «горячий → холодный» или поэтапных развёртываний.
Random
Случайный выбор среди здоровых бэкендов. Без состояния, статистически равномерен — полезен для больших однородных vService. Поддерживает power-of-two random для выбора наименее загруженного с минимальными накладными расходами.
Source-IP hash
Один и тот же клиентский IP всегда маршрутизируется к одному и тому же бэкенду. Полезен для сессионных потоков, когда приложение не управляет явной персистентностью сессий.
URL hash (URI / URL-параметр)
Хэш по компоненту URL — длине URL, пути URI или конкретному query-параметру (например, ?user_id). Маршрутизирует один и тот же URL или пользователя к одному бэкенду для кэш-аффинности.
Header hash
Хэш по пользовательскому HTTP-заголовку. Полезен для мультитенантной маршрутизации (заголовок tenant-id), feature-флагов или A/B-тестирования.
RDP cookie hash
Считывает cookie RDP-сессии для выбора бэкенда. Полезен для RDP-шлюзов и ферм удалённых рабочих столов, где требуется сессионная аффинность.
Consistent hash
Современный режим хэширования, минимизирующий сбои при добавлении или уходе бэкендов — перераспределяется лишь малая доля ключей, а не весь vService. Подходит для кэш-уровней, где ротация бэкендов не должна инвалидировать весь кэш.
Maglev hash
Алгоритм consistent-хэширования от Google, созданный для программных балансировщиков нагрузки в масштабе. Меньший разброс, чем у классического consistent hash, детерминированный по репликам. Отлично подходит для stateless-сервисов, которым нужна предсказуемая привязка к бэкенду.
SED — Shortest Expected Delay
Маршрутизирует к бэкенду с наименьшим ожидаемым временем ожидания, учитывая активные соединения и вес per бэкенд. Латентно-осознанная альтернатива least-connections, когда ёмкости бэкендов существенно различаются.
Fastest
Маршрутизирует к бэкенду с наименьшим недавним временем отклика. Более простой латентно-осознанный вариант, когда время отклика — единственный значимый сигнал.
Fastest+
Фирменный двухступенчатый движок TR7. Оператор выбирает два из восьми живых сигналов сервиса — время отклика, время соединения, заполненность очереди, частоту ошибок и другие; Fastest+ по первичному сигналу сужает круг кандидатов, а вторичным сигналом разделяет оставшихся в равенстве. Подробности см. в разделе деталей ниже.
Fastest+ — двухступенчатый движок TR7, настраиваемый оператором
Большинство адаптивных алгоритмов отслеживают один сигнал — время отклика или количество соединений. Fastest+ позволяет оператору выбрать два из восьми живых сигналов сервиса: первичный сигнал сужает круг кандидатов до бэкендов с лучшей оценкой, а вторичный сигнал разделяет оставшихся в равенстве. Бэкенды в режиме обслуживания и с неподходящим состоянием работоспособности отсеиваются автоматически, а когда достаточно одного критерия, доступен односигнальный режим. Вот те восемь сигналов, из которых можно выбирать:
Время отклика
Средняя задержка отклика от бэкенда, сэмплируется непрерывно. Основной сигнал — бэкенд, у которого увеличивается время ответа, немедленно опускается в рейтинге.
Время соединения
Время установки TCP/TLS-соединения. Бэкенд, у которого растёт время соединения, приближается к насыщению — даже если время отклика ещё выглядит нормально.
Время в очереди
Время, которое запросы проводят в очереди до достижения бэкенда. Рост времени в очереди — самый ранний признак того, что бэкенд не справляется.
Активные сессии
Текущие открытые сессии per бэкенд. Маршрутизация с учётом ёмкости без шума от исторических итогов.
Глубина активной очереди
Запросы, ожидающие в данный момент. Бэкенд с 0 в очереди предпочтительнее одинаково быстрого с 50 ожидающими.
Ошибки соединений
Недавние неудачные соединения. Бэкенд, отклонивший 3 из последних 10 попыток, опускается в рейтинге раньше, чем это заметит проверка работоспособности.
Прерывания на стороне сервера
Прерывания сессий, инициированные бэкендом в недавнем окне. Фиксирует случай, когда бэкенд жив, но отказывает на полпути.
Использованные соединения
Утилизация пула соединений — насколько близко к ёмкости keep-alive пул каждого бэкенда. Обнаруживает исчерпание пула до того, как оно станет заметно пользователю.
Четырнадцать на Layer 7, одиннадцать на уровне пакетов
На Layer 7 решение принимается по содержимому запроса: заголовок, путь, cookie, живое время отклика. На Layer 4 — по пакету, ещё до того как трафик поднимется на прикладной уровень: именно там максимальная пропускная способность. В обоих случаях алгоритм выбирается для каждой службы и меняется на работающем устройстве.
Layer 7 — 14 критериев выбора
Layer 4 — 11 планировщиков на уровне пакетов
Когда каждый алгоритм себя проявляет
Однородные vService
Идентичные бэкенды, одинаковая ёмкость — round-robin сохраняет простоту математики и симметрию нагрузки. Добавьте random для больших stateless vService.
Долгоживущие сессии
WebSocket'ы, стриминговые сервисы, видеозвонки — сессии остаются открытыми минутами или часами. Least-connections или SED отслеживают активную нагрузку значительно лучше, чем счётчик запросов.
vService кэш-уровня
Ротация бэкендов не должна инвалидировать весь кэш. Consistent hash или Maglev перераспределяет лишь малую долю ключей при изменении бэкендов.
Разнородная или переменная нагрузка
Смешанное оборудование, rolling-развёртывания, региональный разброс задержек — Fastest+ оценивает бэкенды вживую, так что маршрутизация выбирает реально самый быстрый, а не теоретически лучший.
Часто задаваемые вопросы
Могу ли я изменить алгоритм без перезапуска сервиса?
Как Fastest+ соотносится с least-connections?
Как выбрать между Consistent hash и Maglev hash?
Что SED делает того, чего не делает least-connections?
Требует ли выбор алгоритма внешнего мониторинга или интеграции APM?
Какой алгоритм используется по умолчанию?
Сопоставьте алгоритм с рабочей нагрузкой
Посмотрите, как TR7 ADC позволяет задавать алгоритм per vService — и как Fastest+ справляется с рабочими нагрузками, с которыми другие не справляются.