Блог

Аннотация: Статья посвящена описанию установки полнотекстового поискового движка Sphinx Search Engine в Mysql. Рассмотрены особенности и тонкости сборки SphinxSE в качестве плагина для MySQL.

Введение 

Исторически, особенностью MySQL практически всех поколений является достаточно слабый (медленный) алгоритм полнотекстового поиска. Когда объемы обрабатываемых текстовых данных превысили определенный предел, мы задумались над альтернативным способом реализации полнотекстового поиска.

Таким решением для нас стал свободно распространяемый проект Андрея Аксенова Sphinx (http://sphinxsearch.com). На данный момент Sphinx является одним из самых сильных и активно развиваемых проектов. Он позволяет быстро индексировать данные из различных источников, имеет множество API, с помощью которых организуется поиск данных на различных программных платформах/языках программирования.

Т.к. мы активно используем в своей работе базу данных Percona MySQL (http://percona.com), наилучшим решением для нас стал SphinxSE - engine для MySQL.

Об особенностях установки этой связки эта статья.

Цель: на чистый дистрибутив Ubuntu установить связку Percona Mysql 5.5.30 и Sphinx 2.0.7, подключить поисковый движок SphinxSE в Mysql.

Основные шаги:

  • Подключить репозиторий Percona
  • Установить Mysql из репозитория
  • Установить Sphinx из исходников
  • Скомпилировать SphinxSE плагин
    • Скачать необходимые библиотеки для компиляции MySQL и SphinxSE из исходников
    • Скачать исходники MySQL и SphinxSE
    • Собрать плагин SphinxSE
  • Подключить SphinxSE плагин к MySQL 

Итак, поехали!

 

Подключение репозитория Percona

Источник: http://www.percona.com/docs/wiki/repositories:apt

1. Устанавливаем ключи репозитория Percona:

# gpg --keyserver  hkp://keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A
... [some output removed] ...
gpg:               imported: 1
# gpg -a --export CD2EFD2A | apt-key add -

2. Вносим ссылки на репозиторий Percona в /etc/apt/sources.list, заменяя lenny на название текущего дистрибутива:

deb http://repo.percona.com/apt lenny main
deb-src http://repo.percona.com/apt lenny main

3. Обновляем APT

apt-get update

 

Устанавливаем Percona MySQL из репозитория

sudo apt-get install percona-server-server-5.5

 

Устанавливаем Sphinx

Проверяем наличие библиотеки разработчиков и при необходимости устанавливаем ее:

sudo apt-get install libmysqlclient-dev

Т.к. исходная задача - установить ПО на чистую систему - ставим необходимое окружение для компиляции и сборки.

apt-get install build-essential cmake libncurses5-dev libaio-dev bison

 

Скачиваем и устанавливаем сфинкс

wget http://sphinxsearch.com/files/sphinx-2.0.7-release.tar.gz
tar xfz sphinx-2.0.7-release.tar.gz
cd sphinx-2.0.7-release
./configure --prefix=/usr/local/sphinx --enable-id64
make
make install
cd..

Прим.: Исторически сложилось, что сфинкс мы ставим в /usr/local/sphinx/ Если не устанавливать этот параметр, конечные файлы и папки лягут в /usr/local/, что, на наш взгляд, не очень аккуратно...

Прим. 2: В своей системе мы используем 64-битные индексы, поэтому в ./configure добавляем ключ --enable-id64 (ВАЖНО! По умолчанию сфинкс компилируется в 32-битный режим)

Также обратите внимание, что при компиляции сфинкс требует наличия установленного пакета libmysqlclient-dev, если он установлен штатными средствами, то все найдется самостоятельно, если с выкрутасами - путь до подключаемых библиотек MySQL можно взять из

sh# whereis mysql

 

Скомпилируем SphinxSE плагин

Источники:  http://www.percona.com/doc/percona-server/5.5/installation.html#installing-percona-server-from-a-source-tarballhttp://allweeks.ru/2011/02/mysql-5-5-building-and-install/

Движок SphinxSE устанавливается в MySQL как плагин, поэтому нам необходимо самостоятельно скомпилировать и собрать версию актуального установленного MySQL-сервера вместе со SphinxSE.

Если не сделали этого раньше, скачиваем и устанавливаем библиотеки, необходимые для компиляции MySQL и SphinxSE из исходников (либо удостоверяемся, в их наличии):

apt-get install build-essential cmake libncurses5-dev libaio-dev bison

 

Скачиваем и разархивируем исходники Percona MySQL

wget http://www.percona.com/redir/downloads/Percona-Server-5.5/Percona-Server-5.5.30-30.2/source/Percona-Server-5.5.30-rel30.2.tar.gz
tar xfz Percona-Server-5.5.30-rel30.2.tar.gz

 

Копируем исходники SphinxSE в специально созданную папку {mysql_source_dir}/storage/sphinx

mkdir ./Percona-Server-5.5.30-rel30.2/storage/sphinx/
cp ./sphinx-2.0.7-release/mysqlse/* ./Percona-Server-5.5.30-rel30.2/storage/sphinx/

Хинт: перед компиляцией SPHINXSE полезно увеличить значение SPHINXSE_MAX_ALLOC c 16 Mb до 512*1024*1024 в файле ha_sphinx.cc - есть вероятность, что стабильнее и быстрее будет работать поиск по большим диапазонам данных при поиске из SphinxSE. И еще, если вдруг начнет возникать ошибка типа "Invalid query:There was a problem processing the query on the foreign data source. Data source error: bad searchd response length", обратите внимание на параметр MySQL max_allowed_packet - возможно его стоит увеличить!

 

Собираем плагин SphinxSE

Источник: http://www.percona.com/doc/percona-server/5.5/installation.html#installing-percona-server-from-a-source-tarball

cd ./Percona-Server-5.5.30-rel30.2/
cmake . -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_CONFIG=mysql_release -DFEATURE_SET=community -DWITH_EMBEDDED_SERVER=OFF
make -j8

...и на выходе получаем динамически подключаемую библиотеку {mysql_source_dir}/storage/sphinx/ha_sphinx.so

Хинт: в последней команде make мы добавили параметр -j, который говорит компилятору осуществлять сборку в несколько потоков. Укажите число потоков, соответствующее количеству ядер на вашем процессоре - MySQL не маленькая программа, сэкономите приличное количество времени!

 

Подключаем SphinxSE плагин к MySQL

Копируем {mysql_source_dir}/storage/sphinx/ha_sphinx.so в папку плагинов MySQL (Percona server под Ubuntu по умолчанию ставит плагины в /usr/lib/mysql/plugin, актуальный путь до папки плагинов можно узнать в выводе команды ps ax | grep mysql) и перестраховываемся на случай, если у MySQL нет доступа к плагинам:

cp ./storage/sphinx/ha_sphinx.so /usr/lib/mysql/plugin
sudo chown -R mysql:mysql /usr/lib/mysql/plugin

 

Заходим в MySQL и подключаем SphinxSE

mysql -u root -p {password}
INSTALL PLUGIN sphinx SONAME 'ha_sphinx.so';
Query OK, 0 rows affected (0.00 sec)

Проверяем, подключился ли Storage Engine:

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                                    | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
| MyISAM             | YES     | MyISAM storage engine                                                      | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                                      | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                                         | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears)             | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables                  | NO           | NO   | NO         |
| SPHINX             | YES     | Sphinx storage engine 2.0.7-release                                        | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                                         | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                                     | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Percona-XtraDB, Supports transactions, row-level locking, and foreign keys | YES          | YES  | YES        |
| FEDERATED          | NO      | Federated MySQL storage engine                                             | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
10 rows in set (0.00 sec)

 Вуаля!