你好!想了解一下集群的启动原理,
场景1:如A/B/C三个节点,当前运行C为主节点,节点关闭顺序是C/B/A,此时主节点转移到A,当需要启动emqx服务时,必须要先启动主节点A,再启动B/C节点才能正常启动emqx服务,如果先启动B/C节点,这时B/C节点会在等待主节点A启动(
如果A节点没法启动,如服务器损坏,那B/C会一直等待,我这里在 B/C 节点上通过指令./bin/emqx_cluster_rescue force-load 让 B/C 离开已有的集群,离开集群后,如果启动顺序是B/C,此时B就成为新的分区下的主节点,由此新的分区以B节点来同步数据,当然也就不会有A节点的数据,由于A节点一直没法启动,但是如果A节点后面恢复了,这时会存在两个分区吗?还是说C节点与A/B 节点的数据是以哪个为主节点来同步最新的数据呢?
首先 emqx_cluster_rescue 是给 EMQX 运维内部灾难恢复 用的,而且只是灾难恢复中的某一步。 其他步骤看情况而定。
force-load 能帮助节点起来恢复服务但是可能导致集群内数据不一致。
force-load 不会让节点离开集群。
在你说的情况下 因为 你在 B 和 C 节点都 做了 force-load, 很可能产生了 3 份不同的数据。 虽然 三台 在一个集群内,但是数据存在不一致 会导致其它难以排查的问题。
或者是否可以这样同步数据呢?我的操作顺序应该是,B节点执行./bin/emqx_cluster_rescue force-load,这里先把B节点启动起来,然后再清空C节点的DATA目录的数据,相当于清空C节点的本地数据,再加入到集群,那这时C节点与B节点的数据能保证是一致的,最后A节点恢复后,我再清空A节点的data目录的数据,跟C节点的操作一样, 这样就能保证三者的数据是一致的,对吗?
这取决于你关闭B节点时 B节点是否已产生损坏的数据。
你可以take risk 把 B 节点数据当source of truth 恢复集群 但是像之前提到的可能有不可见的问题 为未来排查提高难度,虽然这个概率和影响范围都比较小也取决于集群内持久化了什么数据。
如果A 节点数据还在的话我建议 重建 A 节点再 启动B 和C ,不要使用 emqx_cluster_rescue 脚本
好的明白,一般也是A节点启动不了才会使用到 emqx_cluster_rescue,其问除 emqx_cluster_rescue外还有其它方法在主节点没法启动下可以正常恢复emqx集群吗?
在你提到的情况是三个节点都倒了,且有一台无法恢复 这个一般很低概率发生。
如果A节点启动不了 而且没有备份 那只能忍受数据丢失了, 使用 emqx_cluster_rescue 恢复的集群也需要 核对数据一致性,具体看使用的业务而定。
如果是运维需要停止所有三个节点 那建议导流到其它新集群再关闭这个老集群。
这种场景是有的,这种是忍受丢数据的情况下,如果我其中一个节点使用emqx_cluster_rescue ,比如B节点执行emqx_cluster_rescue ,那C节点我在启动前清空data目录,这样就不会导致数据不一致的问题了吧?因为C相当于新部署的节点启动,这样就B跟C的节点数据就能同步一致了吧?
我觉得最好情况是 C 节点会从B 那里拉取数据。 不需要清空 C 节点。 除非C节点对A 节点有依赖。
你也可以先恢复B 节点然后重建集群 (重建 A 和 C)。