eJabberd: migrating from Mnesia to MySQL native driver

e

Zabrałem się wczoraj za migrację mojego ejabberda do bazy mysql bo to takie na czasie teraz nie trzymać niczego w plikach tylko w bazie. Poza tym stwarza to nowe możliwości typu: zarządzanie swoim kontem jabberowym via wuwuwu, rejestracje publiczne itp. itd. Ojj, ile się naużerałem z tym to wiem tylko ja i mój biedny ejabberd, który przeszedł najróżniejsze gwałty na jego konfiguracji, przekleństwa, debugowania, tracowania i inne mało przyjemne czynności, które robimy by dowiedzieć się “dlaczego to pieruństwo nie działa, skoro przecież wszystko jest dobrze skonfigurowane?”.

W mojej bezgranicznej dobroci podzielę się swoją wiedzą oraz doświadczeniem z Tobą – drogi czytelniku – byś nie musiał przechodzić przez piekło, które ja znam już na pamięć. Gotowi do startu? Browar do łapki! Start.

Instalacja odpowiednich komponentów:

W PLD obsługę ODBC w ejabberdzie mamy standardowo wkompilowaną, więc nie musimy się babrać w rekompilację servera. Jeśli mamy skonfigurowany ejabberd wg mojego poprzedniego opisu to przejście na bazę będzie bułeczką z masłem.

# poldek -i ejabberd-mysql

Jeśli czytasz to od razu po publikacji artykułu paczka ejabberd-mysql prawdopodobnie jeszcze nie wylądowała na FTP. Jesteś zmuszony zbudować ją samemu (hint: ejabberd-mysql.spec). Oczywiście potrzebny jest również server MySQL ale to nie jest tematem mojego arta, stąd nic więcej poza tym, że musi obsługiwać InnoDB (w PLD jest to standardowo wkompilowane) nie powiem.

Tworzenie bazy:

Łączymy się z naszym serverem MySQL:

# mysql -u mysql -p

i tworzymy odpowiednią bazę:

mysql>create database ejabberd;
mysql>grant all on ejabberd.* to 'ejabberd'@'localhost' identified by 'hasło';

Stworzyliśmy pustą bazę, do której teraz trzeba utworzyć odpowiednią strukturę tabel:

# cp /usr/share/doc/ejabberd-1.1.4/mysql.sql.gz .
# gunzip mysql.sql.gz
# mysql -u mysql -D ejabberd -p < mysql.sql

Baza i cała jej struktura jest zatem gotowa. Teraz jedna z najważniejszych rzeczy.

Migracja użytkowników, ich rosterów itd.:

Do migracji wykorzystamy wbudowany moduł ejd2odbc który cała brudną robotę zrobi za nas. Do tego musimy wyłączyć ejabberda, zmusić do pracy w foregroundzie i wyeksportować wszystkie dane do plików:

# service ejabberd stop
# vim /usr/sbin/ejabberd

i hashujemy opcję -detach. Następnie uruchamiamy ejabberda ręcznie i dokonujemy eksportacji:

# ejabberd
(ejabberd@localhost)2> ejd2odbc:export_roster(jabber.domena, "/tmp/roster.txt").
{atomic,ok}
(ejabberd@localhost)3> ejd2odbc:export_roster("jabber.domena", "/tmp/roster.txt").
{atomic,ok}
(ejabberd@localhost)4> ejd2odbc:export_last("jabber.domena", "/tmp/last.txt").
{atomic,ok}
(ejabberd@localhost)5> ejd2odbc:export_offline("jabber.domena", "/tmp/offline.txt").
{atomic,ok}
(ejabberd@localhost)6> ejd2odbc:export_passwd("jabber.domena", "/tmp/passwd.txt").  
{atomic,ok}
(ejabberd@localhost)7> ejd2odbc:export_private_storage("jabber.domena", "/tmp/private_storage.txt").
{atomic,ok}
(ejabberd@localhost)8> ejd2odbc:export_vcard("jabber.domena", "/tmp/vcard.txt").
{atomic,ok}
(ejabberd@localhost)9> ejd2odbc:export_vcard_search("jabber.domena", "/tmp/vcard_search.txt").
{atomic,ok}
(ejabberd@localhost)10> q().
ok
(ejabberd@localhost)11>
#

Cofamy dokonane zmiany w /usr/sbin/ejabberd i przenosimy nasze dane do bazy:

# for i in `ls -1 /tmp/*.txt`; do mysql -u mysql -D ejabberd -p < $i; done

(Re)Konfiguracja:

Ulubionym edytorem edytujemy /etc/jabber/ejabberd.cfg i zamieniamy:

{auth_method, internal}.

na

{auth_method, odbc}.
{odbc_server, {mysql, "localhost", "ejabberd", "ejabberd", "hasło"}}.

oraz moduły:

{mod_roster,     []},
{mod_vcard,      []},
{mod_offline,    []},
{mod_last,       []},

na

{mod_roster_odbc,     []},
{mod_vcard_odbc,      []},
{mod_offline_odbc,    []},
{mod_last_odbc,       []},

Szybki start ejabberda
# service ejabberd start
i wszystko działa aż miło. W razie pytań jak zwykle jestem do dyspozycji.
Bijcie!

About the author

Bartosz

iOS and OS X software engineer. Currently working in Berlin, Germany.

4 comments

  • jak przetłumaczysz na eng to możesz submitować do bugtrakera process-one jako "improvement" albo napisz do Badlop-a on cię poinstruuje ;)

  • heh, znalazłem ten wpis przy okazji szukania jak tu zmigrować profile z mnesii na mysqla, dla ejabberda 2.x, i szukałem jak tu odpalić sobie interaktywnie ejabberda, przez ejabberdctl, a tam taka opcja w manualu: export2odbc server outputdir

    czyli dodali to w 2.x i już można bez kombinacji alpejskich.
    Ale dokumentacja jest poryta, to inna sprawa.

By Bartosz