无法搭建Ejabberd集群求助:两台Ubuntu虚拟机集群连接失败
{no_ping, ejabberd@Ubuntu-VB}错误 我之前在搭建Ejabberd集群时也碰到过一模一样的{no_ping, ejabberd@Ubuntu-VB}错误,这个问题本质是Erlang节点之间无法建立网络通信——毕竟Ejabberd的集群完全依赖Erlang的分布式节点机制。咱们一步步来排查解决:
先确认主机名与网络可达性
首先在VM2上尝试ping VM1的主机名Ubuntu-VB,如果ping不通,说明两台虚拟机之间的DNS解析有问题。最简单的解决办法是在VM2的/etc/hosts文件中添加VM1的IP映射,比如:192.168.1.100 Ubuntu-VB替换成你实际的VM1局域网IP。另外要确保两台VirtualBox虚拟机的网络模式一致,推荐用桥接模式,让它们处于同一个局域网网段内,避免NAT模式下的端口转发问题。
验证Erlang Port Mapper Daemon(epmd)的连通性
Erlang节点之间通信依赖epmd服务(默认端口4369)。在VM1上执行epmd -names,你应该能看到类似ejabberd的节点名称;然后在VM2上执行:epmd -host Ubuntu-VB -names如果能正常返回VM1的节点信息,说明epmd连通没问题;如果返回错误,检查两台机器的防火墙是否开放了4369端口(Ubuntu可以用
ufw allow 4369/tcp临时开放测试)。确认
.erlang.cookie的一致性与权限
你已经复制了cookie文件,但要注意两个关键点:- 两台机器的cookie内容必须完全一致(包括大小写,Erlang cookie是大小写敏感的),可以在两台机器上执行
cat /var/lib/ejabberd/.erlang.cookie(如果ejabberd用ejabberd用户运行,路径可能是这个;如果用root运行则是~/.erlang.cookie)对比内容。 - cookie文件的权限必须是
400,且所有者是ejabberd的运行用户,执行:chmod 400 /var/lib/ejabberd/.erlang.cookie chown ejabberd:ejabberd /var/lib/ejabberd/.erlang.cookie
权限不对会导致Erlang节点拒绝连接。
- 两台机器的cookie内容必须完全一致(包括大小写,Erlang cookie是大小写敏感的),可以在两台机器上执行
核对Ejabberd节点名称
在VM1上执行ejabberdctl status,查看输出中的节点名称是否确实是ejabberd@Ubuntu-VB——有时候虚拟机的主机名可能和你预期的不一致,用hostname命令检查VM1的实际主机名,确保和你执行join_cluster时指定的节点名完全匹配。手动测试Erlang节点连接
如果上面的步骤都没问题,咱们可以用Erlang shell直接测试节点连通性,排除Ejabberd本身的问题:
在VM2上启动Erlang shell:erl -sname test@$(hostname) -setcookie $(cat /var/lib/ejabberd/.erlang.cookie)然后在shell中执行:
net_adm:ping('ejabberd@Ubuntu-VB').如果返回
pong,说明节点通信完全正常,再重新执行ejabberdctl --no-timeout join_cluster 'ejabberd@Ubuntu-VB'应该就能成功;如果返回pang,那还是回到前面的步骤排查网络或cookie问题。
内容的提问来源于stack exchange,提问作者Gopal Sharma

