ejabberd: мигрируем с mnesia на mysql

в 13:20, , рубрики: ejabberd, jabber, mnesia, mysql, open source, xmpp, метки: , , , ,

По мере использования xmpp сервером ejabberd наблюдаю крайний дефицит документации. Каждый чих чуть отклоняющийся от стандартных потребностей приходится придумывать самому, либо собирать по кусочкам из конференций, списков рассылки, комментариев в svn и непосредственно исходников.

С выходом ejabberd 2.1.11, в котором разработчики добавили поддержку ODBC в новых модулях, я столкнулся с проблемой переноса данных из штатной БД mnesia в более подходящую под мои задачи mysql. Когда-то я ее уже решал для других модулей, но лишь отдаленно помню как. Сейчас попробую вспомнить и задокументировать процесс для будущего себя и всех кому это может быть интересно.

Итак у Вас есть ejabberd 2.1.11, использующий в качестве хранилища свою стандартную БД mnesia, а Вы не хотите ничего решатьхотите mysql.

Сначала создадим базу данных. Структуру для нее берем тут или в файле /src/odbc/mysql.sql в пакете с исходниками.

После этого надо экспортировать данные из mnesia. Нам понадобится модуль mod_admin_extra, входящий в состав ejabberd-modules.

Качаем:
svn co https://svn.process-one.net/ejabberd-modules

Так как mod_admin_extra давно не обновлялся, то про новые модули и следовательно новые таблицы он ничего не знает. Я решил вопрос топорно: открыл исходник ejabberd-modules/mod_admin_extra/trunk/src/mod_admin_extra.erl и кусок

 
              {export_last, last},
              {export_offline, offline},
              {export_passwd, passwd},
              {export_private_storage, private_storage},
              {export_roster, roster},
              {export_vcard, vcard},
              {export_vcard_search, vcard_search}],

заменил на

              {export_last, last},
              {export_offline, offline},
              {export_passwd, passwd},
              {export_private_storage, private_storage},
              {export_roster, roster},
              {export_vcard, vcard},
                {export_motd, motd},
                {export_motd_users, motd_users},
                {export_muc_registered, muc_registered},
                {export_muc_room, muc_room},
                {export_sr_group, sr_group},
                {export_sr_user, sr_user},
              {export_vcard_search, vcard_search}],

Примечание: Я не использую irc-транспорт, так как предпочитаю теплые ламповые irc-клиенты, и mod_irc у меня выключен. Если же Вы его используете, вероятно, Вам надо будет добавить в список что-то типа '{export_irc, irc},'. Точно можно узнать, сделав ls /var/spool/jabber/*.DCD и получив на выходе имена таблиц в mnesia.

Собираем (нужен erlang):

cd ejabberd-modules/mod_admin_extra/trunk
./build.sh

Примечание: более подробную инструкцию по сборке можно посмотреть на домашней странице ejabberd-modules.

Аналогично собираем ejabberd-modules/mysql.

Кидаем получившийся ejabberd-modules/mod_admin_extra/trunk/ebin/mod_admin_extra.beam и ejabberd-modules/mysql/trunk/ebin/*.beam в ebin в установке ejabberd (у меня это /usr/lib/erlang/lib/ejabberd-2.1.11/ebin/).

Отрубаем сервер ejabberd от сети для надежности и перезапускаем (но не останаваливаем!).

Создаем папку доступную на запись пользователю, из-под которого запущен ejabberd (у меня это jabber:jabber, но я просто сделал mkdir /tmp/temp; chmod 777 /tmp/temp).

Экспортируем данные из mnesia (<domain> — домен Вашего jabber-сервера):
ejabberdctl export2odbc <domain> /tmp/test/
на выходе получаем txt файлы с sql-запросами, готовые для выполнения в mysql. Выполняем их (я использовал попсовый phpMyAdmin). Дампы после этого лучше сразу удалить, так как в них явки-пароли в явном виде.
Почему-то создаются файлы для всех таблиц в mnesia, но не прописанные нами имеют нулевую длину. Прописанные, но пустые у меня — 14 байт.

Повторяем последний абзац для каждого домена, если их несколько.

Итак, база готова!

Сегодня пятница и я позволю себе схалявить и не расписывать непосредственно настройку ejabberd для mysql. Благо это много где описано (да хоть в официальной документации) и легко гуглится.

Если очень вкратце, то в конфиге должны быть
{auth_method, odbc}

{odbc_server, {mysql, «host», «db», «user», «pass»}}.
если не один домен, то
{host_config, «domain2», [{odbc_server, {mysql, «host», «db», «user», «pass»}}]}.

а так же меняем имена модулей тех модулей, которые хотим в мускуль XXX->XXX_odbc, у меня это:
mod_announce_odbc
mod_blocking_odbc
mod_last_odbc
mod_muc_odbc
mod_offline_odbc
mod_privacy_odbc
mod_private_odbc
mod_pubsub_odbc
mod_roster_odbc
mod_shared_roster
mod_vcard_odbc
mod_vcard_xupdate_odbc


Уже дописывая нашел статью про то же самое, но от 2009 года, там некоторые вещи устарели, так что надеюсь кому-то моя статья будет полезной. Всем приятных выходных. Не забывайте, что сообщения об ошибках и неточностях в статье приветствуются, но в личку.

Автор: J_o_k_e_R


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js