Как исправить ошибки при работе с Sphinx 3.0.3 и выше (с самого начала)

Этот пост был опубликован мной более года назад. Информация, описанная ниже, уже могла потерять актуальность, но всё ещё может быть полезна.

Привет.

Я тут на днях оформлял вики для корпоративного репозитория на тему правильного поднятия сфинкса и что делать при ошибках. Я не буду вдаваться в детали настройки, этого полно в сети и документации. Привожу общий порядок действий для установки и небольшой список самых распространённых проблем с их решениями.

Допустим, что у нас есть сервер, на который ранее не устанавливался sphinx, и мы хотим поставить версию 3.0.3 или выше.

Все манипуляции могут производиться любым системным пользователем (если не указано иное). В нашем примере мы сидим под пользователем user.

Установка

1) Качаем бинарники под свою ОСь: http://sphinxsearch.com/downloads/current/

2) Распечатываем из архива содержимое папки /bin в /usr/bin/ (с повышенными правами)

3) Готовим структуру файлов и папок для хранения твоих настроек, индексов и логов sphinx:

/home/user/sphinxdata/ # или любая удобная директория
|- binlogs/
|- indexes/
|- logs/ 
|  |- searchd.log # пустой файл
|  |- query.log # пустой файл
|  |- log.log # пустой файл
|- searchd.pid # пустой файл
|- sphinx.conf

4) Оформляем конфиг sphinx.conf. Образец лежит в скачанном тобой архиве в директории /etc.

5) Запускаем индексацию

indexer --all --rotate -c ~/sphinxdata/sphinx.conf

Вывод команды в этот раз будет выглядеть примерно так:

using config file '/home/user/sphinxdata/sphinx.conf'...
indexing index 'index1'...
collected 43010 docs, 3.5 MB
sorted 0.3 Mhits, 100.0% done
total 43010 docs, 3.521 Mb
total 2.1 sec, 1.669 Mb/sec, 20383 docs/sec
indexing index 'index2'...
collected 91965 docs, 14.7 MB
sorted 1.4 Mhits, 100.0% done
total 91965 docs, 14.65 Mb
total 7.4 sec, 1.990 Mb/sec, 12494 docs/sec
WARNING: failed to open pid_file '/home/user/sphinxdata/searchd.pid'.
WARNING: indices NOT rotated.

Индексация прошла почти успешно. Почти — потому что ротация не удалась, т.к. не запущен демон searchd (об этом говорят последние две строки). Это норма.

В файл searchd.pid будет записан идентификатор процесса демона. После успешной индексации утилита indexer считывает PID процесса searchd из этого файла и отправляет процессу сигнал, чтобы тот подцепил индекс.

Поскольку мы ещё не запускали searchd и он сейчас не работает, то и PID-а там нет, и ротация логов не произошла, потому что слать сигнал нечему — о том и говорят последние две строки.

Пожалуй, при первой индексации параметр –rotate можно даже не добавлять.

6) Вот теперь запускаем демона:

searchd -c ~/sphinxdata/sphinx.conf

Возможно, для этого придётся переходить в директорию ~/sphinxdata (об этом ниже). При успешном запуске будет примерно такой вывод:

using config file '/home/user/sphinxdata/sphinx.conf'...
listening on all interfaces, port=9312
listening on all interfaces, port=9306
precaching index 'index1'
rotating index 'index1': success
precaching index 'index2'
rotating index 'index2': success
precached 2 indexes in 0.009 sec
WARNING: No extra index definitions found in data folder

Демон на свободе и работает. Можно тестировать поиск. Как? Не знаю. У меня перед настройкой sphinx, как правило, уже развёрнут рабочий проект, поэтому я просто прямо на сайте вбиваю поисковый запрос.

УЧТИ! Строки ‘rorating’ будут видны только в том случае, если ты запускал индексацию при выключенном демоне. Когда он запустится индексы будут ротированы.

Если ты просто запускаешь демона со старыми индексами, то будут строчки в духе ‘precaching <…>: success’. Если нет даже ‘precaching’, то читай дальше.

ЧаВо

Тут описаны самые часто встречаемые ошибки и проблемы, которые могут возникнуть при работе со сфинксом.


ПРОБЛЕМА: вывод команды indexer выглядит так:

