一、znode
Zookeeper维护一个类似文件系统的数据结构。简单来说,有点类似windows中注册表的结构,有名称,有树节点,有Key(键)/Value(值)对的关系,可以看做一个树形结构的数据库,分布在不同的机器上做名称管理。
Znode维护了一个stat结构,这个stat包含数据变化的版本号、访问控制列表变化、还有时间戳。版本号和时间戳一起,可让Zookeeper验证缓存和协调更新。每次znode的数据发生了变化,版本号就增加。
例如,无论何时客户端检索数据,它也一起检索数据的版本号。并且当客户端执行更新或删除时,客户端必须提供他正在改变的znode的版本号。如果它提供的版本号和真实的数据版本号不一致,更新将会失败。
二、通知机制
客户端注册监听他关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端。
client端会对某个znode建立一个watcher事件,当该znode发生变化时,zk会主动通知watch这个znode的client,然后client根据znode的变化来做出业务上的改变等。
watcher的特点:
-
轻量级:一个callback函数。
-
异步性:不会block正常的读写请求。
-
主动推送:Watch被触发时,由Zookeeper服务端主动将更新推送给客户端。
-
一次性:数据变化时,Watch只会被触发一次。如果客户端想得到后续更新的通知,必须要在 Watch 被触发后重新注册一个 Watch。
-
仅通知:仅通知变更类型,不附带变更后的结果。
-
顺序性:如果多个更新触发了多个Watch,那 Watch 被触发的顺序与更新顺序一致。
使用watch的注意事项:
-
由于watcher是一次性的,所以需要自己去实现永久watch
-
如果被watch的节点频繁更新,会出现“丢数据”的情况
-
watcher数量过多会导致性能下降