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 все равно будет использовать нативную СУБД для работы с некоторыми типами данных.
Годно! Но меня устраивает mnesia. Если что – всегда можно быстро восстановить 🙂
А теперь, если что, можно быстро мигрировать на мусцуль благодаря твоей статье.
Неплохая статейка, теперь по этим вопросам юзеров сразу сюда можно отправлять 😉
Добавил ссылку на эту статью в http://www.ejabberd.im/tutorials
@zinid
Спасибо 🙂 Я всегда рад помочь чем могу 🙂
@Loste
Из дампов MySQL тоже восстанавливать не так долго. Единственное, если перейдешь на SQL, то придется дампить как Mnesia так и скульные базы.
еще раз спасибо за статью, вроде всё получилось 🙂
пара замечаний:
“С помощью PHPMyAdmin необходимо дампы таблиц, которые мы получили …” – видимо пропущено слово “импортировать” 🙂
при экспорте у меня создался еще и файл private_storage.txt для таблицы private_storage, в списке его нет, хотя конечно, и так понятно, что куда.
в примере конфига не хватает модуля mod_privacy_odbc, в списке всех модулей в мануале он есть
@Shumaher
Спасибо за замечания, поправил 🙂
Отсутствие в конфиге mod_privacy_odbc обусловлено тем, что на настоящий момент mod_ctlextra не позволяет сконвертировать таблицы списков приватности из Mnesia в MySQL. То есть данный модуль, конечно, можно активировать, но в этом случае после миграции пользователи потеряют свои списки приватности.
Да, вот теперь вопрос решил поднять.
Спортег, надо ж пакеты собирать, а не конпелирувать сырцы!
@Lost
Зачем? Я не собираюсь заниматься дистрибуцией Ejabberd 🙂
Гмгм.
В общем, воспользовался мануалом, написал скрипт переноса всех данных всех доменов в мускуль %) перенеслось.
Сначала Ejabberd не хотел коннектиться к MySQL, ругался на ограничение соединений. Выставил в максимум 1000. Подключился. В процессах куча соединений повисло. Подключился одним юзером – снова упал ежабберд из-за большого количества соединений с мускулем. Делаю вывод, что ежабберд + мускуль – не нужно. %)
Хотя, конечно, сам модуль пару плюшек даёт прибавкой парочки комманд в ejabberdctl.
@Lost
Скрипт в студию 🙂
@Иван
Да не сочтите за спам: http://jabber-hosting.com/blog/mnesia-to-mysql-script/