文档地址:https://zookeeper.apache.org/doc/current/zookeeperOver.html
ZooKeeper 非常快速且非常简单。但是,由于它的目标是成为构建更复杂服务(例如同步)的基础,因此它提供了一组保证。这些是:
英文单一系统映像描述
Single System Image - A client will see the same view of the service regardless of the server that it connects to. i.e., a client will never see an older view of the system even if the client fails over to a different server with the same session.
很多人会认为这句话的含义是:
我的疑惑是
假如有5个节点的集群,leader+4个follower。 leader写入数据为R1->R2->R3,因为ZAB协议并不是强一致性,follower1、follower2的数据为R1->R2->R3(保证写入成功),但是follower3是R1->R2,follower4是R1.此时客户端和follower3有连接,读取到的数据为R2;
针对这两个问题查了下资料
问题1: 一致性问题
zk保证的是
及时性——系统的客户视图保证在特定时间范围内是最新的。
时间范围可以通过配置修改:syncLimit tickTime 来实现
问题3:顺序性
zk保证的是,如何客户端读取到R2,就可能读取到R2之前的值;实现方式是: 客户端保留了一个 zxid,如果它从较新的服务器读取了一些数据,它将不会连接到较旧的 follower
看官方文档的另一个收获是
3.6.0 中的新增功能:客户端还可以在 znode 上设置永久的递归监视,这些监视在触发时不会被删除,并且会递归地触发已注册 znode 以及任何子 znode 上的更改。
New in 3.6.0: Clients can also set permanent, recursive watches on a znode that are not removed when triggered and that trigger for changes on the registered znode as well as any children znodes recursively.
可以不用触发一次,添加一次监听了