Zookeeper-03一致性

➤ Zk实现的一致性:

  • Zk实现的是顺序一致性: A/B事务依次被提交, 如果客户端看到了B版本的数据, 一定不会再看到A版本的数据;
  • Zk并不保证强一致性, 如果一个Zk集群有10个节点, 向Leader更新一项数据, 如果有6个节点写入成功则Zk认为此次写入成功, 但如果客户端刚好从另外4个节点读取数据, 读到的还是旧版本数据.
  • 考虑两个客户端A和B的场景。如果客户端A将znode /a的值从0设置为1,此时客户端B读取/a,有可能读取旧值0,读到新值or旧值取决于连接到的服务器。如果客户端A和客户端B读取相同的值很重要,则客户端B应该在执行读取之前调用 ZooKeeper API的 sync() 方法。

➤ Zk的写入过程:

  1. Client向Leader发出写请求。
  2. Leader将数据写入到本节点,并将数据发送到所有的Follower节点;
  3. 等待Follower节点返回;
  4. 当Leader接收到一半以上节点(包含自己)返回写成功的信息之后,返回写入成功消息给client;

如果第一步, Client连接上的是Follower端, 则由Follower把写请求转发给Leader, Leader进行正常的写流程, 超半数节点写成功后, Leader把结果返回给Follower, Follower把写入成功的结果发送给Client

➤ @ref: