paxos - Paxos 让选择提议值变得简单
问题描述
论文说:
1.提议者选择一个新的提议号 n 并向一组接受者中的每个成员发送请求,要求其响应:
(a) 承诺不再接受编号小于 n 的提案,并且
(b) 其已接受的最大数量小于 n 的提案,如果有的话。
我将这样的请求称为编号为 n 的准备请求。
2.如果proposer收到大多数acceptor的请求响应,那么它可以发出>一个编号为n且值为v的proposal,其中v是response中编号最高的proposal的值,或者是选择的任何值如果响应者未报告任何提案,则由提案者提交。
我的问题是,如果提议者在响应中选择 v,那么新轮次将始终使用以前保存的值,我们如何更新值?
说我们有:
v=1
在所有节点之间。然后客户想要更新它
v=2
每个准备阶段都会用 收集响应v=1
,然后用 提议v=1
,所以v=2
永远不会使用!
许多实现v=2
在接收客户端请求的节点上响应,因此v=2
被提议。但是这种实现方式违反了规则
(b)它已经接受的最大数量小于n的提案,如果有的话。
因为v=2
从来没有被接受过!我不能被建议回复。
解决方案
我认为您正在寻找的是一种在成功设置为 1 后更新 V 的方法。您是正确的,一旦大多数同行同意 v=1,该 Paxos 实例就会被 v=1 锁定,并且它将从不改变。您需要的是另一个 paxos 实例来更新 v=2。这通常被称为“Multi-Paxos”,其中有一个 Paxos 实例的线性链,用于更新节点之间的共享状态。每个实例都是谨慎的,并且需要新的 Paxos 轮次,但尚未提出任何建议。在上面的示例中,将为实例 A 选择 v=1,而为实例 B 选择 v=2。
推荐阅读
- c# - 无法统一使用UI按钮切换到特定场景,为什么?
- redis - 即使等待,solaris 10 中的僵尸进程
- apache-spark - 无法使用 Spark 从 AWS EMR 集群执行 mtermvectors elasticsearch 查询
- vue.js - Vue:如何避免在mounted() 中使用setTimeout 来等待道具可用?
- macos - 用于安装在测试仪 PC 上的 Mac 应用程序的证书和配置文件
- c++ - 有没有办法测量 c++ 程序的运行时内存使用情况?
- assembly - 为什么编译器不使用 ENTER 和 LEAVE 指令?
- java - 从构造函数 Java 中获取特定参数
- reactjs - 一起使用 SVGR 和 Material UI
- css - 为什么“cursor”的“auto”值会给我的锚点一个类似文本的光标