在可靠的分布式系统中,领导者选举对于写入成功是强制性的,我可以理解它必须遵循 Paxos 算法。
但是,为什么读取请求不需要领导者选举(因此是共识)?(例如在 Zookeeper 中)
我错过了什么吗?
在可靠的分布式系统中,领导者选举对于写入成功是强制性的,我可以理解它必须遵循 Paxos 算法。
但是,为什么读取请求不需要领导者选举(因此是共识)?(例如在 Zookeeper 中)
我错过了什么吗?
Zookeeper 读取不是线性化的,因此不需要共识协调。相反,它们是顺序一致的,允许从客户端连接的节点进行本地读取。
例如 Raft 也是如此。您可以执行本地读取并获得最多的顺序一致性(前提是您与节点协调以不读取比您所看到的更旧的数据),但如果您想要线性化读取,您必须“提交”读取操作(即让系统同意在您读取之前提交哪些写入),再次需要达成共识。
Zookeeper 不是线性化的。参见例如https://github.com/jepsen-io/jepsen/issues/399。一个可以同步+读取的常见神话(并且,在此编辑之前,我在这里重复了这个神话),但引用 Zookeeper 文档:
使用同步有一个警告,它是相当技术性的,并且与 ZooKeeper 内部密切相关。(请随意跳过。)因为 ZooKeeper 应该为读取主导的工作负载提供快速读取和扩展服务,同步的实现已经被简化,它并没有像创建常规更新操作那样真正遍历执行管道,设置数据,或删除。它只是到达领导者,领导者将响应排队返回给发送它的跟随者。领导者认为自己是领导者 l 的可能性很小,但不再得到法定人数的支持,因为法定人数现在支持不同的领导者 lʹ。在这种情况下,领导者 l 可能没有所有已处理的更新,同步调用可能无法兑现其保证。