Files
MIT6.824/lecture-08-zookeeper/8.6-tong-bu-cao-zuo-sync.md
2022-01-25 02:41:31 +00:00

2.0 KiB
Raw Blame History

8.6 同步操作sync

我们还有一个问题是否可能基于这些保证实现合理的编程总的来说Zookeeper的一致性保证没有线性一致那么好。尽管它们有一些难以理解并且需要一些额外共识例如读请求可能会返回旧数据而这在一个线性一致系统不可能发生但是这些保证已经足够好了好到可以用来直观解释很多基于Zookeeper的系统。接下来我会尝试构建一些例子来解释为什么Zookeeper不是一个坏的编程模型

其中一个原因是,有一个弥补(非严格线性一致)的方法。

Zookeeper有一个操作类型是sync它本质上就是一个写请求。假设我知道你最近写了一些数据并且我想读出你写入的数据所以现在的场景是我想读出Zookeeper中最新的数据。这个时候我可以发送一个sync请求它的效果相当于一个写请求

所以它最终会出现在所有副本的Log中尽管我只关心与我交互的副本因为我需要从那个副本读出数据。接下来在发送读请求时客户端告诉副本在看到我上一次sync请求之前不要返回我的读请求。

如果这里把sync看成是一个写请求这里实际上符合了FIFO客户端请求序列因为读请求必须至少要看到同一个客户端前一个写请求对应的状态。所以如果我发送了一个sync请求之后又发送了一个读请求。Zookeeper必须要向我返回至少是我发送的sync请求对应的状态。

不管怎么样如果我需要读最新的数据我需要发送一个sync请求之后再发送读请求。这个读请求可以保证看到sync对应的状态所以可以合理的认为是最新的。但是同时也要认识到这是一个代价很高的操作因为我们现在将一个廉价的读操作转换成了一个耗费Leader时间的sync操作。所以如果不是必须的那还是不要这么做。