0

我们正在考虑部署一个集群数据库,我们希望在系统中向上和向下扩展节点数量,某些系统具有一个、两个或三个节点。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 将在节点完全关闭后重新计算总节点权重。
4

1 回答 1

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)。如果您的目标是最大化某些剩余部分在失败后仍然能够写入的概率,或者最大化失败后写入客户端的可用性,那么我的猜测是您最好的猜测是开始考虑可能存在哪些失败,给定您的物理网络拓扑,并将其纳入您的计算中。似乎每种可能的不可用模式都具有同等可能性。

如果您有奇数个节点并为每个节点赋予 1 的权重,则任何拆分都不会在每一侧留下相等的权重,因为总权重必须是奇数。如果您有偶数个节点,则给一个节点的权重为 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

于 2018-02-04T05:50:24.590 回答