Зеркалирование

Агенты реплики могут использоваться взаимозаменяемо при обработке поискового запроса. Экземпляр Manticore, на котором размещена распределённая таблица с определёнными реплицированными агентами, отслеживает статус реплик (работают или нет) и время отклика, а также выполняет автоматическое переключение при сбое и балансировку нагрузки на основе этой информации.

Зеркала агента

agent = node1|node2|node3:9312:shard2

В приведённом выше примере объявляется, что node1:9312, node2:9312 и node3:9312 все имеют таблицу с именем shard2 и могут использоваться как взаимозаменяемые реплики. Если любой из этих серверов выйдет из строя, запросы будут распределены между оставшимися. Когда сервер вернётся в онлайн, мастер обнаружит это и снова начнёт направлять запросы ко всем репликам.

Зеркало также может включать индивидуальный список таблиц, как показано ниже:

agent = node1:9312:node1shard2|node2:9312:node2shard2

Это работает аналогично предыдущему примеру, но при запросе к разным серверам будут использоваться разные имена таблиц. Например, node1shard2 будет использоваться при запросе к node1:9312, а node2shard2 — при запросе к node2:9312.

По умолчанию выбор реплики использует глобальную или табличную стратегию ha_strategy. Если вы не зададите её явно, стратегия по умолчанию — random. Мастер хранит метрики, такие как общее количество запросов, количество ошибок и время отклика для каждого агента, и группирует их во временные интервалы, контролируемые параметром ha_period_karma. Затем эти статистические данные используются стратегиями балансировки, описанными в разделе Балансировка нагрузки.

Период кармы указывается в секундах и по умолчанию равен 60 секундам. Мастер хранит до 15 интервалов кармы со статистикой по агентам для целей инструментирования (см. SHOW AGENT STATUS). Однако для логики HA/LB используются только последние два интервала.

Когда запросов нет, мастер отправляет регулярную команду ping каждые ha_ping_interval для сбора статистики и проверки, жив ли ещё удалённый хост. ha_ping_interval по умолчанию равен 1000 мс. Установка значения 0 отключает пинги, и статистика будет накапливаться только на основе фактических запросов. Вместе с ha_period_karma это управляет тем, насколько быстро изменения в состоянии и задержке реплик влияют на балансировку нагрузки.

Реплики против шардов

Это различие важно:

  • Одна запись agent='host1|host2:table' означает один удалённый шард с реплицированными бэкендами.
  • Несколько записей agent='...' означают несколько удалённых шардов.

Например:

# one shard, two mirrors
agent = node1|node2:9312:products
# two shards
agent = node1:9312:products_a
agent = node2:9312:products_b

Определение реплик

Та же концепция репликации может быть настроена либо в конфигурационном файле, либо с помощью CREATE TABLE. Для TCP-соединений agent= должен использовать удалённый порт агента/API (обычно 9312), а не порт MySQL (9306). Если вы хотите конкретную политику балансировки только для одной распределённой таблицы, установите ha_strategy для этой таблицы, а не полагайтесь только на глобальные настройки по умолчанию.

‹›
  • Config
  • SQL
📋
table products_dist {
  type = distributed
  agent = 127.0.0.1:9312|127.0.0.1:9313:products
  ha_strategy = roundrobin
}

Предположим, что реплицированные таблицы уже существуют, например:

‹›
  • SQL
SQL
📋
CREATE TABLE products_dist type='distributed'
  agent='127.0.0.1:9312:products|127.0.0.1:9313:products'
  ha_strategy='roundrobin';

Используйте распределённую таблицу как обычно с мастера, затем проверьте, как она была сохранена и как ведут себя реплики.

‹›
  • SQL
SQL
📋
SELECT id, title, node FROM products_dist;
SHOW CREATE TABLE products_dist;
SHOW AGENT STATUS;
‹›
Response
+------+------------+-------+
| id   | title      | node  |
+------+------------+-------+
|    1 | same title | node1 |
+------+------------+-------+
+---------------+----------------------------------------------------------------------------------+
| Table         | Create Table                                                                     |
+---------------+----------------------------------------------------------------------------------+
| products_dist | CREATE TABLE products_dist type='distributed' agent='127.0.0.1:9312:products|... |
+---------------+----------------------------------------------------------------------------------+

Пример шардирования таблицы на 4 сервера в общей сложности, в 2 шарда с 2 репликами для каждого шарда.

‹›
  • Config
Config
📋
# 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
Last modified: May 22, 2026