Главная > Мануалы, Софт > Ejabberd: от Mnesia к MySQL

Ejabberd: от Mnesia к MySQL

Практически у каждого администратора Jabber-сервера на базе Ejabberd вставал или встанет вопрос о переходе с Mnesia (используемой в Ejabberd СУБД по умолчанию) на MySQL. От себя хочу заметить, что использование Ejabberd  с ODBC имеет смысл только если на Вашем сервере более 20 онлайн-пользователей.
В данной статье я подразумеваю, что у Вас уже установлены все пакеты для сборки Ejabberd из исходников и полностью настроены и готовы к работе MySQL-server, MySQL – client и PHPMyAdmin для удобства.
Начиная с версии 2.1.0 в Ejabberd появилась возможность переносить базу пользователей одного домена с помощью экспорта/импорта в файлы формата PIEFXIS (XEP-0227). Однако, данную операцию мне не удалось провести корректно (пробовал практически все современные ревизии exmpp, все время наблюдал ошибки при импорте ростеров пользователей) и было принято решение конвертировать базу при помощи модуля mod_ctlextra.
Перед проведением всех описанных ниже манипуляций настоятельно рекомендуется создать резервные копии Mnesia.
1. Для начала создаем директорию, куда будем помещать исходники (этого можно и не делать, если аналогичная директория у Вас имеется):
mkdir /root/src
Теперь нам необходимо будет получить из официального SVN модули Ejabberd в виде исходных кодов:
cd /root/src
svn co https://svn.process-one.net/ejabberd-modules ejabberd-modules

2. Соберем mod_ctlextra:
cd /root/src/ejabberd-modules/mod_ctlextra/trunk
./build.sh

Скопируем полученные после компиляции бинарные файлы в директорию к остальным файлам .beam Ejabberd (по умолчанию они находятся в /lib/ejabberd/ebin):
cp /root/src/ejabberd-modules/mod_ctlextra/trunk/ebin/mod_ctlextra.beam /lib/ejabberd/ebin/mod_ctlextra.beam
Настроим Ejabberd на работу с mod_ctlextra. Для этого нам будет необходимо в конфиге (/etc/ejabberd/ejabberd.cfg по умолчанию) добавить новый модуль:
{modules, [
...
{mod_ctlextra, []},
...
]}.

Сохраняем изменения и перезапускаем Ejabberd:
/sbin/ejabberdctl stop
/sbin/ejabberdctl start

3. Создадим директории для экспорта:
mkdir /root/ejabberdbase
4. Экспортируем таблицы Mnesia в дампы таблиц MySQL:
ejabberdctl export2odbc domain.tld /root/ejabberdbase
Разумеется, вместо domain.tld пишем свой домен.
В результате экспорта получим следующие текстовые дампы таблиц MySQL:
ls /root/ejabberdbase
last.txt
offline.txt
passwd.txt
private_storage.txt
roster.txt
vcard.txt
vcard_search.txt

5. Если в процессе прошлой сборки Вы не включили при конфигурированию опцию --enable-odbc (а именно она нам будет необходима для работы Ejabberd с MySQL), то Ejabberd предстоит пересобрать. Для этого лучше сначала полностью удалить предыдущую инсталляцию.
Соберем Ejabberd с включенной опцией поддержки ODBC:
cd /root/src/
wget http://www.process-one.net/downloads/ejabberd/2.1.5/ejabberd-2.1.5.tar.gz
tar xzvf ejabberd-2.1.5.tar.gz
cd /root/src/ejabberd-2.1.5/src
./configure --enable-odbc
make
make install

6. Приступим к компиляции и установке нативного драйвера MySQL. Я рекомендую использовать именно нативный драйвер, поскольку при его использовании утечки оперативной памяти минимальны и он довольно часто обновляется в SVN.
cd /root/src/ejabberd-modules/mysql/trunk
./build.sh
cp /root/src/ejabberd-modules/mysql/trunk/ebin/mysql.beam /lib/ejabberd/ebin/mysql.beam
cp /root/src/ejabberd-modules/mysql/trunk/ebin/mysql_auth.beam /lib/ejabberd/ebin/mysql_auth.beam
cp /root/src/ejabberd-modules/mysql/trunk/ebin/mysql_conn.beam /lib/ejabberd/ebin/mysql_conn.beam
cp /root/src/ejabberd-modules/mysql/trunk/ebin/mysql_recv.beam /lib/ejabberd/ebin/mysql_recv.beam

7. Вводим пароль и попадаем в консоль MySQL. Далее выполняем в консоли MySQL:
create database jabber_domain.tld;
grant all privileges on jabber_domain.tld.* to jabber_domain.tld@localhost identified by 'пароль_доступа' with grant option;

Выходим из консоли MySQL:
exit
Теперь нам необходимо залить структуру базы MySQL для Ejabberd (дамп входит стандартную поставку Ejabberd):
mysql -uroot -p jabber_domain.tld < /root/src/ejabberd-2.1.5/src/odbc/mysql.sql
8. Приступим к импорту базы данных. Для этого удобнее всего воспользоваться веб-приложением PHPMyAdmin. С помощью PHPMyAdmin необходимо импортировать дампы таблиц, которые мы получили в результате экспорта из Mnesia.

Соотношение дампов к структуре БД
Текстовый файл Таблица БД
last.txt last
offline.txt spool
passwd.txt users
roster.txt rostetusers
vcard_search.txt vcard_search
vcard.txt vcard
private_storage.txt private_storage

