你能使用权重来避免群体中的脑裂吗?

Can you use weights to avoid split brain in a quorum?

我们正在考虑部署一个集群数据库,我们希望在系统中增加和减少节点数量,有些系统有一个、两个或三个节点。 Percona Clustered DB 具有加权仲裁机制。我认为可以选择权重来打破对称性,从而始终避免脑裂。但是,我找不到任何文献说是这样,这让我怀疑自己。

想法是这样的。为每个节点分配以下权重之一:127 + 0、127 + 1、127 + 2、127 + 4、127 + 8、127 + 16、.. 等等。

给定集群中节点的两个不相交的子集,ab,我认为必须维护的两个要求是:

1) 如果子集 a 比另一个子集 b 具有更多节点,则其权重之和 w(a),永远大于另一组权重之和..

|a| > |b| --> w(a) > w(b)

2) 对称破缺..给定任意两个子集,那么权重将不相等。这是避免偶数节点裂脑的需求。

|a| = |b| --> w(a) != w(b)

这种方法有什么问题吗?如果有,它们是什么?

更多问题描述...

  1. 理想情况下,我们会为多节点配置提供相同的解决方案,以节省测试时间。
  2. 无法动态更改节点权重(它们可以..但它并不完全安全..Percona 集群的限制以及可能的仲裁算法?)。
  3. Percona 将在完全关闭节点后重新计算总节点权重。

这听起来好像会像您描述的那样运行,但对于您描述的内容来说显得不必要地复杂。据我从网络搜索 (https://www.percona.com/blog/2015/06/12/percona-xtradb-cluster-quorum-availability-cluster/) 可以看出,当系统正常 运行 时,它知道每个节点上的权重总和是多少。失去连接后,连接的子集将仅在其仍然具有超过 50% 的权重时才允许写入。在潜在的脑裂情况下,分裂的双方都不可能相信他们都拥有超过 50% 的权重,因为这样的话,每一半的权重之和就必须超过所有权重的总和,这是不可能的。

只有当分裂恰好在中间时,你才能避免双方都去读 - 但这不是通常所说的脑裂。 https://en.wikipedia.org/wiki/Split-brain_(computing)。如果您的目标是最大限度地提高一些剩余部分在失败后仍然能够写入的可能性,或者在失败后最大限度地提高写入客户端的可用性,我的猜测是您最好的猜测是开始考虑可能出现的失败,给定您的物理网络拓扑,并将其考虑到您的计算中。每种可能的不可用性模式似乎不太可能是同样可能的。

如果您有奇数个节点并给每个节点赋予一个权重,则没有拆分会在每一侧留下相等的权重,因为总权重必须是奇数。如果您有偶数个节点,则给一个节点赋予 2 的权重,给其他节点赋予每个节点 1 的权重。然后你的总重量又是奇数,所以没有分裂可以给每一半相同的重量。当然,如果您在拆分中丢失了一个节点,则其余节点可以平均拆分,例如一个|乙、丙、丁| E,F,G 但我不确定您是否希望 E,F,G 在这种情况下继续,因为如果拆分只是双向的 A,B,C,D | E,F,G 您可能希望 A,B,C,D 继续,而 E,F,G 无法判断拆分是否是 A | B、C、D | E、F、G 或 A、B、C、D | E,F,G