作者回复: 和读操作相比,写操作更耗时。而且对容错的要求越高,越要有更多的节点,写操作越耗时(因为写操作必须由leader来执行,还需要收到大多数节点的响应)。 但是想要保证linearizable的写操作数据一致性和高容错,据我所知也没有其他更好的办法。 ZooKeeper最佳的应用场景是写少读多的场景。
作者回复: 我想您说的是PPT第13页。以下是ZooKeeper leader处理一个写请求的过程: 1. Leader把写请求通过propose消息发给所有的节点。 2. Leader在收到集群中大部分节点的accept消息之后才可以发送commit消息给所有的节点。 Leader不可以直接收到用户的写请求就commit。假设我们在图中的3节点集群中加入节点4和节点5形成一个5节点集群。节点2在收到写请求之后立刻给节点1发commit消息,节点1给客户端发写成功消息。如果在节点3、节点4和节点5收到这个commit消息之前发生了如下的网络分区。 分区A 分区B 节点1 节点2 | 节点3 节点4 节点4 分区B中的节点可以新选举一个leader,从而丢失上述的写请求。丢失已经commit的写操作是不可以的。 关于这一部分的细节,后续的章节会详细说明。
作者回复: 谢谢
作者回复: 这个没有太好的办法,我能想到的就是使用更好的网络资源。使用observer已经比使用follower好多了,跨区域消息少了。