Pet*_*iak 8 membership algorithm distributed consistency
我正在寻找一种算法,其中可以将连接节点组合并在一起以形成新组(通过在不同组的节点之间创建链接).并且可以对组进行分区以形成新分区.
与会员协议的共识风格(例如,在Raft论文中描述的那种)不同,在分区之后只有一个组可以保留,我希望每个新分区形成一个新组.
此外,我希望每个分区都有,每个成员都会同意哪个属于该分区,具有强大的一致性保证.
或者换句话说,我希望保留以下属性:在一个组进行成员资格更改后,如果属于原始组的两个节点仍然可以通信(两者之间有路径),则他们应该就序列达成一致发生在集团的变化.
我的理解是,每个新分区在某种意义上对不同的成员集合达成一致的事实意味着CAP定理的一致性部分是放松的.希望这样的协议可能存在(?).
没有任何共识协议(例如 Paxos、Raft 等)可以用来开发多组成员协议。这是因为所有共识协议都基于这样一个基本思想:任何决定只有在大多数成员“同意接受”的情况下才能做出。通过这种方式,可以避免“裂脑”现象,因为不可能有 2 个分区(大小大于大多数:)就(n/2)+1不同的领导者(以及成员集)达成一致,因为至少有一个成员会同意不同的领导者(以及成员集)。是两个分区的成员,并且只会投票给其中一个分区(第一个要求投票的分区)。
虚拟同步(Virtual Synchrony)是一种可以用来创建多组成员协议的协议。但是,请注意,虚拟同步是一种用于将消息发送到(静态)预定义进程组(也称为这些组的当前现有成员)的协议。因此,它不适用于应在每个新分区(动态)创建新进程组的情况。另请注意,虚拟同步是一种无法扩展到更大成员的协议,因为消息延迟与组大小成正比。
我相信通过使用虚拟同步协议,你可以开发这样一个成员协议,它可以满足条件
组经历成员资格更改后,如果属于原始组的两个节点仍然可以通信(两者之间有路径),则它们应该就组发生更改的顺序达成一致
但是,请注意,这种成员资格在严格意义上并不强一致,因为节点的故障最终可能会在组内传播。尽管如此,消息传递(这是最重要的)将以确保这些传递服从组成员资格的方式传递。这是通过在成员端对消息传递施加命令来实现的。
成员协议的另一种替代方法是基于八卦的成员协议,将现实生活中的实现集成到工业中的各种工具中,例如Consul。为了利用这种方法,您可以从每个成员发出多个不同类别的消息,具体取决于您想要监视的不同组。然而,这些组同样是在协议内部静态定义的,并且最终是一致的(意味着每个故障最终都会被所有在线成员检测到)。
作为结论,我认为严格一致的成员协议在严格的定义中是不可行的,因为你无法区分失败的成员和响应非常慢的成员(FLP和 CAP 定理的基础)。