假设我在一个弹性集群中抛出一些机器,并希望在它们中运行一些共识算法(例如,Paxos)。假设他们知道网络的初始大小,比如8台机器。
因此,他们将运行一致性算法,法定人数为5.
现在,请考虑以下情况:
如果我使用当前的簇大小来获取仲裁,我将受到分区拆分的影响。因为对于底层集群,情况(1)和(2)看起来完全相同。但是,如果我使用固定数字,我无法缩小群集(如果我将其扩展,我会受到分区的不一致)。
我有第三种选择,即在扩展时通知所有机器群集的大小,但是例如,在扩展之前可能会发生分区,并且该分区没有接收到新的大小并且具有足够的法定人数使用旧的大小达成共识。
Paxos(以及任何其他安全共识算法)在弹性环境中是否无法使用?
答案 0 :(得分:2)
基于法定人数的共识协议从根本上要求法定人数才能运作。 Multi-Paxos和Raft都可以在具有动态变化的群集和仲裁大小的环境中使用,但必须以受控的方式完成,始终保持一致的仲裁。例如,如果您当前使用的簇大小为8,并希望将该簇减少到4的大小。您可以这样做。但是,将群集大小减小到4的决定必须是原始8同意的决定。
你的问题有点不清楚但是听起来好像你问你是否可以安全地将群集大小减少到4作为恢复机制,以防某些网络分区使你的原始群集无法运行。对此的答案实际上是否定的,因为做出这样做的决定不能是双方同意的,并且试图落后于共识算法的背后几乎可以保证导致不一致。如何定义新的4组?您如何保证所有同行得出同样的结论?你如何确保他们同时做出同样的决定?
当然,您可以手动执行所有这些决策,并通过关闭每个系统上的共识服务并手动重新配置其仲裁定义来强制系统恢复。假设你没有搞砸(这对于任何实际部署来说都是一个非常大的假设),这将是安全的。但更好的方法是设计系统,使一个或两个网络分区不会停止系统(许多站点)或使用最终的一致性模型,优雅地处理偶尔的网络分区。解决CAP限制没有灵丹妙药。
答案 1 :(得分:2)
Paxos和朋友可以弹性扩展(有点)。但是,只需添加 learners ,而不是更改仲裁大小。学习者是不参与共识的节点,但获得所有决策。就像接受者一样,学习者接受读取并将写入转发给领导者。
学习者有两种风格。第一个听取接受者的所有事件;在第二阶段,领导者将所有承诺的过渡转发给学习者