1

我在提议者任务(xcom_base.c)中看到了这样的代码段

if(threephase || ep->p->force_delivery){
    push_msg_3p(ep->site, ep->p, ep->prepare_msg, ep->msgno, normal);
}else{
    push_msg_2p(ep->site, ep->p);
}

threepahseint const threephase = 0force_delivery == 0这里

push_msg_eq正常的paxos是否包括准备、接受和学习阶段

但是 push_msg_2p 将跳过准备阶段并直接发送接受请求

我想知道为什么,非常感谢。

4

1 回答 1

1

如果你看一下Paxos Made Simple第 10 页第 3 段的论文说:

新选择的领导者为无数个共识算法实例执行阶段 1 [...]

然后第4段:

由于领导者的失败和新领导者的选举应该是罕见的事件,执行状态机命令的有效成本——即就命令/值达成共识——是仅执行共识算法的第 2 阶段的成本. 可以看出,Paxos 共识算法的第 2 阶段具有在存在故障的情况下达成一致的任何算法的最小可能成本。因此,Paxos 算法本质上是最优的。

这就是说,领导者仅在领导者故障转移期间发出准备。之后,它流接受消息。然后它具有“最佳消息传递”,因为领导者只需要一次往返即可知道选择了一个值(接受消息及其确认)。

在三节点集群中,领导者会立即自我接受,然后只需要来自第二个节点的一个接受确认即可获得多数。然后它知道选择了该值,而不必等待来自第三个节点的响应(可能已关闭)。这是尽可能高效的。已知该值在具有强一致性的第二个节点处被接受。

鉴于这就是 paxos 工作以获得最大效率的方式,我们应该期望 mysql xcom 具有在稳定状态下跳过准备消息阶段的模式。

您可以在我的博客上阅读有关 Paxos Made Simple 技术的更多信息。

您可能有兴趣了解 Paxos 的最新发展,其中您不需要多数响应来使用FPaxos和诸如偶数节点优化之类的技巧在集群中接受消息。

于 2018-01-23T18:37:30.067 回答