目录

Zookeeper通过树形节点Znode(文件系统)来存储数据,在Znode处可以选择存储数据,也可以选择只存储路径,路径下可以有子路径。
| 方法 | 作用 |
| create /path data | 在指定位置创建节点,并设置数据 |
| delete /path | 删除节点 |
| exists /path | 判断节点是否存在 |
| setData /path data | 设置节点数据 |
| getData /path | 获取节点数据 |
| getChildren /path | 获取节点的子节点 |
需要注意的是,getData和setData只能是全量更新和获取,而不能追加或者部分更新。
持久化节点和临时节点
持久化节点和临时节点的使用选择:
当你需要存储一些不随着节点的消息而始终存在的数据时,需要使用持久化节点。
当节点的存在与服务节点或者master节点的活性绑定的时候,需要使用临时节点。
有序节点和非有序节点
有序节点指的是按照创建顺序为你生成一个自增的id,通过id维护节点的顺序,当然,持久化节点可以是有序的,临时节点也可以是有序的。
有序节点和非有序节点的使用选择:
当存在资源的协调使用,或者采用Zookeeper实现分布式锁等类似的场景时,可以使用有序节点,来协调处理的顺序。

因此可以分为:有序持久化节点、无序持久化节点、有序临时节点、无序临时节点。
假设我们需要关注这样一个场景:我们需要检测当前某个节点下有没有数据,有数据就需要处理。

最常规的做法就是轮询,间隔一定的时间去查询一下有没有变动。但是如果更新时间无法预测,没有规律可言,那么造成资源的浪费。
我们就会想,如果你有数据的时候告诉我一声,我是不是就不用每次都来问你了?

这就是Zookeeper的订阅与通知功能。
当c1有数据操作时,因为c2事先添加了watch(订阅),所以有了步骤2通知的存在。
需要注意的是:
1. watch是一次性的,发生了一次变动以后,就会失效,想要新的通知需要进行新的订阅
2. 通知是在单次发生的情况下进行的,也就是说假如c1添加了两条数据,那么通知会在第一次添加结束和第二次添加开始之前进行通知。
3. 可以查询Zookeeper的状态来避免接受通知的过程中又发生新的数据变动。
watch的类型:
| 数据变动 |
| 子节点变动 |
| 节点的创建和删除 |
Zookeeper会维护一个版本号,在每次数据变化时,都会升级一次版本号。在setData和delete操作的时候,为了解决并发问题,客户端需要指定版本号,当你的版本号与当前的版本号不一致时,说明你的版本号是旧的,操作会失败。只有版本号匹配时,操作才能成功。
