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

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

ha_strategy

ha_strategy = {random|nodeads|noerrors|roundrobin}

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

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

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

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

‹›
  • Example
Example
📋
ha_strategy = random

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

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

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

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

Изначально вероятности равны. На каждом шаге они масштабируются обратными значениями задержек, наблюдаемых в течение последнего периода кармы, а затем нормализуются заново. Например, если в первые 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% шанс быть выбранным в следующий период кармы, второе — 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