Балансировка нагрузки включена по умолчанию для любой распределённой таблицы, использующей зеркалирование. По умолчанию запросы распределяются случайным образом между зеркалами. Вы можете изменить это поведение, используя ha_strategy.
ha_strategy = {random|nodeads|noerrors|roundrobin}
Стратегия выбора зеркала для балансировки нагрузки является опциональной и по умолчанию установлена в значение random.
Стратегия, используемая для выбора зеркала, или другими словами, выбора конкретного зеркального агента в распределённой таблице, контролируется этой директивой. По сути, эта директива управляет тем, как мастер выполняет балансировку нагрузки между настроенными зеркальными агентскими узлами. Реализованы следующие стратегии:
Режим балансировки по умолчанию — простое линейное случайное распределение между зеркалами. Это означает, что каждому зеркалу назначаются равные вероятности выбора. Это похоже на круговой алгоритм (round-robin, RR), но не накладывает строгий порядок выбора.
- Example
ha_strategy = randomПростая стратегия случайного выбора по умолчанию не учитывает статус зеркал, уровень ошибок и, что важнее всего, фактические задержки отклика. Чтобы справиться с неоднородными кластерами и временными пиками нагрузки на агентские узлы, существует группа стратегий балансировки, которые динамически регулируют вероятности на основе фактических задержек запросов, наблюдаемых мастером.
Адаптивные стратегии, основанные на вероятностях, взвешенных по задержкам, работают следующим образом:
- Статистика задержек накапливается блоками по ha_period_karma секунд.
- Вероятности, взвешенные по задержкам, пересчитываются один раз за период кармы.
- Флаг "живой или мёртвый" корректируется на каждый запрос, включая ping-запросы.
Изначально вероятности равны. На каждом шаге они масштабируются обратными значениями задержек, наблюдаемых в течение последнего периода кармы, а затем нормализуются заново. Например, если в первые 60 секунд после запуска мастера 4 зеркала показали задержки 10 мс, 5 мс, 30 мс и 3 мс соответственно, то первый шаг корректировки будет следующим:
- Исходные проценты: 0.25, 0.25, 0.25, 0.25.
- Наблюдаемые задержки: 10 мс, 5 мс, 30 мс, 3 мс.
- Обратные значения задержек: 0.1, 0.2, 0.0333, 0.333.
- Масштабированные проценты: 0.025, 0.05, 0.008333, 0.0833.
- Нормализованные проценты: 0.15, 0.30, 0.05, 0.50.
Это означает, что первое зеркало будет иметь 15% шанс быть выбранным в следующий период кармы, второе — 30%, третье (самое медленное, с задержкой 30 мс) — только 5%, а четвёртое и самое быстрое (3 мс) — 50%. После этого периода второй шаг корректировки снова обновит эти шансы и так далее.
Идея заключается в том, что как только наблюдаемые задержки стабилизируются, вероятности, взвешенные по задержкам, также стабилизируются. Все эти итерации корректировки призваны сходиться в точку, где средние задержки примерно равны для всех зеркал.
Вероятности, взвешенные по задержкам, но "мёртвые" зеркала исключаются из выбора. "Мёртвым" считается зеркало, которое вызвало несколько последовательных жестких ошибок (например, сбой сети или отсутствие ответа и т. п.).
- Example
ha_strategy = nodeadsВероятности, взвешенные по задержкам, но зеркала с худшим соотношением ошибок к успешным запросам исключаются из выбора.
- Example
ha_strategy = noerrorsПростой выбор круговым способом: сначала выбирается первое зеркало из списка, затем второе, затем третье и так далее, после чего процесс повторяется с начала списка. В отличие от рандомизированных стратегий, RR навязывает строгий порядок запросов (1, 2, 3, ..., N-1, N, 1, 2, 3, ..., и так далее) и гарантирует, что два последовательных запроса не будут отправлены на одно и то же зеркало.
- Example
ha_strategy = roundrobinha_period_karma = 2m
ha_period_karma определяет размер окна статистики агентских зеркал, в секундах (или с суффиксом времени). Опционально, по умолчанию 60.
Для распределённой таблицы с агентскими зеркалами сервер отслеживает несколько различных счётчиков для каждого зеркала. Эти счётчики затем используются для фейловера и балансировки. (Сервер выбирает лучшее зеркало на основе этих счётчиков.) Счётчики накапливаются блоками по ha_period_karma секунд.
После начала нового блока мастер всё ещё может использовать накопленные значения из предыдущего блока, пока новый блок не заполнится наполовину. Таким образом, любое предыдущая история перестаёт влиять на выбор зеркала спустя максимум 1.5 периода ha_period_karma.
Хотя для выбора зеркала используется не более 2 блоков, для целей инструментирования фактически хранится до 15 последних блоков. Их можно просмотреть с помощью оператора SHOW AGENT STATUS.
ha_ping_interval = 3s
Директива ha_ping_interval задаёт интервал между ping-запросами, отправляемыми агентским зеркалам, в миллисекундах (или с суффиксом времени). Эта опция является необязательной, по умолчанию значение равно 1000.
Для распределённой таблицы с агентскими зеркалами сервер шлёт всем зеркалам команду ping в периоды простоя, чтобы отслеживать их текущий статус (живы они или мертвы, время сетевого отклика и т. п.). Интервал между ping-запросами определяется настройкой ha_ping_interval.
Если вы хотите отключить ping-запросы, установите ha_ping_interval в 0.