Балансировка нагрузки

Балансировка нагрузки включена по умолчанию для любой распределённой таблицы, которая использует зеркалирование. По умолчанию запросы распределяются случайным образом между зеркалами. Вы можете изменить это поведение, используя ha_strategy.

ha_strategy

ha_strategy = {random|nodeads|noerrors|roundrobin}

Стратегия выбора зеркала для балансировки нагрузки является необязательной и по умолчанию установлена в random.

Стратегия, используемая для выбора зеркала, или, другими словами, выбора конкретного агентского зеркала в распределённой таблице, контролируется этой директивой. По сути, эта директива управляет тем, как мастер выполняет балансировку нагрузки между настроенными агентскими узлами зеркал. Реализованы следующие стратегии:

Простая случайная балансировка

Режим балансировки по умолчанию — простое линейное случайное распределение между зеркалами. Это означает, что каждому зеркалу назначаются равные вероятности выбора. Это похоже на круговой обход (round-robin, RR), но не накладывает строгий порядок выбора.

‹›
  • Example
Example
📋
ha_strategy = random

Адаптивная рандомизированная балансировка

Простая стратегия случайного выбора по умолчанию не учитывает состояние зеркал, уровень ошибок и, что самое важное, фактические задержки отклика. Чтобы справиться с неоднородными кластерами и временными пиками нагрузки на агентские узлы, существует группа стратегий балансировки, которые динамически корректируют вероятности на основе фактических задержек запросов, наблюдаемых мастером.

Адаптивные стратегии, основанные на вероятностях, взвешенных по задержкам, работают следующим образом:

  1. Статистика задержек накапливается блоками по ha_period_karma секунд.
  2. Вероятности, взвешенные по задержкам, пересчитываются один раз за период karma.
  3. Флаг "живой или мёртвый" корректируется один раз за запрос, включая ping-запросы.

Изначально вероятности равны. На каждом шаге они масштабируются обратно пропорционально задержкам, наблюдаемым за последний период karma, а затем нормализуются. Например, если в первые 60 секунд после запуска мастера 4 зеркала имели задержки 10 мс, 5 мс, 30 мс и 3 мс соответственно, первый шаг корректировки будет следующим:

  1. Начальные проценты: 0.25, 0.25, 0.25, 0.25.
  2. Наблюдаемые задержки: 10 мс, 5 мс, 30 мс, 3 мс.
  3. Обратные задержки: 0.1, 0.2, 0.0333, 0.333.
  4. Масштабированные проценты: 0.025, 0.05, 0.008333, 0.0833.
  5. Нормализованные проценты: 0.15, 0.30, 0.05, 0.50.

Это означает, что первое зеркало будет выбрано с вероятностью 15% в течение следующего периода karma, второе — с вероятностью 30%, третье (самое медленное с 30 мс) — только с 5%, а четвёртое и самое быстрое (3 мс) — с 50%. После этого периода второй шаг корректировки снова обновит эти вероятности и так далее.

Идея в том, что как только наблюдаемые задержки стабилизируются, вероятности, взвешенные по задержкам, также стабилизируются. Все эти итерации корректировки предназначены для сходимости к точке, где средние задержки примерно равны для всех зеркал.

nodeads

Вероятности, взвешенные по задержкам, но мёртвые зеркала исключаются из выбора. "Мёртвым" зеркалом считается зеркало, которое вызвало несколько последовательных серьёзных ошибок (например, сбой сети или отсутствие ответа и т. п.).

‹›
  • Example
Example
📋
ha_strategy = nodeads

noerrors

Вероятности, взвешенные по задержкам, но зеркала с худшим соотношением ошибок и успешных ответов исключаются из выбора.

‹›
  • Example
Example
📋
ha_strategy = noerrors

Балансировка круговым обходом (Round-robin)

Простой выбор по круговому обходу, то есть выбор первого зеркала в списке, затем второго, затем третьего и так далее, а после достижения последнего зеркала процесс повторяется. В отличие от рандомизированных стратегий, RR накладывает строгий порядок запросов (1, 2, 3, ..., N-1, N, 1, 2, 3, ... и так далее) и гарантирует, что два последовательных запроса не будут отправлены одному и тому же зеркалу.

‹›
  • Example
Example
📋
ha_strategy = roundrobin

Глобальные параметры

ha_period_karma

ha_period_karma = 2m

ha_period_karma определяет размер окна статистики агентских зеркал в секундах (или с суффиксом времени). Опционально, по умолчанию 60.

Для распределённой таблицы с агентскими зеркалами сервер отслеживает несколько различных счётчиков для каждого зеркала. Эти счётчики затем используются для отказоустойчивости и балансировки. (Сервер выбирает лучшее зеркало на основе счётчиков.) Счётчики накапливаются блоками по ha_period_karma секунд.

После начала нового блока мастер может использовать накопленные значения из предыдущего блока, пока новый блок не заполнится наполовину. Таким образом, любая предыдущая история перестаёт влиять на выбор зеркала максимум через 1.5 раза ha_period_karma секунд.

Хотя для выбора зеркала используется максимум 2 блока, до 15 последних блоков фактически сохраняются для целей инструментирования. Их можно просмотреть с помощью оператора SHOW AGENT STATUS.

ha_ping_interval

ha_ping_interval = 3s

Директива ha_ping_interval определяет интервал между ping-запросами, отправляемыми агентским зеркалам, в миллисекундах (или с суффиксом времени). Этот параметр опционален, значение по умолчанию — 1000.

Для распределённой таблицы с агентскими зеркалами сервер отправляет всем зеркалам команду ping в периоды простоя, чтобы отслеживать их текущее состояние (живы они или мертвы, время сетевого отклика и т. п.). Интервал между ping-запросами определяется настройкой ha_ping_interval.

Если вы хотите отключить ping-запросы, установите ha_ping_interval в 0.

Last modified: August 28, 2025