0

谁能帮助介绍如何从分布式集群中读取内容?

我的意思是有一个分布式集群,它的一致性是由 Paxos 算法保证的。

在实际应用中,客户端如何读取他们写入集群的内容?

例如,在一个 5 台服务器集群中,可能只有 3 台获得最新数据,而另外 2 台由于网络延迟或其他原因有旧数据。

这是否意味着客户端至少需要读取所有节点中的大多数?在 5 台服务器中,这意味着从至少 3 台服务器读取数据并检查版本号最新的服务器?

如果是这样,看起来很慢,因为您需要阅读 3 份?现实世界如何实现这一点?

4

1 回答 1

2

客户应该从领导者那里阅读。如果一个节点知道它不是领导者,它应该将客户端重定向到领导者。如果一个节点不知道谁是领导者,它应该抛出一个错误,客户端应该随机选择另一个节点,直到它被告知或找到领导者。如果节点认为它是领导者,那么从本地状态返回读取是很危险的,因为它可能刚刚失去与集群其余部分的连接,当它发生大规模停顿时(cpu 负载、io 停顿、vm 过载、大型 gc ,一些后台任务,服务器维护工作,...)这样它实际上在回复客户端时失去了领导权并给出了一个陈旧的阅读。这可以通过运行一轮(多)Paxos 进行读取来避免。

Lamport Clocks 和 Vector Clock 说,当它们在不同的机器上运行时,您必须传递消息以指定操作 A 在操作 B 之前发生。如果不是,它们同时运行。这为为什么我们不能在不与集群的大多数成员交换消息的情况下说来自领导者的读取不是陈旧的提供了理论基础。消息交换建立了读取到下一次写入的“之前发生”的关系(这可能由于故障转移而发生在新的领导者上)。

领导者本身可以是一个接受者,因此在三节点集群中,它只需要来自另一个节点的一个响应即可完成一轮(多)Paxos。它可以并行发送消息并在收到第一个响应时回复客户端。节点之间的网络应该专用于集群内的流量(并且是你能得到的最好的),这样就不会给客户端增加太多的延迟。

有一个答案描述了如何将 Paoxs 用于不能容忍过时读取或重新排序的写入的锁定服务,其中在有关 paxos 的一些问题上讨论了崩溃场景显然,锁定服务不能对锁“同时运行”进行读取和写入“因此为什么它为每个客户端消息执行一轮(多)Paxos 以严格排序跨集群的读取和写入。

于 2014-10-26T07:39:38.577 回答