➤ 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的写入过程:
- Client向Leader发出写请求。
- Leader将数据写入到本节点,并将数据发送到所有的Follower节点;
- 等待Follower节点返回;
- 当Leader接收到一半以上节点(包含自己)返回写成功的信息之后,返回写入成功消息给client;
如果第一步, Client连接上的是Follower端, 则由Follower把写请求转发给Leader, Leader进行正常的写流程, 超半数节点写成功后, Leader把结果返回给Follower, Follower把写入成功的结果发送给Client
➤ @ref: