我已经在维基页面和论文(paxos变得简单)上阅读了关于paxos的内容.但是,我仍然对一些细节感到困惑:
在阶段1a,提议者是否包括它打算在接受者提案中选择的值?
在阶段1b中,接受者应该返回先前接受的值(如果有的话).这个价值的生命周期是多少?IOW,什么时候被认为是被接受的,什么时候被覆盖/丢弃?
关于终身问题的一些更新.国际工会联合会在首次接受后,接受方应始终具有先前已接受的价值.它如何决定是否应该在下一个承诺(1b)阶段归还?或者它何时决定忘记价值?
更新2以更好地与@MichealDeardeuff讨论:
我对paxos有如下理解:
通常在paxos工作流程中,接受者应始终具有先前接受的值.在回答准备请求时,它会在promise响应中发回值.并且提议者需要检查该值是否与上一轮中提出的值相同.如果不是,则提议者继续发送接受请求,其中包含接受者返回的值.如果是,则提议者继续发送具有其打算在当前轮次中发送的值的Accept请求.
以上理解是否正确?
如果不正确,请您解释原因?
如果它是正确的,我很困惑,因为paxos协议没有明确说明.它只说明:
其中v是响应中编号最高的提议的值,如果响应未报告提议,则为任何值.
但是,根据我的理解,提议者需要检查并查看acceptor返回的值是否与上一轮中提出的相同提议者的值相同.如果是,即使在promise响应中存在具有编号最高的提议的值,提议者仍然可以选择它想要的任何值,就好像没有接受者返回的值.
这就是我想看看是否有任何参考支持理解的原因.
非常感谢!
谁能告诉我为什么提案 Id 在 Paxos 中需要是唯一的?我认为这个proposalId需要唯一的原因是我们需要使用它来拒绝旧提案并对最大投票进行排序。所以如果我们做第一阶段:acceptor 只接受大于promiseId 的提议并且是增量的,它仍然可以保证一致性。
我们假设提议者 A 向接受者提出了一个提议 (proposalId x, value y),然后他得到了多数同意的答复,另一个具有相同提议 id(x) 的提议者 B 发出提议请求,这个提议者 B 将被拒绝,对吧? 最终,我们仍然可以达到一致性,对吧?
共识算法(例如 raft)要求集群包含奇数个节点以避免裂脑问题。
假设我有一个由 5 个节点组成的集群,如果只有一个节点发生故障会发生什么?集群现在有4个节点,打破了奇数规则,集群会继续正常运行吗?
一种解决方案是再删除一个节点,使集群只包含 3 个节点,但是如果之前出现故障的节点又回来了怎么办?那么集群又有了 4 个节点,为了保持集群奇数,我们必须将之前丢弃的节点带回来。
共识算法的实现是自动处理这个问题,还是我必须在我的应用程序代码中这样做(例如,删除一个节点)?
考虑一个具有 3 个节点的分布式系统 - n1、n2、n3。节点之间有一个共享数据x。Paxos 正在节点上运行。一开始,x 等于 4。
客户端向n1发送更新请求,将x的值修改为5。n1和n2通过运行Paxos就新值达成共识,但n3出现了一些链路故障,因此n3没有最新的x值。
我们知道Paxos提供强一致性。另一方面,如果客户端向 n1 发送一个读请求,同时向 n3 发送另一个读请求,则返回值不相同(其中一个是 5,另一个是 4)。因此,运行Paxos后,系统并不是强一致的。
我的问题是:如何解决这个矛盾?我是不是误会了什么?
concurrency distributed-computing distributed-system consensus paxos
我想证明我对 multi-paxos 的实现是正确的。是否有任何有效的示例供我测试?或者可以有其他一些方法来说服其他人我的实施是正确的。
我试图找到一些包含示例的论文,但大多数论文只是指定了算法。