⚠️ Эта страница автоматически переведена, и перевод может быть несовершенным.

Plain indexes replication

Manticore Search (as well as Sphinx) пока не поддерживает репликацию обычных или RT‑индексов «из коробки» (хотя мы работаем над этим, если вы хотите стать бета‑тестером, дайте нам знать по адресу [email protected] ), поэтому вам придётся реализовать её самостоятельно, если вам нужно иметь копию ваших данных Manticore Search / Sphinx где‑то ещё. Зачем это может понадобиться:

  • масштабируемость: вы хотите распределить нагрузку на ваши серверы (например, можно отправлять половину всех запросов Manticore на один сервер, а остальную часть — на другой), чтобы увеличить пропускную способность, снизить задержку или нагрузку на серверы
  • высокая доступность: вы хотите иметь реплики индексов Manticore, которые будут сразу доступны, как только основное хранилище Manticore станет недоступным по какой‑то причине
  • вы хотите объединить оба вышеописанных пункта с автоматическим обнаружением проблем и переключением между серверами (например, когда один сервер падает, другой автоматически начинает обрабатывать все запросы)

Самый простой способ репликации обычных индексов — просто скопировать конфигурацию Manticore на другой сервер и проиндексировать всё там с помощью 'indexer', но в этом случае есть недостатки: во‑первых, это трата ресурсов, необходимых для перестройки индекса, а во‑вторых сложно обеспечить хороший уровень синхронизации данных: обычные индексы Manticore будут перестраиваться отдельно от одного и того же источника (например, вашей основной базы данных), они должны в итоге быть идентичными, но это может происходить с задержкой, поскольку один сервер может быть более загружен или вы интенсивно обновляете источник, существует множество причин.

Вот как мы можем сделать это иначе, чтобы гарантировать, что реплики будут на 100 % идентичными, а задержка появления данных будет минимальной:

  1. выполнять индексацию только в одном месте (назовём его MASTER)
  2. использовать rsync или что‑то ещё для копирования на SLAVEs (или с MASTER, если вы запускаете его на слейвах)
  3. сообщить 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‑индексов и многие продолжают использовать обычные индексы, описанный способ имеет смысл и позволяет легко выполнять репликацию обычных индексов.

Установить Manticore Search

Установить Manticore Search