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

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

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

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

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

  1. выполнять индексацию только в одном месте (назовем его MASTER)
  2. использовать rsync или что-то еще для копирования на SLAVE (или с MASTER, если вы запускаете его на slave)
  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/

Ротация индексов

Теперь, когда вы распространили свой индекс на все slave-узлы, осталось просто повернуть индекс, чтобы новый вступил в силу. Ранее 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’ для перестройки индекса с нуля.
  • помните, что если вы выполняете обновления атрибутов, вам нужно делать это на всех ваших slave-узлах, так как, как я сказал в начале, пока нет высокоуровневой репликации. Свяжитесь с нами, если вам это нужно и вы хотите стать бета-тестером.
  • обычно вы просто создаете скрипт индексации, который сначала готовит новый индекс, затем копирует его во все нужные места и затем поворачивает индекс везде. Это самый простой способ сделать это, в реальном мире вы, возможно, захотите также проверять индекс, выполнять индексацию на slave для обеспечения высокой доступности индексации, использовать блокировки, чтобы убедиться, что вы не перестраиваете индекс на N серверах одновременно и т.д. Мы делали это много раз для наших клиентов. Дайте нам знать, отправив электронное письмо по адресу [email protected] , если вам нужна поддержка в этой области. Вы можете ознакомиться с нашими планами поддержки здесь .

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

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

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