using config file '/home/user/sphinxdata/sphinx.conf'...
indexing index 'index1'...
ERROR: index 'index1': sql_connect: Access denied for user 'mysqluser'@'localhost' (using password: YES) (DSN=mysql://mysqluser:***@localhost:3306/database).
total 0 docs, 0.0 Kb
total 0.0 sec, 0.0 Kb/sec, 0 docs/sec

ПРИЧИНА: указана не та БД, либо не те логин/пароль, либо пользователь не имеет прав на чтение таблиц БД. Короче, не удалось подключиться к БД.

РЕШЕНИЕ: верно указать все данные для подключения, проверить БД и права пользователя на чтение таблиц БД.


ПРОБЛЕМА: вывод команды indexer выглядит так:

using config file '/home/user/sphinxdata/sphinx.conf'...
indexing index 'index1'...
ERROR: index 'index1': sql_connect: failed to load libmysqlclient (or libmariadb) (DSN=mysql://mysqluser:***@localhost:3306/database).
total 0 docs, 0.0 Kb
total 0.0 sec, 0.0 Kb/sec, 0 docs/sec

ПРИЧИНА: не установлена (не найдена) библиотека libmysqlclient.so либо libmariadb.so

РЕШЕНИЯ:

  1. Раз Дваз
  2. Установить libmysqlclient-dev от имени рута:
apt-get install libmysqlclient-dev #debian
yum install libmysqlclient-dev #centos

ПРОБЛЕМА: при запуске searchd возникает ошибка:

FATAL: failed to parse config file '/home/user/sphinxdata/sphinx.conf'

ПРИЧИНА: некорректный путь или имя файла конфига, который ты ему дал (параметр -c), либо ошибка в конфиге (в этом случае будет указано место ошибки в файле)

РЕШЕНИЕ: исправить путь к конфигу и ошибки в нём


ПРОБЛЕМА: вывод команды searchd выглядит так (нет ни строчек ‘rotating’, ни ‘precaching’):

WARNING: both 'sphinxdata' and config file '/home/user/sphinxdata/sphinx.conf' exist; using 'sphinxdata' folder
no config file, using 'sphinxdata' folder...
listening on all interfaces, port=9312
listening on all interfaces, port=9306
WARNING: No extra index definitions found in data folder

ПРИЧИНА: демон запущен, но конфиг не прочтён и индексы не подцепились. Почему тут оно так происходит мне в деталях неизвестно.

РЕШЕНИЕ: выполнить команды по порядку:

searchd --stop # завершаем демона вежливо
killall searchd # убиваем все его процессы грубо (чтоб наверняка)
rm -f ~/sphinxdata/sphinx.state* # мешают файлы sphinx.state и sphinx.state.new
cd ~/sphinxdata # переходим в директорию сфинкса
searchd -c sphinx.conf # запускаем заново - теперь должно заработать

ПРИМЕЧАНИЕ: Вообще, директория sphinxdata всегда создаётся в текущей рабочей директории при каждом запуске демона searchd (там, где вы находитесь в момент запуска).

Говорят, что нужно просто удалять папку sphinxdata и запускать с указанием параметра -c. Якобы, тогда всё заработает.

Этот совет может сработать для тех, кто уже ставил сфинкса, имеет свои старые конфиги, обновил сфинкса до версии 3.* и пытается ему эти конфиги скормить.

В рассматриваемом нами случае, мы пошли другим путём и наоборот стали использовать именно эту папку для наших конфигов и дел. Удалять нам её незачем в контексте данной статьи. Но если не сработает с первого раза, значит надо перейти внутрь sphinxdata и запускать оттуда (хотя в моих случаях работало сразу и без этого).

В любом случае, имей в виду такое поведение сфинкса.


ПРОБЛЕМА: поиск просто не работает

ПРИЧИНА: ты

РЕШЕНИЕ: проверить конфиг(и), запустить индексацию, перезапустить демона, следить за каждым WARNINGом, логами, ошибками, гуглить и искать решение, которое тут не описано.

1 Комментарий

  1. Здравствуйте!

    Есть ~5 Гб архив новостей в wordpress. Можно ли как-то интегрировать sphinx 3 с последней версией wordpress? Попадавшиеся плагины какие-то устаревшие.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *