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