Manticore Search (как и Sphinx) пока не поддерживает репликацию обычных или RT‑индексов «из коробки» (хотя мы работаем над этим, если вы хотите стать бета‑тестером, дайте нам знать по адресу [email protected] ), поэтому вам придётся реализовать её самостоятельно, если вам нужна копия ваших данных Manticore Search / Sphinx где‑нибудь ещё. Почему это может понадобиться:
- масштабируемость: вы хотите распределять нагрузку на ваши серверы (например, можно отправлять половину всех запросов Manticore на один сервер, а остальное — на другой), чтобы увеличить пропускную способность, уменьшить задержку или нагрузку на серверы
- высокая доступность: вы хотите иметь реплики индексов Manticore, которые будут сразу доступны, как только основное хранилище Manticore станет недоступным по какой‑то причине
- вы хотите объединить оба вышеупомянутых подхода с автоматическим обнаружением проблем и переключением между серверами (например, когда один сервер падает, другой автоматически начинает обрабатывать все запросы)
Самый простой способ репликации обычных индексов — просто скопировать конфигурацию Manticore на другой сервер и проиндексировать всё там с помощью 'indexer', но в этом случае есть недостатки: во‑первых, это трата ресурсов, необходимых для перестройки индекса, а во‑вторых сложно обеспечить хороший уровень синхронизации данных: обычные индексы Manticore будут перестраиваться отдельно от одного и того же источника (например, вашей основной базы данных), они в итоге должны быть идентичными, но это может происходить с некоторой задержкой, потому что один сервер может быть более загружен или вы интенсивно обновляете источник, могут быть разные причины.
Вот как мы можем сделать это иначе, чтобы гарантировать, что реплики будут 100 % идентичными, а задержка появления данных будет минимальной:
- выполнять индексацию только в одном месте (назовём его MASTER)
- использовать rsync или что‑то ещё для копирования на SLAVEs (или с MASTER, если вы запускаете его на слейвах)
- сообщить Manticore во всех местах, что он должен начать использовать новые перестроенные данные
Вот пример того, как это может выглядеть:
Индексация на мастере
Трюк здесь в том, чтобы создать новый «псевдо»‑индекс, полностью наследующий ваш обычный индекс, изменив только «path» (см. idx_new ниже):
index idx {
path = sphinx_tmp/idx
source = src
}
index idx_new:idx {
path = sphinx_tmp/idx_new
}
«Новый» индекс может называться иначе или иметь другой путь — это не важно, нам просто нужно знать, куда будет помещён новый индекс.
Создайте «новый» индекс:
[snikolaev@dev01 ~]$ indexer -c sphinx_replication.conf idx_new
Manticore 2.6.1 9a706b4@180119 dev
Copyright (c) 2001-2016, Andrew Aksyonoff
Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com)
Copyright (c) 2017-2018, Manticore Software LTD (http://manticoresearch.com)
using config file 'sphinx_replication.conf'...
indexing index 'idx_new'...
collected 3 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 3 docs, 29 bytes
total 0.004 sec, 7045 bytes/sec, 728.86 docs/sec
total 7 reads, 0.000 sec, 13.7 kb/call avg, 0.0 msec/call avg
total 12 writes, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg
После этого в каталоге индексов у вас должно появиться что‑то вроде этого:
[snikolaev@dev01 ~]$ ls -la sphinx_tmp/
total 460
drwxrwxr-x 2 snikolaev snikolaev 4096 Feb 26 01:09 .
drwx------+ 149 snikolaev snikolaev 405504 Feb 26 01:09 ..
-rw-r--r-- 1 snikolaev snikolaev 112 Feb 26 01:09 idx_new.spa
-rw-r--r-- 1 snikolaev snikolaev 24 Feb 26 01:09 idx_new.spd
-rw-r--r-- 1 snikolaev snikolaev 1 Feb 26 01:09 idx_new.spe
-rw-r--r-- 1 snikolaev snikolaev 363 Feb 26 01:09 idx_new.sph
-rw-r--r-- 1 snikolaev snikolaev 57 Feb 26 01:09 idx_new.spi
-rw-r--r-- 1 snikolaev snikolaev 0 Feb 26 01:09 idx_new.spk
-rw-r--r-- 1 snikolaev snikolaev 0 Feb 26 01:09 idx_new.spm
-rw-r--r-- 1 snikolaev snikolaev 8 Feb 26 01:09 idx_new.spp
-rw-r--r-- 1 snikolaev snikolaev 35 Feb 26 01:09 idx_new.sps
-rw-r--r-- 1 snikolaev snikolaev 112 Feb 26 01:07 idx.spa
-rw-r--r-- 1 snikolaev snikolaev 24 Feb 26 01:07 idx.spd
-rw-r--r-- 1 snikolaev snikolaev 1 Feb 26 01:07 idx.spe
-rw-r--r-- 1 snikolaev snikolaev 363 Feb 26 01:07 idx.sph
-rw-r--r-- 1 snikolaev snikolaev 57 Feb 26 01:07 idx.spi
-rw-r--r-- 1 snikolaev snikolaev 0 Feb 26 01:07 idx.spk
-rw------- 1 snikolaev snikolaev 0 Feb 26 01:09 idx.spl
-rw-r--r-- 1 snikolaev snikolaev 0 Feb 26 01:07 idx.spm
-rw-r--r-- 1 snikolaev snikolaev 8 Feb 26 01:07 idx.spp
-rw-r--r-- 1 snikolaev snikolaev 35 Feb 26 01:07 idx.sps
idx.* — это файлы вашего обычного индекса, а idx_new.* — файлы «нового» индекса.
Копирование индекса
Теперь, когда новый индекс построен, вам нужно доставить его во все места, где он должен работать. Вы можете использовать любой удобный вам способ: rsync, scp, ftp, samba и т.д.
scp sphinx_tmp/idx_new.sp* SLAVE:sphinx_tmp/
Ротация индексов
Теперь, когда ваш индекс распространён на все слейвы, остаётся лишь выполнить ротацию индекса, чтобы новый занял место. Ранее Sphinx позволял делать это только посылая сигнал HUP процессу searchd или перезапуская его. Начиная с Sphinx 2.3.1 и в Manticore Search доступна команда RELOAD INDEX , которая позволяет ротировать индекс через SphinxQL и, что более важно, передавать путь, где searchd должен найти файлы индекса, например в нашем случае:
[snikolaev@dev01 ~]$ mysql -P9314 -h0 -e "RELOAD INDEX idx FROM 'sphinx_tmp/idx_new'"
После этого вы можете увидеть, что файлы «нового» индекса исчезают из каталога:
[snikolaev@dev01 ~]$ ls -la sphinx_tmp/
total 432
drwxrwxr-x 2 snikolaev snikolaev 4096 Feb 26 01:15 .
drwx------+ 149 snikolaev snikolaev 405504 Feb 26 01:09 ..
-rw-r--r-- 1 snikolaev snikolaev 112 Feb 26 01:09 idx.spa
-rw-r--r-- 1 snikolaev snikolaev 24 Feb 26 01:09 idx.spd
-rw-r--r-- 1 snikolaev snikolaev 1 Feb 26 01:09 idx.spe
-rw-r--r-- 1 snikolaev snikolaev 363 Feb 26 01:09 idx.sph
-rw-r--r-- 1 snikolaev snikolaev 57 Feb 26 01:09 idx.spi
-rw-r--r-- 1 snikolaev snikolaev 0 Feb 26 01:09 idx.spk
-rw------- 1 snikolaev snikolaev 0 Feb 26 01:15 idx.spl
-rw-r--r-- 1 snikolaev snikolaev 0 Feb 26 01:09 idx.spm
-rw-r--r-- 1 snikolaev snikolaev 8 Feb 26 01:09 idx.spp
-rw-r--r-- 1 snikolaev snikolaev 35 Feb 26 01:09 idx.sps
а в журнале searchd вы можете увидеть, что ротация прошла успешно (и заняла всего 1 мс):
[snikolaev@dev01 ~]$ tail -n 2 sphinx_replication.log
[Mon Feb 26 01:15:39.003 2018] [3346] rotating index 'idx': started
[Mon Feb 26 01:15:39.004 2018] [3346] rotating index 'idx': success
Итак, чтобы сейчас ротировать ваши индексы из копий, сделанных на всех назначениях, достаточно вызвать команду RELOAD INDEX везде, например:
[snikolaev@dev01 ~]$ for host in SLAVE 0; do echo $host; mysql -P9314 -h$host -e "RELOAD INDEX idx FROM 'sphinx_tmp/idx_new';"; done;
SLAVE
0
Примечания
- при запуске Manticore вы можете увидеть следующее предупреждение:
WARNING: index 'idx_new': prealloc: failed to open sphinx_tmp/idx_new.sph: No such file or directory; NOT SERVING
Это предупреждение нормально, потому что нам не нужно, чтобы idx_new обслуживался Manticore Search; этот индекс нужен только как временное хранилище новых данных.
- время, затраченное на синхронизацию индексов, может быть длительным для огромных индексов, но всё равно синхронизация данных на уровне файловой системы/сети проще для ваших серверов, чем использование ‘indexer’ для перестройки индекса с нуля.
- помните, что если вы делаете обновления атрибутов, их нужно выполнять на всех ваших слейвах, поскольку, как я уже говорил в начале, полноценной репликации пока нет. Свяжитесь с нами, если вам это нужно и вы хотите стать бета‑тестером.
- обычно вы просто используете скрипт индексации, который сначала готовит новый индекс, затем копирует его во все нужные места и после этого ротирует индекс везде. Это самый простой способ сделать это; в реальном мире вы также можете выполнять проверку индекса, индексацию на слейве для обеспечения HA индексации, использовать блокировки, чтобы убедиться, что вы не перестраиваете индекс одновременно на N серверах, и т.д. Мы делали это много раз для наших клиентов. Дайте нам знать, отправив письмо на [email protected] , если вам нужна поддержка в этой области. Вы можете посмотреть наши планы поддержки здесь .
В заключение хочу сказать, что пока нет высококачественной репликации для RT‑индексов и многие продолжают использовать обычные индексы, описанный способ имеет смысл и позволяет легко реплицировать обычные индексы.