Начиная с версии 2.8.2 доступна новая крупная функция — репликация для percolate индексов.
Репликация основана на библиотеке Galera (также используемой в форке MySQL от Percona и MariaDB). Мы посчитали, что лучше использовать проверенное решение, чем изобретать велосипед и строить всё с нуля, что заняло бы гораздо больше времени.
Почему только для percolate индексов? Percolate индекс — это модифицированный Real-Time индекс, который легче манипулировать, поэтому он лучше подходит для первоначального тестирования. Но следите за новостями — следующим шагом будет добавление поддержки репликации для Real-Time индексов!
Как это меня касается, если я не хочу использовать репликацию? Функция репликации включена в официальные пакеты, но если вы не планируете её использовать, ничто не помешает вам обновиться до последней версии Manticore. Если вы собираете Manticore самостоятельно, требования к сборке изменились. Обратитесь к документации за подробностями.
Кластеры репликации основаны на индексах. После определения кластера вы можете добавить к нему percolate индексы.
Репликация является мульти-мастерной и синхронной. Это означает, что вы можете писать в любой узел, и изменения сразу же распространятся на все узлы кластера.
<img src="manticore-replication-optimized.webp" alt="img">
Настройка репликации
Требования:
Порт API listen должен быть открыт на выделенном интерфейсе (не 0.0.0.0).
Диапазон портов, открытых на выделенном интерфейсе для репликации. Рекомендуется использовать как минимум 2 порта на кластер.
Открытый порт SphinxQL для выполнения команд по настройке узла.
data_dir должен быть указан в конфигурации searchd. Это необходимо для временных данных репликации.
Опционально:
- server_id — уникальный номер для каждого узла, используемый для инициализации UUID; если не указан, daemon сгенерирует его на основе MAC-адреса
Конфигурация searchd должна выглядеть так:
searchd {
listen = 9306:mysql41
listen = my_ip1:9312
listen = my_ip1:9350-9459:replication
...
data_dir = /var/lib/manticore/data_dir
server_id = 1
...
}
На первом узле мы подключаемся к нему с помощью SphinxQL и создаём кластер:
mysql> CREATE CLUSTER test;
Альтернативно вы можете указать узлы, которые будут подключаться к новому кластеру. Помимо IP необходимо также указать порт API.
mysql> CREATE CLUSTER test 'my_ip1:9312,my_ip2:9312,my_ip3:9312' as nodes;
Определённый список узлов используется при перезапуске кластера. Если узлы не были указаны при создании или добавлены новые узлы, необходимо выполнить команду ALTER CLUSTER cluster_name UPDATE nodes, чтобы обновить список всех активных узлов; иначе при перезапуске узлы, отсутствующие в списке, придётся добавлять обратно в кластер вручную.
Далее мы подключаемся к другим узлам и присоединяем их к кластеру, связывая их с существующим узлом (используя его IP и порт API):
mysql> JOIN CLUSTER test AT 'my_ip1:9312';
На данный момент кластер определён, и следующим шагом является добавление в него индекса (или нескольких). Это можно сделать с любого узла:
mysql> ALTER CLUSTER test ADD pq1;
Чтобы добавить новые сохранённые запросы в индекс pq1, наш обычный INSERT‑запрос требует небольшого изменения: необходимо добавить префикс имени индекса с именем кластера:
mysql> INSERT INTO test:pq1 VALUES('samsung');
Префикс кластера требуется только для операторов записи (INSERT, REPLACE, DELETE, TRUNCATE). Операторы чтения (CALL PQ, SELECT и DESCRIBE) могут использовать обычное имя индекса.
Что дальше?
Для получения более подробной информации обо всех параметрах репликации см. документацию .
В наших онлайн‑курсах вы можете найти курс введение в репликацию и простой курс по восстановлению после отказа .
На момент написания этой статьи репликация для RealTime индексов находится в разработке.