Всем привет.
Народ, помогите.
Обращался в конференцию, но там мой вопрос оставили без внимания.
Не работает кластеризация.
Обе машины в качестве самостоятельных ejabberd серверов работают.
А кластер не создается. Или не работает.
Хост1: hosting.xxx.ru
Хост2: hosting2.xxx.ru
Последовательность действий:
1. Настроил и на х1 и на х2 ejabberd сервера. Новых пользователей создают, все подключается, все работает. Задача стояла так, х1 должен быть кластером с х2. х2 - главный.
2. Создаю кластер:
2.1 Выключаю сервер на х1.
2.2 Добавляю х1 в качестве сервера к х2 как кластер:
$ erl -sname ejabberd -mnesia extra_db_nodes ['ejabberd@hosting2'] -s mnesia
erl> mnesia:change_table_copy_type(schema, node(), disc_copies).
erl> q().
2.3. Запускаю сервер на х1.
2.4. Перезапускаю сервер на х2.
Пробую авторизоваться с учетной записью с х2, на х1.
Не пускает. Т.е. не пашет.
Иду по ссылке:
http://www.ejabberd.im/interconnect-erl-nodes
Начинаю отрабатывать все по пунктам: На х1.
root@hosting:~ # erl -sname ejabberdctl
Erlang (BEAM) emulator version 5.4.13 [source] [hipe] [threads:0] [kernel-poll]
Eshell V5.4.13 (abort with ^G)
(ejabberdctl@hosting)1> erlang:get_cookie().
'WMUSSOWXGRWISAHRFXAN'
(ejabberdctl@hosting)2> node().
ejabberdctl@hosting
(ejabberdctl@hosting)3> net_adm:host_file().
[hosting2]
(ejabberdctl@hosting)4> net_adm:world().
[]
(ejabberdctl@hosting)5> nodes().
[]
(ejabberdctl@hosting)6> net_adm:ping('ejabberdctl@hosting').
pong
(ejabberdctl@hosting)7> net_adm:ping('ejabberdctl@hosting2').
pang
(ejabberdctl@hosting)9> rpc:multicall([node()| nodes()], erlang, localtime, []).
{[{{2006,11,7},{12,12,38}}],[]}
(ejabberdctl@hosting)10> q().
На другой машине: Х2:
root@hosting2 /var/log/ejabberd # erl -sname ejabberdctl
Erlang (BEAM) emulator version 5.4.13 [source] [hipe] [threads:0] [kernel-poll]
Eshell V5.4.13 (abort with ^G)
(ejabberdctl@hosting2)1> erlang:get_cookie().
'WMUSSOWXGRWISAHRFXAN'
(ejabberdctl@hosting2)2> node().
ejabberdctl@hosting2
(ejabberdctl@hosting2)3> net_adm:host_file().
[hosting]
(ejabberdctl@hosting2)4> net_adm:world().
[]
(ejabberdctl@hosting2)5> nodes().
[]
(ejabberdctl@hosting2)7> net_adm:ping('ejabberdctl@hosting2').
pong
(ejabberdctl@hosting2)8> net_adm:ping('ejabberdctl@hosting').
pang
(ejabberdctl@hosting2)10> rpc:multicall([node()| nodes()], erlang, localtime, []).
{[{{2006,11,7},{12,12,29}}],[]}
(ejabberdctl@hosting2)13> q().
Конфиги:
root@hosting2# less /usr/local/etc/ejabberd/ejabberd.inetrc
{file, hosts, "/etc/hosts"}.
{file, resolv, "/etc/resolv.conf"}.
{lookup, [file, dns]}.
root@hosting:# less /usr/local/etc/ejabberd/ejabberd.inetrc
{file, hosts, "/etc/hosts"}.
{file, resolv, "/etc/resolv.conf"}.
{lookup, [file, dns]}.
В /etc/hosts у каждого сервера прописан противоположный.
Основной конфиг каждой системы:
root@hosting:~ # less /usr/local/etc/ejabberd/ejabberd.cfg
%override_acls.
% Users that have admin access. Add line like one of the following after you
% will be successfully registered on server to get admin access:
{acl, admin, {user, "admin"}}.
{acl, admin, {user, "pro"}}.
% Blocked users:
%{acl, blocked, {user, "test"}}.
% Local users:
{acl, local, {user_regexp, ""}}.
% Another examples of ACLs:
%{acl, jabberorg, {server, "jabber.org"}}.
%{acl, test, {user_regexp, "^test"}}.
%{acl, test, {user_glob, "test*"}}.
% Only admins can use configuration interface:
{access, configure, [{allow, admin}]}.
{access, configure, [{allow, pro}]}.
% Every username can be registered via in-band registration:
{access, register, [{allow, all}]}.
% After successful registration user will get message with following subject
% and body:
{welcome_message,
{"Welcome!",
"Welcome to Jabber Community "
"For information about Jabber visit http://jabber.ru"}}.
% Replace them with 'none' if you don't want to send such message:
%{welcome_message, none}.
% List of people who will get notifications about registered users
%{registration_watchers, ["admin1@localhost",
% "admin2@localhost"]}.
% Only admins can send announcement messages:
{access, announce, [{allow, admin}]}.
{access, announce, [{allow, pro}]}.
% Only non-blocked users can use c2s connections:
{access, c2s, [{deny, blocked},
{allow, all}]}.
% Set shaper with name "normal" to limit traffic speed to 1000B/s
{shaper, normal, {maxrate, 1000}}.
% Set shaper with name "fast" to limit traffic speed to 50000B/s
{shaper, fast, {maxrate, 50000}}.
% For all users except admins used "normal" shaper
{access, c2s_shaper, [{none, admin},
{normal, all}]}.
% For all S2S connections used "fast" shaper
{access, s2s_shaper, [{fast, all}]}.
% Admins of this server are also admins of MUC service:
{access, muc_admin, [{allow, admin}]}.
% All users are allowed to use MUC service:
{access, muc, [{allow, all}]}.
% This rule allows access only for local users:
{access, local, [{allow, local}]}.
% Authentification method. If you want to use internal user base, then use
% this line:
{auth_method, internal}.
% For LDAP authentification use these lines instead of above one:
%{auth_method, ldap}.
%{ldap_servers, ["localhost"]}. % List of LDAP servers
%{ldap_uidattr, "uid"}. % LDAP attribute that holds user ID
%{ldap_base, "dc=example,dc=com"}. % Base of LDAP directory
% For authentification via external script use the following:
%{auth_method, external}.
%{extauth_program, "/path/to/authentification/script"}.
% Host name:
{hosts, ["XXX.ru", "localhost"]}.
% Default language:
{language, "en"}.
% Listened ports:
{listen,
[
{5222, ejabberd_c2s, [{access, c2s},
{shaper, c2s_shaper}]},
% To create selfsigned certificate run the following command from the
% command prompt:
%
% openssl req -new -x509 -days 365 -nodes -out ejabberd.pem -keyout ejabberd.pem
%
% and answer the questions.
% {5222, ejabberd_c2s, [{access, c2s},
% starttls, {certfile, "./ejabberd.pem"},
% {shaper, c2s_shaper}]},
% When using SSL/TLS ssl option is not recommended (it requires patching
% erlang ssl application). Use tls option instead (as shown below).
{5223, ejabberd_c2s, [{access, c2s},
tls, {certfile, "/var/spool/ejabberd/ejabberd.pem"},
{shaper, c2s_shaper}]},
{5269, ejabberd_s2s_in, [{shaper, s2s_shaper}]},
{5555, ejabberd_service, [{access, all},
{host, "icq.XXX.ru", [{password, "YYYYYYYYY"}]}]},
% MSN Ttansport
{5347, ejabberd_service, [{host, "msn.XXX.ru", [{password, "YYYYYYYYY"}]}]}
% {5280, ejabberd_http, [http_poll, web_admin]}
]}.
% If SRV lookup fails, then port 5269 is used to communicate with remote server
{outgoing_s2s_port, 5269}.
% Used modules:
{modules,
[
{mod_adhoc, []},
{mod_register, [{access, register}]},
{mod_roster, []},
{mod_privacy, []},
{mod_configure, [{access, admin}]},
{mod_disco, []},
{mod_stats, [{access, admin}]},
{mod_vcard, []},
{mod_offline, []},
{mod_announce, [{access, announce}]},
{mod_private, []},
% {mod_irc, []},
% Default options for mod_muc:
% host: "conference." ++ ?MYNAME
% access: all
% access_create: all
% access_admin: none (only room creator has owner privileges)
% {mod_muc, [{access, muc},
% {access_create, muc},
% {access_admin, muc_admin}]},
{mod_pubsub, []},
{mod_time, []},
{mod_last, []},
{mod_version, []}
]}.
% Local Variables:
% mode: erlang
% End:
--------------------------
root@hosting2# less /usr/local/etc/ejabberd/ejabberd.cfg
%override_acls.
% Users that have admin access. Add line like one of the following after you
% will be successfully registered on server to get admin access:
{acl, admin, {user, "admin"}}.
{acl, admin, {user, "pro"}}.
% Blocked users:
%{acl, blocked, {user, "test"}}.
% Local users:
{acl, local, {user_regexp, ""}}.
% Another examples of ACLs:
%{acl, jabberorg, {server, "jabber.org"}}.
%{acl, test, {user_regexp, "^test"}}.
%{acl, test, {user_glob, "test*"}}.
% Only admins can use configuration interface:
{access, configure, [{allow, admin}]}.
% Every username can be registered via in-band registration:
{access, register, [{allow, all}]}.
% After successful registration user will get message with following subject
% and body:
{welcome_message,
{"Welcome!",
"Welcome to Jabber Community "
"For information about Jabber visit http://jabber.ru"}}.
% Replace them with 'none' if you don't want to send such message:
%{welcome_message, none}.
% List of people who will get notifications about registered users
%{registration_watchers, ["admin1@localhost",
% "admin2@localhost"]}.
% Only admins can send announcement messages:
{access, announce, [{allow, admin}]}.
% Only non-blocked users can use c2s connections:
{access, c2s, [{deny, blocked},
{allow, all}]}.
% Set shaper with name "normal" to limit traffic speed to 1000B/s
{shaper, normal, {maxrate, 1000}}.
% Set shaper with name "fast" to limit traffic speed to 50000B/s
{shaper, fast, {maxrate, 50000}}.
% For all users except admins used "normal" shaper
{access, c2s_shaper, [{none, admin},
{normal, all}]}.
% For all S2S connections used "fast" shaper
{access, s2s_shaper, [{fast, all}]}.
% Admins of this server are also admins of MUC service:
{access, muc_admin, [{allow, admin}]}.
% All users are allowed to use MUC service:
{access, muc, [{allow, all}]}.
% This rule allows access only for local users:
{access, local, [{allow, local}]}.
% Authentification method. If you want to use internal user base, then use
% this line:
{auth_method, internal}.
% For LDAP authentification use these lines instead of above one:
%{auth_method, ldap}.
%{ldap_servers, ["localhost"]}. % List of LDAP servers
%{ldap_uidattr, "uid"}. % LDAP attribute that holds user ID
%{ldap_base, "dc=example,dc=com"}. % Base of LDAP directory
% For authentification via external script use the following:
%{auth_method, external}.
%{extauth_program, "/path/to/authentification/script"}.
% Host name:
{host, "xxx.ru"}.
% Default language:
{language, "en"}.
% Listened ports:
{listen,
[
{5222, ejabberd_c2s, [{access, c2s},
zlib,
{shaper, c2s_shaper}]},
% To create selfsigned certificate run the following command from the
% command prompt:
%
% openssl req -new -x509 -days 365 -nodes -out ejabberd.pem -keyout ejabberd.pem
%
% and answer the questions.
% {5222, ejabberd_c2s, [{access, c2s},
% starttls, {certfile, "./ejabberd.pem"},
% {shaper, c2s_shaper}]},
% When using SSL/TLS ssl option is not recommended (it requires patching
% erlang ssl application). Use tls option instead (as shown below).
{5223, ejabberd_c2s, [{access, c2s},
tls, {certfile, "/var/spool/ejabberd/ejabberd.pem"},
{shaper, c2s_shaper}]},
{5269, ejabberd_s2s_in, [{shaper, s2s_shaper}]},
{5555, ejabberd_service, [{access, all},
{host, "icq.xxx.ru", [{password, "YYYYYYY"}]}]},
% MSN Ttansport
{5347, ejabberd_service, [{host, "msn.xxx.ru", [{password, "YYYYYY"}]}]}
% {5280, ejabberd_http, [http_poll, web_admin]}
]}.
% If SRV lookup fails, then port 5269 is used to communicate with remote server
{outgoing_s2s_port, 5269}.
% Used modules:
{modules,
[
{mod_adhoc, []},
{mod_register, [{access, register}]},
{mod_roster, []},
{mod_privacy, []},
{mod_configure, [{access, admin}]},
{mod_disco, []},
{mod_stats, [{access, admin}]},
{mod_vcard, []},
{mod_offline, []},
{mod_announce, [{access, announce}]},
{mod_private, []},
{mod_irc, []},
% Default options for mod_muc:
% host: "conference." ++ ?MYNAME
% access: all
% access_create: all
% access_admin: none (only room creator has owner privileges)
{mod_muc, [{access, muc},
{access_create, muc},
{access_admin, muc_admin}]},
{mod_pubsub, []},
{mod_time, []},
{mod_last, []},
{mod_version, []}
]}.
% Local Variables:
% mode: erlang
% End:
Кластер
Долго мучался...может кому пригодиться...
...блин, много геммороя с местами размещения файлов (особенно в виндовозе)
куки и хосты и пути по умолчанию разные в зависимости от учетной записи, под которой запускаеться сервер...(при этом путь по умолчанию береться как C:\Documents and Settings\Administrator)
а у меня после создания схемы распределенной таблицы (schema.DAT)
erl -sname ejabberd -mnesia extra_db_nodes ['ejabberd@hosting2'] -s mnesia
она оказалась в месте по умолчанию (C:\Program Files\ejabberd-2.0.4\bin\Mnesia.ejabberd@server2), а с указанием пути вылазили ошибки
erl -sname ejabberd -mnesia dir "/var/lib/ejabberd/" -mnesia extra_db_nodes "['ejabberd@first']" -s mnesia
, все заработало после того как я ее руками в первоначальную базу перенес (C:\Program Files\ejabberd-2.0.4\database\ejabberd@server2)
есть еще один момент (гдето в инструкции освещен но обычно пропускаешь...=))
в фвйле .hosts.erlang обязательно должны быть ''. ('server1.test.ru'.) иначе не пинг не работает ни базы друг друга не видят...