eJabberd 22.05执行leave_cluster命令移除节点失败问题求助
eJabberd 22.05执行leave_cluster命令移除节点失败问题求助
从你提供的错误日志和环境信息来看,这个问题的核心原因大概率是Erlang OTP版本不兼容,结合你的Ubuntu 18.04系统环境,我来具体拆解一下:
错误关键点分析
你看到的错误栈里最关键的部分是:
{undef, [{erl_error, format_exception, [2,error,undef, [...]
erl_error模块以及它的format_exception/6函数是Erlang OTP 24版本才新增的功能,而eJabberd 22.05官方明确要求依赖Erlang OTP 24.0及以上版本。但Ubuntu 18.04 LTS默认仓库提供的Erlang版本是OTP 21.x,这个版本里根本没有erl_error模块,所以当ejabberd尝试调用这个函数时就会抛出undef(未定义)的错误,进而导致RPC连接失败。
另外还有一个小细节:你是在要移除的节点ltxmpp2.gims上执行ejabberdctl leave_cluster 'ejabberd@ltxmpp2.gims',虽然ejabberd文档允许在目标节点上执行这个命令,但更稳妥的方式是在集群中其他正常运行的节点(比如ltxmpp1或ltxmpp3)上执行该命令,指定要移除的节点名称,这样可以避免目标节点自身状态异常导致的RPC问题。
解决建议
- 检查并升级Erlang版本
先执行erl -version确认当前系统的Erlang版本,如果确实是低于OTP 24的版本,需要添加Erlang Solutions的软件源来安装兼容版本:wget https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb sudo dpkg -i erlang-solutions_2.0_all.deb sudo apt update sudo apt install erlang - 重新编译ejabberd
因为你是从源码安装的ejabberd,需要用升级后的Erlang版本重新编译安装,确保ejabberd的编译环境和运行环境版本一致:cd /path/to/ejabberd-source make clean make sudo make install - 正确执行移除节点命令
在集群中正常运行的节点(比如ltxmpp1.gims)上执行:
执行前确保目标节点ejabberdctl leave_cluster 'ejabberd@ltxmpp2.gims'ltxmpp2处于运行状态,或者如果已经停止,可以使用ejabberdctl force_leave_cluster命令强制移除。
备注:内容来源于stack exchange,提问作者abby murali
相关产品推荐
相关产品推荐

