Репликация простых индексов

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

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

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

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

  1. делать индексацию только в одном месте (назовем его MASTER)
  2. использовать rsync или что-то еще, чтобы скопировать на SLAVEs (или с MASTER, если вы запускаете его на слейвах)
  3. сказать Manticore во всех местах, где он должен начать использовать новые перестроенные данные

Вот пример того, как это может выглядеть:

Индексация на мастере

Фокус здесь в том, чтобы создать новый "псевдо" индекс, полностью унаследованный от вашего нормального индекса, с измененным только "путем" (см. 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, нам нужен этот индекс только как временное хранилище для новых данных.

  • время, затраченное на синхронизацию индексов, может быть долгим для огромных индексов, но в любом случае синхронизация данных на уровне fs/сети проще для ваших серверов, чем использование 'indexer' для перестройки индекса с нуля.
  • помните, если вы делаете обновления атрибутов, вам нужно сделать это и на всех ваших слейвах, так как, как я уже сказал в начале, пока нет высококачественной репликации. Свяжитесь с нами, если вам это нужно и вы хотите стать бета-тестером.
  • обычно вы просто имеете скрипт индексации, который сначала подготавливает новый индекс, затем копирует его во все необходимые места, а затем поворачивает индекс повсюду. Это самый простой способ сделать это, в реальном мире вы также можете захотеть выполнить валидацию индекса, индексацию на слейве, чтобы обеспечить высокую доступность индексации, использовать блокировки, чтобы убедиться, что вы не перестраиваете индекс на N серверах одновременно и так далее. Мы делали это много раз для наших клиентов. Дайте нам знать, отправив электронное письмо на [email protected] , если вам нужна поддержка в этой области. Вы можете увидеть наши планы поддержки здесь .

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

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

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