EMQ创建集群后,将所有节点均关闭,然后重启其中一部分节点,集群恢复失败

错误报告

现象一:搭建EMQ集群时,有三个节点A,B,C。将三个节点依次关闭,先关闭A再关闭B最后关闭C,依次重启节点,在只重启节点A和B但是节点C未重启时,集群恢复失败,浏览器控制台无法显示且客户端无法连接节点A和B。(多次试验发现:关闭所有节点后,最后关闭的那一个节点未启动时,其他节点启动了,此时是无法恢复集群的。必须当最后关闭的那个节点启动了才能恢复集群)。

现象二:搭建EMQ集群时,有三个节点A,B,C(其中C设置为将保留消息存放在内存和磁盘中,A和B不不做该设置)。将三个节点依次关闭,关闭顺序不分先后。依次重启节点。在C不启动的状态下只启动A和B时,集群无法恢复(多次试验发现:设置为将保留消息存放在内存和磁盘中的这个节点不启动的状态下,其他两个节点启动,无法恢复集群)

环境

  • EMQX 版本:4.4.14(开源版)
  • 操作系统版本:centos7
  • 三台电脑,均为centos7系统,均使用4.4.14版本的EMQ开源版

问题

想问下这个是一个什么样的机制呢,是机制如此还是BUG呢

你好,EMQX 会认为集群中最后停止的节点拥有最新的数据,所以这需要你按照 C、B、A 的顺序来启动他们,如果你先启动 A 或者 B 节点,他们也会一直等待 C 节点启动才能正常运行。

你好,我有几点疑惑:

  1. 在上述情况基础上,如果节点C的电脑出现故障了无法再重启,那么A节点和B节点就会一直无法运行,该情况下能否有方法能够恢复A和B吗?
  2. 如果是在A、B、C正常通信下,断开A和BC的网线连接,再依次关闭A->B->C全部关闭。再将网络连接恢复,先重启A时A能正常通信吗,先程序C时C能正常通信吗(这就是关乎到了哪个节点是最新的数据)
    再次感谢回复
  1. 如果确定是 C 不在了,那么可以在两个正在等待的节点(A和B)上,执行 ./bin/emqx_cluster_rescue force-load 来强行启动他们。
    如果你的 emqx 版本没有 emqx_cluster_rescue 工具,可以执行 ./bin/emqx eval '[ {T, mnesia:force_load_table(T)} || T <- mnesia:system_info(local_tables), unknown =:= mnesia:table_info(T, load_node)]'
  2. emqx 有个配置 cluster.autoclean = 5m,默认 5mins 后就从集群断开连接。所以如果 A 断开了 5mins 以上,则 A 会自己成为一个单节点,BC 会把 A 从集群里移除,这时候就没有重启等待的问题。