建站做得好的公司,东莞网站建设策划,应用软件界面设计工具,查询关键词密度网站的网址有哪些一、Zookeeper数据结构 Zookeeper数据模型与结构与Unix文件系统很类似#xff0c;整体上可以看做是一棵树#xff0c;每个节点称做一个ZNode。 Zookeeper的数据模型是层次模型#xff0c;层次模型常见于文件系统 。层次模型和Key-Value模型是两种主流的数据模型#xff0c;…一、Zookeeper数据结构 Zookeeper数据模型与结构与Unix文件系统很类似整体上可以看做是一棵树每个节点称做一个ZNode。 Zookeeper的数据模型是层次模型层次模型常见于文件系统 。层次模型和Key-Value模型是两种主流的数据模型Zookeeper使用文件系统模型主要以下两点考虑
文件系统的树形结构便于表达数据之间的层次关系文件系统的树形结构便于为不同的应用分配独立的命名空间(namespace) Zookeeper的层次模型称做Data TreeData Tree的每个节点叫做ZNode。不同于文件系统每个节点都可以保存数据每个ZNode默认能够存储1MB的数据每个ZNode都可以通过其路径的唯一标记每个节点都有一个版本Version版本从0开始计数;
public class DataTree {private final ConcurrentHashMapString, DataNode nodes new ConcurrentHashMapString, DataNode();private final WatchManager dataWatches new WatchManager();private final WatchManager childWatches new WatchManager();}public class DataNode implements Record {byte data[];Long acl;public StatPersisted stat;private SetString children null;} 1.1 节点分类 zookeeper存在几种不同的节点类型他们具有不同的生命周期 类型 生命周期 创建示例 持久节点 persistent node) 一直存在一直存储在ZooKeeper 服务器上即使创建该节点的客户端与服务端的会话关闭了该节点依然不会被删除 create /locks 临时节点 (ephemeral node) 当创建该临时节点的客户端会话因超时或发生异常而关闭时该节点也相应在 ZooKeeper 服务器上被删除。 create -e /locks/DBLock 有序节点 (sequential node) 并不算是一种单独种类的节点而是在之前提到的持久节点和临时节点特性的基础上增加了一个节点有序的性质。在我们创建有序节点的时候会自动使用一个单调递增的数字作为后缀 create -e -s /jobs/job (临时有序节点) 容器节点 (container node) 当一个容器节点的最后一个子节点被删除后容器节点也会被删除 create -c /work TTL节点 (ttl node) 当一个TTL节点在 TTL 内没有被修改并且没有子节点会被删除。注意默认此功能不开启需要修改配置文件extendedTypesEnabledtrue create -t 3000 /ttl_node 一个znode可以拥有持久性也可以是临时性的
持久节点PERSISTENT这样的znode在创建之后即使发生zookeeper集群宕机也不会丢失临时节点EPHEMERALclient宕机或者client在指定的timeout时间内没有给zookeeper集群发消息这样的znode就会消失 如果上面两种znode具备顺序性又有一下两种znode
持久顺序节点(PERSISTENT_SEQUENTIAL):znode除了具备持久的特点外znode的名字具备顺序性临时顺序节点(EPHEMERAL_SEQUENTIAL)znode除了具备znode的特点外znode名字还具备顺序性 zookeeper主要用到的是以上4种节点。
Container节点 (3.5.3版本新增)Container容器节点当容器中没有任何子节点该容器节点会被zk定期删除定时任务默认60s 检查一次)。 和持久节点的区别是 ZK 服务端启动后会有一个单独的线程去扫描所有的容器节点当发现容器节点的子节点数量为 0 时会自动删除该节点。可以用于 leader 或者锁的场景中。 1.2 节点状态信息 类似树状结构节点下面是可以存储一些信息和属性的可以通过stat命令来查看。
cZxidZnode创建的事务idctime节点创建时的时间戳mZxidZnode被修改的事务id即每次 对znode的修改都会更新mZxid 对于zk来说每次变化都会产生一个唯一的事务idzxid(ZooKeeper Transaction Id),通过Zxid可以确定更新操作的先后顺序例如如果zxid1小于zxid2说明zxid操作先zxid2发生zxid对于整个zk都是唯一的及时操作的是不同的znode
pZxid表示该节点的子节点列表最后一次修改的事务ID添加子节点或者删除子节点就会影响子节点列表但是修改子节点的数据内容不影响该ID(注意只有子节点列表变更了才会变更pzxid子节点内容变更不会影响pzxid)cversion子节点的版本号当zonode的子节点有变化时cversion的值就会增加1ephemeralOwner如果该节点伟临时节点ephemeralOwner的值表示与该节点绑定的session id。如果不是ephemeralOwner值为0(持久化节点) 在client和server通信之前首先需要建立连接该连接称做是session。连接建立之后如果发生连接超时、授权失败或者显示关闭连接连接便会处于closed状态此时session结束。
dataLength数据的长度numClidren子节点的数量(只统计直接子节点的数量)
3.3 监听机制 watch机制顾名思义是一个监听机制。Zookeeper中的watch机制必须客户端先去服务端注册监听这样事件发送才会触发监听通知给客户端。
监听的对象是事件支持的事件类型如下 None: 连接建立事件NodeCreated 节点创建NodeDeleted 节点删除NodeDataChanged节点数据变化NodeChildrenChanged子节点列表变化DataWatchRemoved节点监听被移除ChildWatchRemoved子节点监听被移除 特性 说明 一次性触发 watch是一次性的一旦被触发就会移除再次使用时需要重新注册 客户端顺序回调 watch回调是顺序串行执行的只有回调后客户端才能看到最新的数据状态。一个watcher回调逻辑不应该太多以免影响别的watch执行 轻量级 WatchEvent是最小的通信单位结构上只包含通知状态、事件类型和节点路径并不会告诉数据节点变化前后的具体内容 时效性 watcher只有在当前session彻底失效时才会无效若在session有效期内快速重连成功则watcher依然存在仍可接收到通知
3.3.1 永久性watch 在被触发之后仍然保留可以继续监听ZNode上的变更是Zookeeper 3.6.0版本新增的功能。 addWatch [-m mode] path addWatch的作用是针对指定节点添加事件监听支持两种模式 PERSISTENT持久化订阅针对当前节点的修改和删除事件以及当前节点的子节点的删除和新增事件。PERSISTENT_RECURSIVE持久化递归订阅(默认)在PERSISTENT的基础上增加了子节点修改的事件触发以及子节点的子节点的数据变化都会触发相关事件满足递归订阅特性