最近在学习Paxos
,到现在已经对它的工作原理有了基本的了解。但是谁能解释一下 Paxos 如何处理丢包和新节点加入?如果提供一个简单的例子可能会更好。
3 回答
经典的 Paxos 算法没有“新节点加入”的概念。一些 Paoxs 变体可以,例如“Vertical Paxos”,但经典算法要求在运行算法之前静态定义所有节点。关于丢包,Paxos 使用了一个非常简单的无限循环:“尝试一轮算法,如果出现任何问题,再尝试一轮”。因此,如果在第一次尝试解决问题时丢失了太多数据包(可以通过等待回复的简单超时来检测),则可以尝试第二轮。如果该轮的超时到期,请再试一次,依此类推。
究竟如何检测和处理丢包是 Paxos 算法未定义的。这是一个特定于实现的细节。这对于生产环境来说实际上是一件好事,因为如何处理它会对基于 Paxos 的系统产生相当大的性能影响。
关于丢包,Paxos 使用下一个关于网络的假设:
消息可能会丢失、重新排序或重复。
这是通过quorums解决的。至少有 X 个 Acceptor 必须接受一个值,系统才能接受它。这也解决了节点失败时的问题。
关于新节点加入,Paxos 并不关注节点如何检测其他节点。这是其他算法解决的问题。
他们自动知道所有节点和每个人的角色
如果需要,对于生产代码实现,可以使用Zookeeper来解决这个新节点检测。
正如其他答案中所指出的,消息丢失或消息重新排序由算法处理:它旨在完全处理这些情况。
新节点加入是“集群成员更改”的问题。有一个普遍的误解,认为 Paxos 不涵盖集群成员更改;但是它们在 2001 年论文Paxos Made Simple的最后一段中有所描述。在这篇博文中,我讨论了它。有一个问题是新节点在加入集群时如何获取所有状态的副本。这在这个答案中进行了讨论。