Агенты зеркал могут использоваться взаимозаменяемо при обработке поискового запроса. Экземпляр(ы) Manticore, размещающий распределённую таблицу, где определены зеркалируемые агенты, отслеживает статус зеркал (активны или неактивны) и время отклика, а также выполняет автоматический failover и балансировку нагрузки на основе этой информации.
agent = node1|node2|node3:9312:shard2
Пример выше объявляет, что node1:9312, node2:9312 и node3:9312 имеют таблицу с именем shard2 и могут использоваться как взаимозаменяемые зеркала. Если любой из этих серверов выходит из строя, запросы будут распределяться между оставшимися двумя. Когда сервер снова становится доступен, основной узел обнаружит это и начнёт направлять запросы ко всем трём узлам снова.
Зеркало также может включать индивидуальный список таблиц, как показано ниже:
agent = node1:9312:node1shard2|node2:9312:node2shard2
Это работает аналогично предыдущему примеру, но при обращении к разным серверам будут использоваться разные имена таблиц. Например, node1shard2 будет использоваться при запросах к node1:9312, и node2shard будет использоваться при запросах к node2:9312.
По умолчанию все запросы направляются к лучшему из зеркал. Лучшее зеркало выбирается на основе последних статистических данных, контролируемых директивой конфигурации ha_period_karma. Основной узел хранит метрики (общее количество запросов, количество ошибок, время отклика и т.д.) для каждого агента и группирует их по временным интервалам. Карма — это длина временного интервала. Лучшее зеркало агента затем определяется динамически на основе последних двух таких временных интервалов. Конкретный алгоритм выбора зеркала можно настроить с помощью директивы ha_strategy.
Период кармы задан в секундах и по умолчанию равен 60 секундам. Основной узел хранит до 15 периодов кармы с метриками по каждому агенту для целей инструментирования (см. оператор SHOW AGENT STATUS). Однако для логики HA/LB используются только последние два периода.
При отсутствии запросов основной узел посылает регулярную команду ping каждые ha_ping_interval миллисекунд, чтобы собирать статистику и проверять, жив ли удалённый хост. Значение ha_ping_interval по умолчанию равно 1000 мс. Установка его в 0 отключает пинги, и статистика будет накапливаться только на основе реальных запросов.
Пример:
# sharding table over 4 servers total
# in just 2 shards but with 2 failover mirrors for each shard
# node1, node2 carry shard1 as local
# node3, node4 carry shard2 as local
# config on node1, node2
agent = node3:9312|node4:9312:shard2
# config on node3, node4
agent = node1:9312|node2:9312:shard1