emqx4.4.7 节点启动顺序不同产生的warning

环境信息

  • EMQX 版本:4.4.7
  • 操作系统及版本:Centos7

问题描述

我的集群有两个节点,集群配置相关信息如下:

cluster.discovery = static
cluster.static.seeds=emqx@a.private.com,emqx@b.private.com
rpc.port_discovery = stateless

节点stop顺序如下:
集群启动成功之后,我先手动停掉 emqx@a.private.com,再手动停掉 emqx@b.private.com

启动顺序1:
先启动 emqx@a.private.com,再启动 emqx@b.private.com
启动 a 节点时,会收到如下warning,此时集群不工作;启动 b节点之后warning停止,集群恢复正常。

[warning] ekka_mnesia: still waiting for table(s): [emqx_resource,mqtt_app,emqx_rule,emqx_banned,mqtt_admin]
[warning] Check down_nodes should get [] but got ['emqx@b.private.com'], Table emqx_resource is waiting for one of the nodes: ['emqx@b.private.com'] , Table mqtt_app is waiting for one of the nodes: ['emqx@b.private.com'] , Table emqx_rule is waiting for one of the nodes: ['emqx@b.private.com'] , Table emqx_banned is waiting for one of the nodes: ['emqx@b.private.com'] , Table mqtt_admin is waiting for one of the nodes: ['emqx@b.private.com']

启动顺序2:
先启动 emqx@b.private.com,再启动 emqx@a.private.com
启动b节点时,收到如下warning,此时单独一个b节点情况下,集群也可以正常工作;启动a节点之后,warning停止。

[warning] Ekka(AutoCluster): discovered nodes outside cluster: ['emqx@a.private.com']
[warning] Ekka(AutoCluster): discovery did not succeed; retrying in 5000 ms

我是想了解一下,为什么先启动最后停掉的节点时,单个节点可以正常工作;先启动最先停掉的节点时就不行呢?这个启停的过程中发生了些什么呢?
谢谢~~

emqx 用的是 erlang 的 mnesia 数据库,从 CAP 上来说它是个 CA 系统。就是说强一致性、并且不允许发生网络分片的。

mnesia 在 shutdown 的时候,发现仍然有其他节点正在工作,它就认为其他节点的数据一定是比他要新的,所以它在重新启动的时候,会首先尝试连接那些节点,如果连接不上就一直等待那些节点,目的是为了防止产生数据不一致。