您是否可以使用砝码来避免法定人数中的裂脑?

时间:2018-02-03 23:58:20

标签: algorithm cluster-computing high-availability quorum

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

这是个主意。为每个节点分配以下权重之一:127 + 0,127 + 1,127 + 2,127 + 4,127 + 8,127 + 16,...等等。

鉴于群集中节点的两个不相交的子集 a b ,我认为必须维护的两个要求是:

1)如果一个子集 a 有比另一个 b 更多的节点,那么它的权重之和 w(a) ,总是大于另一组权重的总和。

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

2)对称性破坏..给定任何两个子集,则权重不会相等。这是避免使用偶数节点分裂大脑的要求。

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

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

更多问题说明......

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

1 个答案:

答案 0 :(得分:1)

这听起来像是按照你的描述行事,但对于你所描述的内容显得不必要地复杂化。据我所知,当网络搜索(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。然后你再次有一个奇怪的总重量,所以没有分裂可以给每一半相同的重量。当然,如果你在分割中丢失了一个节点,那么余数可以平均分割为例如A | B,C,d | 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