Использование модуля mod_archive_odbc

2013-03-02
В данной статье пойдет речь о ejabberd модуле mod_archive_odbc. Этот модуль является логическим продолжением развития модулей mod_archive и mod_archive_sql, которые, в свою очередь, являются реализацией протокола расширения XEP-0136. Модуль mod_archive_sql - это улучшенный mod_archive с переносом хранилища из mnesia на PostgreSQL. В модуле mod_archive_odbc появилась поддержка работы с базой данных через драйвер odbc, поддержка репликаций, а также исправлена работа RMS фильтрации:
  • RMS фильтрация выполнялась после выборки всех значений из базы, удовлетворяющих запросу
  • Запрос к коллекции кроме того выполнял также выбрку самих сообщений, что приводило к заполнению памяти лишними данными
На сайте автора модуля говорится, что в версии mod_archive_odbc оба пункта исправлены. 
Ниже будет рассмотрено подключение модуля mod_archive_odbc с использованием MySQL.

Установка модуля mod_archive(XEP-0136)
Для возможности использования модуля mod_archive необходимо, чтобы сервер ejabberd был установлен с поддержкой библиотеки odbc. Если вы устанавливали сервер из репозитория, то в директории установки (/usr/lib/ejabberd/ebin) проверьте наличие файлов

ejabberd_odbc.beam
ejabberd_odbc_sup.beam

В противном случае, если сервер собирается из исходников компиляцию необходимо выполнить с ключом --enable-odbc. На странице с исходниками даны перечень необходимого ПО и подробные инструкции по установке сервера. В кратце, если все необходимое ПО установлено, выполняем команды

$ sudo ./configure --enable-odbc
$ sudo make && make install

Далее скачиваем модули ejaaberd отсюда. В связи с обновлением прасширения XEP-0136, в исходниках модуля необходимо изменить namespace с http://xmpp.org/extensions/xep-0136.html#ns на urn:xmpp:archive. Для этого переходим в папку ejabberd-modules/mod_archive/tunc/srс и в файлах mod_archive_*.erl заменяем строки с определением NS_ARCHIVE_* на следующие

-define(NS_ARCHIVE, "urn:xmpp:archive").
-define(NS_ARCHIVE_AUTO, "urn:xmpp:archive:auto").
-define(NS_ARCHIVE_MANAGE, "urn:xmpp:archive:manage").
-define(NS_ARCHIVE_PREF, "urn:xmpp:archive:pref").
-define(NS_ARCHIVE_MANUAL, "urn:xmpp:archive:manual").

И собственно выполняем саму установку модуля. Для этого, находясь в директории ejabberd-modules/mod_archive/tunc, запускаем

$ ./build.sh

копируем полученные файлы *.beam из директории ejabberd-modules/mod_archive/tunc/ebin в директорию ebin с установленным ejabberd

cp ejabberd-modules/mod_archive/tunc/ebin/*.ebin /usr/lib/ejabberd/ebin/

И перезапускаем ejabberd сервер

$ sudo service ejabberd restart

Импортирование SQL дампа
Теперь необходимо импортировать таблички необходимые для работы модуля в вашу базу данных.

$ mysql -uroot -p -h192.168.130.81 < ejabberd-modules/mod_archive/trunc/src/mod_archive_odbc_mysql.sql

создать пользователя для работы с этой базой и назначить ему права

mysql> CREATE USER 'ejabberd'@'localhost' IDENTIFIED BY 'ejabberd';
mysql> GRANT ALL ON ejabberd.* TO 'ejabberd'@'localhost';

Установка odbc драйвера
Для возможности соединения сервера ejabberd с базой данныйх через odbc драйвер устанавливаем unixodbc драйвер

$ sudo aptitude install iodbc

устанавливаем MySql odbc драйвер

$ sudo aptitude install libmyodbc

Если все было сделано правильно, то при вводе команды odbcinst -j должно появится сообщение наподобие этого

unixODBC 2.2.11
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
USER DATA SOURCES..: /home/kam/.odbc.ini

В файле /etc/odbcinst.ini прописываем путь к MySQL драйверу

[MySQL]
Description = MySQL driver
Driver = /usr/lib/odbc/libmyodbc.so
Setup = /usr/lib/odbc/libodbcmyS.so

В файле /etc/odbc.ini прописываем параметры подключения к базе данных

[ejabberd]
Description = Mysql database
Driver = MySQL
Server = localhost
Database = ejabberd
UID = ejabberd
PWD = ejabberd
OPTION = 3
charset = utf8

Здесь Server - это сервер, на котором находится база данных.
Теперь соединение с базой через драйвер odbc можно протестировать следующим образом

$ odbcinst -q -s
[ejabberd]
$ odbcinst -q -d
[MySQL]
isql ejabberd
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+

Конфигурация ejabberd
Теперь, когда все необходимое ПО установлено, можно добавить инструкции в конфигурационный файл /etc/ejabberd/ejabberd.cfg.

{mod_archive_odbc, [{database_type, "mysql"},
{default_auto_save, true},
{enforce_default_auto_save, false},
{default_expire, infinity},
{enforce_min_expire, 0},
{enforce_max_expire, infinity},
{replication_expire, 31536000},
{session_duration, 1800},
{wipeout_interval, 86400}]},

{odbc_server, {mysql, "localhost", "ejabberd", "ejabberd", "ejabberd"}}.
{odbc_keepalive_interval, 3600}.

Возможно, что при прямом способе подключения к базе данных сервер ejabberd будет крешиться, тогда можно попробовать подключение через DSN, т.е. заменить

{odbc_server, {mysql, "localhost", "ejabberd", "ejabberd", "ejabberd"}}.

на

{odbc_server, "DSN=ejabberd;UID=ejabberd;PWD=ejabberd"}.

Примечание
Возможно также потребуется установка модуля mysql_conn. Его можно взять в той же директории с модулями, ссылка на которую была дана в начале статьи.