Кластеризация Ejabberd

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

Пришлось поднимать кластер из ejabberd серверов. Скрипт подключения ноды в кластер постоянно ругался на то, что имя ноды уже кем-то используется и он не может подлючить эту ноду в кластер. Подключаем ноду в ручном режиме

Первая нода

Установить ejabberd можно несколькими способами:

apt

$ sudo apt install ejabberd

deb пакет

$ wget "https://www.process-one.net/downloads/downloads-action.php?file=/ejabberd/16.09/ejabberd_16.09-0_amd64.deb"
$ dpkg -i ejabberd*.deb

run скрипт

$ wget "https://www.process-one.net/downloads/downloads-action.php?file=/ejabberd/16.09/ejabberd-16.09-linux-x86_64-installer.run"
$ chmod 755 ejabberd*.run
$ sudo ./ejabberd-16.09-linux-x86_64-installer.run

После установки правим ejabberd.cfg, но главное — в INET_DIST_INTERFACE указываем ip адрес ноды.

Запускаем ноду:

$ ejabberdctl --node ejabberd@first.example.com start

Проверяем, что нода запустилась корректно:

$ ejabberdctl --node ejabberd@first.example.com status

Вторая нода

После того, как мы подняли первую ноду, необходимо подготовить Mnesia для работы второй ноды.

Проделываем действия по установке настройке и конфигурации INET_DIST_INTERFACE для второй ноды. Файл куки

Erlang использует специальный файл-куку для авторизации нод кластера. Т.е. этот файл должен быть одинаков для всех нод в кластере. Этот файл располагается в домашнем каталоге ejabberd (обычно это /opt/ejabberd/var/lib/, и файл обычно называется .erlang.cookie), но все зависит от способа установки. Скопируйте этот файл с первой ноды на вторую. Настройка репликации mnesia

Переключитесь в пользователя, от которого запускается ejabberd:

$ sudo su - ejabberd

Теперь собственно настройка репликации:

$ cd /opt/ejabberd/var/lib/ejabberd
$ export HOME=/opt/ejabber/var/lib/ejabberd
$ erl -name ejabberd@second.example.com -mnesia extra_db_nodes "['ejabberd@first.example.com']" -s mnesia

пример вывода

you are now in an erlang shell:

Erlang R14B02 (erts-5.8.3) [source] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.8.3 (abort with ^G)
(ejabberd@second.example.com)1> mnesia:info().
schema : with 29 records occupying 3580 words of mem
opt_disc. Directory "/opt/ejabber/var/lib/ejabberd/Mnesia.ejabberd@second.example.com" is NOT used.
use fallback at restart = false
running db nodes = ['ejabberd@first.example.com','ejabberd@second.example.com']
stopped db nodes = []
master node tables = []
remote = [acl,caps_features,captcha,config,iq_response,
last_activity,local_config,mod_register_ip,motd,
motd_users,muc_online_room,muc_registered,muc_room,
offline_msg,passwd,privacy,private_storage,
reg_users_counter,roster,roster_version,route,s2s,
session,session_counter,sr_group,sr_user,vcard,
vcard_search]
ram_copies = [schema]
disc_copies = []
disc_only_copies = []
[] = [local_config,caps_features,mod_register_ip]
[{'ejabberd@second.example.com',ram_copies},
{'ejabberd@first.example.com',disc_copies}] = [schema]
[{'ejabberd@first.example.com',disc_copies}] = [config,privacy,passwd,roster,
last_activity,sr_user,
roster_version,motd,acl,sr_group,
vcard_search,motd_users,muc_room,
muc_registered]
[{'ejabberd@first.example.com',disc_only_copies}] = [offline_msg,vcard,
private_storage]
[{'ejabberd@first.example.com',ram_copies}] = [reg_users_counter,route,s2s,
captcha,session_counter,session,
iq_response,muc_online_room]
3 transactions committed, 0 aborted, 0 restarted, 0 logged to disc
0 held locks, 0 in queue; 0 local transactions, 0 remote
0 transactions waits for other nodes: []
ok

Копируем данные. Эти команды надо вводить в erlang shell, который будет открыт после запуска предыдущей команды:

(ejabberd@second.example.com)4> mnesia:change_table_copy_type(schema, node(), disc_copies).
(ejabberd@second.example.com)5> mnesia:add_table_copy(roster, node(), disc_copies).
(ejabberd@second.example.com)6> mnesia:add_table_copy(passwd, node(), disc_copies).
(ejabberd@second.example.com)7> mnesia:change_table_copy_type(acl, node(), disc_copies).
(ejabberd@second.example.com)8> mnesia:change_table_copy_type(config, node(), disc_copies).
(ejabberd@second.example.com)9> mnesia:add_table_copy(offline_msg, node(), disc_only_copies).
(ejabberd@second.example.com)10> mnesia:add_table_copy(vcard, node(), disc_only_copies).
(ejabberd@second.example.com)11> mnesia:add_table_copy(private_storage, node(), disc_only_copies).
(ejabberd@second.example.com)12> q().

Теперь надо перенести данные Mnesia в правильное место:

$ mv Mnesia* ejabberd@second.example.com

Запускаем вторую ноду:

$ ejabberdctl --node ejabberd@second.example.com start

Проверяем, что нода запустилась:

$ ejabberdctl --node ejabberd@second.example.com status

Бонус

Если вам надо заменить какую-то ноду с тем же именем, то перед подключением в кластер нужно удалить эту ноду. Делается это в erlang shell на первой ноде:

mnesia:del_table_copy(schema, 'ejabberd@second.example.com').


Comments !