9. Настроим Ejabberd для работы с MySQL. Для этого нам необходимо отредактировать конфиг /etc/ejabberd/ejabberd.cfg следующим образом:
Закомментируем строку {auth_method, internal}. :
%%{auth_method, internal}.
Раскомментируем строку %%{auth_method, odbc}.:
{auth_method, odbc}.
В разделе, описывающем используемые базы MySQL делаем следующие правки:
%% MySQL server:
%%
{odbc_server, {mysql, "localhost", " jabber_domain.tld ", " jabber_domain.tld ", "пароль доступа"}}.
%%
%% If you want to specify the port:
%%{odbc_server, {mysql, "server", 1234, "database", "username", "password"}}.

Следует иметь ввиду, что для одного домена используется отдельная база данных. В этой связи, если у Вас несколько виртуальных хостов, то необходимо для каждого домена прописывать свои реквизиты БД.
Заставим отдельные модули работать с БД MySQL. Для этого достаточно просто дописать префикс _odbc к названию модуля. Список модулей, поддерживающих ODBC можно найти тут http://www.process-one.net/en/ejabberd/guide_en#modoverview
{modules, [
...
{mod_last_odbc, []},
{mod_offline_odbc, [{access_max_user_messages, max_user_offline_messages}]},
{mod_pubsub_odbc, [
{access_createnode, pubsub_createnode},
{ignore_pep_from_offline, true}, % reduces resource comsumption, but XEP incompliant
%%{ignore_pep_from_offline, false}, % XEP compliant, but increases resource comsumption
{last_item_cache, false},
{plugins, ["flat", "hometree", "pep"]} % pep requires mod_caps
]},
{mod_private_odbc, []},
{mod_roster_odbc, []},
{mod_vcard_odbc, []},
...
]}.

Сохраняем изменения и перезапускаем сервер.
Все. Процесс миграции с Mnesia на MySQL завершен :)
Конечно, как Вы уже могли заметить, полностью от Mnesia отказаться нельзя и Ejabberd все равно будет использовать нативную СУБД для работы с некоторыми типами данных.

  1. 27 Октябрь 2010 в 19:52 | #1

    Годно! Но меня устраивает mnesia. Если что — всегда можно быстро восстановить :)
    А теперь, если что, можно быстро мигрировать на мусцуль благодаря твоей статье.

  2. 27 Октябрь 2010 в 20:01 | #2

    Неплохая статейка, теперь по этим вопросам юзеров сразу сюда можно отправлять ;)

  3. 27 Октябрь 2010 в 20:10 | #3

    Добавил ссылку на эту статью в http://www.ejabberd.im/tutorials

  4. Иван
    27 Октябрь 2010 в 20:16 | #4

    @zinid
    Спасибо :) Я всегда рад помочь чем могу :)

  5. Иван
    27 Октябрь 2010 в 20:18 | #5

    @Loste
    Из дампов MySQL тоже восстанавливать не так долго. Единственное, если перейдешь на SQL, то придется дампить как Mnesia так и скульные базы.

  6. 2 Ноябрь 2010 в 01:44 | #6

    еще раз спасибо за статью, вроде всё получилось :-)
    пара замечаний:
    «С помощью PHPMyAdmin необходимо дампы таблиц, которые мы получили …» — видимо пропущено слово «импортировать» :)
    при экспорте у меня создался еще и файл private_storage.txt для таблицы private_storage, в списке его нет, хотя конечно, и так понятно, что куда.
    в примере конфига не хватает модуля mod_privacy_odbc, в списке всех модулей в мануале он есть

  7. Иван
    2 Ноябрь 2010 в 10:09 | #7

    @Shumaher
    Спасибо за замечания, поправил :)
    Отсутствие в конфиге mod_privacy_odbc обусловлено тем, что на настоящий момент mod_ctlextra не позволяет сконвертировать таблицы списков приватности из Mnesia в MySQL. То есть данный модуль, конечно, можно активировать, но в этом случае после миграции пользователи потеряют свои списки приватности.

  8. 8 Ноябрь 2011 в 07:46 | #8

    Да, вот теперь вопрос решил поднять.
    Спортег, надо ж пакеты собирать, а не конпелирувать сырцы!

  9. Иван
    8 Ноябрь 2011 в 22:36 | #9

    @Lost
    Зачем? Я не собираюсь заниматься дистрибуцией Ejabberd :)

  10. 1 Январь 2012 в 12:15 | #10

    Гмгм.
    В общем, воспользовался мануалом, написал скрипт переноса всех данных всех доменов в мускуль %) перенеслось.
    Сначала Ejabberd не хотел коннектиться к MySQL, ругался на ограничение соединений. Выставил в максимум 1000. Подключился. В процессах куча соединений повисло. Подключился одним юзером — снова упал ежабберд из-за большого количества соединений с мускулем. Делаю вывод, что ежабберд + мускуль — не нужно. %)
    Хотя, конечно, сам модуль пару плюшек даёт прибавкой парочки комманд в ejabberdctl.

  11. Иван
    1 Январь 2012 в 12:30 | #11

    @Lost
    Скрипт в студию :)

  12. 1 Январь 2012 в 19:10 | #12
  1. 30 Октябрь 2010 в 15:22 | #1
  2. 1 Январь 2012 в 19:09 | #2
Потребление памяти: 9.63MB