为了使自己相信Paxos和Raft等标准算法的复杂性是必要的,我们必须理解为什么更简单的解决方案并不令人满意。假设为了在N个机器的集群中的事件流(即实现复制的时间增长日志)达成共识,提出了以下算法:
每当计算机想要向日志附加消息时,它都会广播元组(msg, rnd, prev)
,其中msg
是消息,rnd
是随机数,{ {1}}是日志中最后一条消息的ID。
当机器收到元组时,会将prev
作为msg
的子项插入,形成一棵树。
如果某个节点有多个子节点,则只有prev
个节点被认为有效;通过树的有效消息的路径是主链。
如果邮件是主链的一部分,并且它已经足够大,则会被视为已决定/最终。
如果一台机器试图提交一条消息,并且一段时间后它没有出现在主链上,这意味着另一台机器大致同时播放了一条消息,因此您重新广播它一直存在。
看起来简单,高效且适应崩溃。这个算法会起作用吗?
答案 0 :(得分:1)
如果一台机器按顺序发送两个元组并且第一个丢失(包丢失/损坏或其他),我认为你有问题
在这种情况下,假设机器1的上一个id为10,并且将另外两个(msg,rnd,10)= 11和(msg,rnd,11)= 12发送到机器2。
机器2仅接收(msg,rnd,11)但在其树中没有prev id 11。 机器3接收两者,因此将其插入主树。
此时,您将在分布式树之间进行异步。
我通过机器x将它们插入树中发送给发件人,并在等待它发送下一个包之后,我提出了一个ack。
这样,发件人需要将以前的消息重新发送到在给定时间范围内未能确定的机器。