2

假设我将一些机器放在一个弹性集群中,并希望在它们中运行一些共识算法(比如 Paxos)。假设他们知道网络的初始规模,比如 8 台机器。

因此,他们将运行共识算法,法定人数为 5。

现在,考虑这些情况:

  1. 我看到 CPU 太低了,我将集群大小减半,减少到 4 台机器。
  2. 有一个分区拆分,每个拆分得到4台机器。

如果我采用当前的集群大小来获得仲裁,我会受到分区拆分的影响。因为对于底层集群,情况(1)和(2)看起来完全一样。但是,如果我使用固定数量,我将无法缩小集群(如果我扩大规模,我会因分区而出现不一致)。

我有第三种选择,即在扩展时通知所有机器集群的大小,但是有可能在扩展之前发生分区,例如,该分区没有收到新的大小并且有足够的仲裁使用旧尺寸的共识。

Paxos(以及任何其他安全的共识算法)在弹性环境中无法使用吗?

4

2 回答 2

2

基于法定人数的共识协议从根本上需要法定人数才能运行。Multi-Paxos 和 Raft 都可以在集群和仲裁大小动态变化的环境中使用,但必须以始终保持一致仲裁的受控方式完成。例如,如果您当前使用的集群大小为 8,并且想要将该集群的大小减少到 4。您可以这样做。但是,将集群大小减少到 4 的决定必须是原始 8 同意的一致决定。

您的问题有点不清楚,但听起来您在问是否可以安全地将集群大小减少到 4 作为恢复机制,以防某种网络分区导致您原来的 8 集群无法运行。对此的回答实际上是否定的,因为这样做的决定不可能是双方同意的,并且试图落后于共识算法实际上肯定会导致不一致。如何定义新的 4 组?您如何保证所有同行都得出相同的结论?您如何确保他们都同时做出相同的决定?

当然,您可以手动做出所有这些决定,并通过关闭每个系统上的共识服务并手动重新配置它们的仲裁定义来强制系统恢复。假设您没有搞砸(这对于任何实际部署来说都是一个非常大的假设),这将是安全的。更好的方法是设计系统,使一个或两个网络分区不会停止系统(许多站点),或者使用最终一致性模型来优雅地处理偶尔的网络分区。绕过 CAP 限制没有灵丹妙药。

于 2015-12-23T16:53:02.880 回答
2

Paxos 和朋友可以以弹性的方式(在某种程度上)扩展。但是,不要更改仲裁大小,只需添加learners。学习者是不参与共识但获得所有决策的节点。就像接受者一样,学习者接受读取并将写入转发给领导者。

学习者有两种风格。第一个监听来自接受者的所有事件;在第二个中,领导者将所有已提交的转换转发给学习者

于 2015-12-23T23:05:56.290 回答