作者回复: 我想您说的是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好多了,跨区域消息少了。