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

标签 algorithm cluster-computing high-availability 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% 的权重时才允许写入。在潜在的脑裂情况下, split 的双方都不可能相信他们都拥有超过 50% 的权重,因为这样的话,每一半的权重之和就必须超过所有权重的总和,这是不可能的。

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

如果您有奇数个节点并给每个节点赋予一个权重,则没有拆分会在每一侧留下相等的权重,因为总权重必须是奇数。如果您有偶数个节点,则给一个节点赋予 2 的权重,给其他节点赋予每个节点 1 的权重。然后你的总重量又是奇数,所以没有 split 可以给每一半相同的重量。当然,如果您在拆分中丢失了一个节点,则其余节点可以平均拆分,例如一个 |乙、丙、丁| 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

关于algorithm - 你能使用权重来避免群体中的脑裂吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48603329/

相关文章:

快速计算大字符串之间距离的 C# 代码或算法?

algorithm - Fortune算法中的断点收敛

python - 返回产生最大差异的值的索引

linux - BSUB 将多个 matlab 作业集中到一个集群中?

mysql - 错误 1111 (HY000) : Invalid use of group function in MySQL Cluster 7. 3

kubernetes - 在 pi 为零的情况下运行 k3s

algorithm - 计算 cargo 需要多少辆卡车(后续)

azure - 可用性集显示问题 - 将虚拟机放置在与可用性集位置不同的位置时

message-queue - 如何使用 Celery 保证消息传递?

design-patterns - 可扩展性的设计模式(或技术)