Подключите ejabberd к MySQL через собственный драйвер для mod_archive_odbc.

Я пытаюсь подключить наш сервер ejabberd к MySQL, чтобы добавить модуль mod_archive_odbc. Мы используем ejabberd 2.1.13. Остальная часть сервера использует mnesia для хранения. Сначала я попробовал подход DSN, но это не удалось. В настоящее время я получаю эту ошибку в erlang.log:

=PROGRESS REPORT==== 24-Sep-2013::13:50:27 ===
          supervisor: {local,ejabberd_sup}
             started: [{pid,<0.777.0>},
                       {name,'ejabberd_mod_archive_odbc_chat.hostname.com'},
                       {mfargs,
                           {mod_archive_odbc,start_link,
                               ["chat.hostname.com",
                                [{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}]]}},
                       {restart_type,permanent},
                       {shutdown,1000},
                       {child_type,worker}]
=CRASH REPORT==== 24-Sep-2013::13:50:36 ===   crasher:
    initial call: mod_archive_odbc:init/1
    pid: <0.777.0>
    registered_name: 'ejabberd_mod_archive_odbc_chat.hostname.com'
    exception exit: {aborted,{no_exists,[sql_pool,"chat.hostname.com"]}}
      in function  gen_server:terminate/6
    ancestors: [ejabberd_sup,<0.37.0>]

Вот как выглядит раздел модулей:

  {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", "password"}}.

Я также могу подключаться к серверу mysql локально и удаленно, используя пользователя ejabberd.

Вот вывод ngrep при возникновении ошибок:

# ngrep port 3306
interface: eth0 (10.179.7.192/255.255.255.192)
filter: (ip or ip6) and ( port 3306 )
^Cexit
0 received, 0 dropped

# ngrep -d lo port 3306
interface: lo (127.0.0.0/255.0.0.0)
filter: (ip or ip6) and ( port 3306 )
^Cexit
0 received, 0 dropped

Вот вывод ngrep, если я подключаюсь к MySQL с пользователем ejabberd через другой компьютер в сети

# ngrep port 3306
interface: eth0 (10.179.7.192/255.255.255.192)
filter: (ip or ip6) and ( port 3306 )
####
T 10.179.7.235:3306 -> XX.XXX.XXX.XXX:55909 [AP]
  J....5.5.32.....xxpKb-VK...................UKXV(a2rh6r].mysql_native_password.
##
T XX.XXX.XXX.XXX:55909 -> 10.179.7.235:3306 [AP]
  >...................................ejabberd....).p.P..lt=BTK..w..
##
T 10.179.7.235:3306 -> XX.XXX.XXX.XXX:55909 [AP]
  ...........
#
T XX.XXX.XXX.XXX:55909 -> 10.179.7.235:3306 [AP]
  !....select @@version_comment limit 1
#
T 10.179.7.235:3306 -> XX.XXX.XXX.XXX:55909 [AP]
  .....'....def....@@version_comment............................MySQL Community Server (GPL).........
##
T XX.XXX.XXX.XXX:55909 -> 10.179.7.235:3306 [AP]
  .....
###

Модуль MySQL установлен:

(ejabberd@ip-10-179-7-235)1> ejabberd_check:check_database_module(mysql).
ok

person Jake Braun    schedule 24.09.2013    source источник
comment
Было бы полезно, если бы вы могли отследить (например, с помощью ngrep) активность на порту 3306, перезапустить ejabberd и показать следы. Какую версию ejabberd вы используете?   -  person giavac    schedule 25.09.2013
comment
@giavac Спасибо за совет. Я отредактировал свой пост, чтобы включить вывод. Похоже, MySQL ничего не видит от ejabberd. Версия 2.1.13.   -  person Jake Braun    schedule 25.09.2013
comment
в консоли ejabberd/erlang нормально ли возвращается ejabberd_check:check_database_module(mysql).?   -  person Nuno Freitas    schedule 25.09.2013
comment
@NunoFreitas Спасибо, попробовал и получил сообщение OK. Раньше мне приходилось копировать файлы .beam для mysql и mod_archive.   -  person Jake Braun    schedule 25.09.2013
comment
Тогда это больше похоже на то, что какая-то библиотека может отсутствовать. У вас установлен «erlang-odbc» (по крайней мере, это имя в Debian)? Вы собирали ejabberd с включенным odbc (например, './configure --enable-odbc')?   -  person giavac    schedule 26.09.2013
comment
@giavac У меня установлен erlang odbc. Это заставило меня попробовать некоторые другие вещи, и я, наконец, заработал, заставив файл конфигурации переопределить локальную базу данных, используя override_local. Я не знал, что по умолчанию файл конфигурации игнорируется.   -  person Jake Braun    schedule 26.09.2013


Ответы (1)


Проблема заключалась в том, что изменения, которые я делал, не обновлялись в реальной службе. Другой вопрос, Как удалить odbc для Ejabberd?, и комментарии выше от @giavac заставил меня понять, что, по-видимому, файл конфигурации не всегда является авторитетным для конфигурации.

В частности, я исправил свою проблему, добавив эту строку:

override_local.
person Jake Braun    schedule 26.09.2013
comment
@JamesVo Что именно вы пытаетесь сделать? У вас такая же проблема, как я описал? - person Jake Braun; 21.01.2014