ArangoDB 故障处理——Cluster 与 ActiveFailover

ArangoDB failure handling - Cluster vs ActiveFailover

假设我有 3 个节点和两种可能的 ArangoDB 配置:

现在假设节点 1 和 2 出现故障。哪种配置更有弹性? ActiveFailover 配置中的 Follower 是否可以访问,即使节点 1 运行 代理已关闭?或者集群配置会更优雅地处理这种情况,让节点 3 可用于处理读写?

不幸的是,两种配置中的 none 可以在两个节点出现故障时幸存下来。这样做的原因是,任何有利于一致性而不是可用性的配置都无法仅在 3 个节点中的一个节点上继续。这是因为这个节点可能是网络拆分的较小一半。如果我们继续使用单个节点,那么我们可能会面临裂脑场景,在这种情况下,另一半 2 节点也会继续,我们最终会出现不一致的状态。

在 ArangoDB 中,我们选择了一致性而不是可用性。因此,在任何 3 个节点的集合中,其中 2 个节点出现故障,幸存的节点将不会继续服务,而是等待它结束,直到至少有一个节点恢复。

现在让我们比较两个配置对于​​一个节点故障的情况:ActiveFailover 配置将继续工作,因为两个数据节点(Leader 和 Follower)中至少有一个将存活,并且与第三个 运行只需要一个Agent,他们就可以选举出一个leader,让存活的数据节点成为Leader。如果 only-Agent 节点发生故障,那么领导者选举仍然有效,因为另外两个节点实际上也是 运行 一个 Agent。但请注意,如果当前 Leader 发生故障,则会发生故障转移,但由于复制只是异步的,因此可能会丢失一些已提交的数据!

集群基本上以相同的方式运行,只是它具有更对称的设置。如果任何节点发生故障,其他两个节点可以继续。如果所有集合的复制因子至少为 2,则故障转移可以将每个分片的领导权移动到一个幸存的节点。由于复制是同步的,因此不会丢失提交的数据。这是集群相对于 ActiveFailover 设置的优势。但是,请注意,由于同步复制,操作的延迟可能会更高,并且由于并非所有数据都集中在单个节点上,因此某些操作的性能可能会更差,因为我们的数据局部性较低。不管怎样,天下没有免费的午餐,终究是要付出代价的。