В этой статье мы рассматриваем распространённую проблему, с которой пользователи часто сталкиваются при попытке импортировать данные из MySQL в Manticore.
Возможность Manticore индексировать данные из MySQL с помощью инструмента indexer широко известна. Однако, прежде чем перейти к проблеме, вынесенной в заголовок, давайте сначала разберёмся, как связаны Manticore и MySQL.
В настоящее время наиболее мощным API, предлагаемым Manticore, является SphinxQL. Этот API использует транспортный протокол MySQL, что значительно упрощает задачи поиска и другие операции благодаря схожести синтаксиса языка запросов с MySQL. Команды протокола MySQL, необходимые для SphinxQL, реализованы нативно в searchd. Поэтому Manticore не требует наличия минимальной библиотеки MySQL или самого MySQL на хосте, где установлен Manticore.
indexer может взаимодействовать с базой данных MySQL и извлекать данные для построения индекса Manticore. Это соединение с MySQL осуществляется через официальную клиентскую библиотеку MySQL (libmysqlclient). Важно отметить, что при компиляции Manticore библиотека клиента MySQL не встраивается в бинарные файлы Manticore. То же самое относится к PostgreSQL, XML-каналам и ODBC. Если пользователь indexer хочет подключиться к PostgreSQL, MySQL или базе данных, поддерживающей ODBC, необходимые драйверные библиотеки должны быть установлены на той же системе, где находится indexer.
Итак, что вызывает сообщение об ошибке «MySQL source wasn't initialized. Wrong name in dlopen?»?
Существует несколько возможных причин:
libmysqlclientможет быть не установлен в вашей системе. Эта библиотека поставляется с пакетом Linux и может иметь разные названия на разных платформах:- В CentOS/RHEL она называется
mysql-libs. - Пользователи Debian/Ubuntu должны искать
default-libmysqlclient-dev. - В Alpine доступны пакеты
mariadb-connector-c-dev.
- В CentOS/RHEL она называется
Даже если
libmysqlclientустановлен, он может быть неверной версии.indexerсобирается с определённой версией клиентской библиотеки, которая обычно входит в стандартный пакет MySQL дистрибутива Linux. Версии MySQL могут различаться между дистрибутивами: некоторые используют официальную MySQL, а другие по умолчанию используют MariaDB.Проблемы возникают, когда вы обновляетесь до новой мажорной версии MySQL или переключаетесь на другой вариант MySQL. Оба сценария могут привести к проблемам совместимости, поскольку при этом может появиться другая (обычно более новая) версия клиентской библиотеки.
Дистрибутивы MySQL предоставляют пакет совместимости, включающий более старые версии клиентской библиотеки для приложений, рассчитанных на работу с этими версиями. Например, если вы переходите на дистрибутив, где по умолчанию используется MariaDB, но хотите использовать последнюю официальную MySQL, следует установить пакет совместимости
mysql-community-libs-compatиз официального источника MySQL.Вы могли установить неподходящий пакет Manticore. Например, вы используете Ubuntu, но по ошибке установили Debian-пакет Manticore. Хотя
searchdможет работать,indexerможет не функционировать, если он предназначен для другой версии, чем та, что поставляется вашим текущим дистрибутивом.Менее распространённый сценарий возникает, когда MySQL установлен вручную, или библиотека клиента MySQL по какой-то причине не включена в путь общих библиотек. Хотя Manticore безразличен к способу установки MySQL, он должен уметь находить клиентскую библиотеку, используя путь общих библиотек операционной системы, обычно расположенный в
/usr/libили/usr/lib/x86_64-linux-gnu/. В таких случаяхlibmysqlclientследует добавить (или создать символическую ссылку) в стандартный путь ld. Если вы используете пользовательский путь, его необходимо добавить в/etc/ld.so.conf.d/. Например, в некоторых дистрибутивах клиентские библиотеки находятся в папке/usr/lib/mysql, и пакет, устанавливающий эти файлы, также добавляет запись в/etc/ld.so.conf.d/. Альтернативно, путь ld можно скорректировать, включив библиотеку MySQL при запуске демона, напримерLD_LIBRARY_PATH=/path/to/mysql searchd. Если вы используете unit-файл systemd, его можно задать вEnvironment, но обычно рекомендуется решить проблему пути клиентской библиотеки на уровне системы. Это связано с возможными изменениями unit-файлов в будущих обновлениях.
