FMO的一大特点就是分布式、节点式的,除了初始的实名认证,后续不需要任何中心服务器就可以使用。但这也可能带来一个问题,如果服务器数量很多,爱好者分散,反而可能降低使用体验。但反过来,如果将多个服务器组合成集群实现分布式节点,既能缓解单个服务器的压力,也可以让更多服务器活跃起来。本文将介绍使用EMQX服务器实现集群的方法。
首先简单了解一下集群的工作原理。EMQX的手册上有一张图,很形象的描述了这个过程:

现在有三台FMO服务器组成集群,如果BG5ESN加入了服务器1并呼叫CQ,而BG6HFD位于服务器2上,那服务器1在自身广播的同时将信息发送给服务器2、3,服务器2、3再进行广播,所有连接到集群里任意服务器的爱好者都能听到BG5ESN的CQ呼叫。随后BG6HFD回应,这时服务器2在自身广播的同时,还会将信息发送到服务器1、3,所有连接到集群里任意服务器的爱好者都能听到BG6HFD的回应。
环境:以Linux为例(博主使用Ubuntu24.04),已经搭建了可用的EMQX服务器。
网络:在1883通讯端口与面板控制18083的基础上,还需要开放EMQX 节点通信端口:4370 与RPC 监听端口:5370 。
经过研究,对于FMO这样多核心节点的情况,使用手动模式集群是既能满足要求又方便快捷的。
零 过程理解
集群在组队过程时,是分为主要服务器与其它服务器的,这个分类主要体现在:在主要服务器上配置好所有参数,再让其它服务器加入,加入时会使用主要服务器的配置覆盖自身配置。
为便于理解,我们假设有三台服务器要配置成集群,分别是主要服务器:服务器1,和其它服务器:服务器2、服务器3。
一 统一Cookie
1.Cookie生成
集群要求服务器Cookie值一致。首先创建Cookie,先生成一串字符,在任意一台服务器上打开终端,运行:
openssl rand -hex 16
2.应用到所有服务器
复制生成的字符串,即作为Cookie值,在所有服务器的终端上依次执行以下命令:
echo "生成的Cookie值" | sudo tee /var/lib/emqx/.erlang.cookie
sudo chmod 600 /var/lib/emqx/.erlang.cookie
sudo chown emqx:emqx /var/lib/emqx/.erlang.cookie
sudo systemctl restart emqx
以上命令,第一行是创建并写入Cookie文件,第二行是设置文件权限为仅所有者可读写,第三行是设置所有者为EMQX,第四行是重启EMQX服务使配置生效。
等服务运行后,可以在各服务器终端运行以下命令,确保所有服务器能够获取Cookie且值相同:
sudo cat /var/lib/emqx/.erlang.cookie
二 节点名配置
登录EMQX面板,若之前未进行过修改,查看节点信息,会发现节点名称是emqx@127.0.0.1。
集群要求各服务器节点名称不能一致,而且最好是emqx@域名 或 emqx@IP 的形式,域名与IP均需要是EMQX服务器的真实地址。节点名的需要修改emqx.conf文件,这里可以用终端修改。
在终端里可以用vim修改文件,运行以下指令:
sudo vim /etc/emqx/emqx.conf
显示文件内容后,用方向键移动光标,找到以下内容:
node {
name = "emqx@127.0.0.1"
cookie = "emqxsecretcookie"
data_dir = "/var/lib/emqx"
}
按下i键,进入编辑模式,配合光标移动,修改emqx@127.0.0.1为emqx@fmo服务器真实地址:
node {
name = "emqx@fmo.tylk.cc服务器地址"
cookie = "emqxsecretcookie"
data_dir = "/var/lib/emqx"
}
修改好后先按esc键,再输入 :wq! 并回车(即强制保存退出),文件就保存好了。
随后运行重启EMQX命令:
sudo systemctl restart emqx
重启后再登录面板,注意面板的用户名密码已变成默认的admin/public了,请参考服务器搭建文章重新设置。此时节点名称就变为刚刚修改的内容了。
三 服务器原参数备份
除非您的FMO服务器没有独立运行的需求,不然博主建议您加入集群前一定备份一下原参数,这些参数包括面板用户名与密码,客户端认证与授权数据,黑名单数据等;若不备份,在退出集群后就需要作为一台新服务器重新配置了。
在EMQX服务运行时,在终端运行以下命令:
/usr/lib/emqx/bin/emqx_ctl data export
稍等片刻,备份就能完成,需要关注的是最后一行信息:
Data has been successfully exported to /var/lib/emqx/backup/emqx-export-2026-01-07-10-55-01.912.tar.gz.
很显然,/var/lib/emqx/backup/emqx-export-2026-01-07-10-55-01.912.tar.gz 就是备份文件的路径与名称,可以按需将文件复制或备份到别处。如果需要恢复备份,则在终端运行:
/usr/lib/emqx/bin/emqx_ctl data import /var/lib/emqx/backup/emqx-export-2026-01-07-10-55-01.912.tar.gz(文件名按实际修改)
文件名与路径请按实际更改。恢复完成后会有提示:
Data has been imported successfully.
四 加入集群
1.主服务器填写同步信息
将其它服务器的FMO服务器凭证填写至客户端认证的内置数据库里,并给其它FMO服务器管理员的FMO客户端授权,以上步骤请参考FMO语音服务器搭建教程里的“用户名密码配置-数据源创建”部分与“服务器安全配置-管理员配置”部分。
2.其它服务器加入集群
在服务器2、3(其他服务器)的终端里运行以下命令,加入服务器1的节点:
/usr/lib/emqx/bin/emqx_ctl cluster join emqx@fmo.tylk.cc服务器1地址
若加入成功,会返回以下信息:
Join the cluster successfully.
Cluster status: #{running_nodes => ['emqx@fmo.tylk.cc服务器1地址','emqx@fmo2.tylk.cc服务器2地址','emqx@fmo3.tylk.cc服务器3地址'],stopped_nodes => []}
五 集群状态检查
查看服务器有没有加入集群,以及各服务器节点在线状态如何,可以在任意一台服务器终端运行以下命令:
/usr/lib/emqx/bin/emqx_ctl cluster status
如果配置正常,可以得到以下回复:
Cluster status: #{running_nodes => ['emqx@fmo.tylk.cc服务器1地址','emqx@fmo2.tylk.cc服务器2地址','emqx@fmo3.tylk.cc服务器3地址'],stopped_nodes => []}
如果有服务器节点在stopped_nodes里,可以尝试重启该服务器的EMQX服务。
六 退出集群
若服务器3想要退出集群,变为独立节点,在服务器3上的终端运行以下命令:
/usr/lib/emqx/bin/emqx_ctl cluster leave
也可以在其它服务器上运行以下命令移除服务器3:
/usr/lib/emqx/bin/emqx_ctl cluster force-leave emqx@fmo3.tylk.cc服务器3地址
即可退出集群。当然,退出集群的服务器会恢复初始状态:用户名密码恢复为admin/public,之前配置的客户端认证与授权条目也将消失,需要恢复备份或重新配置。
参考上文备份相关内容,终端运行以下命令可以恢复备份(文件名与路径请按实际更改):
/usr/lib/emqx/bin/emqx_ctl data import /var/lib/emqx/backup/emqx-export-2026-01-07-10-55-01.912.tar.gz(文件名按实际修改)
恢复提示成功后,无需重启就可以作为独立服务器正常使用了。