zoukankan      html  css  js  c++  java
  • ZooKeeper的数据模型

    • ZooKeeper的数据模型

        ZooKeeper提供的命名空间与标准的文件系统的命名空间非常类似;名称是由斜杠(/)分隔的一系列路径元素;ZooKeeper命名空间中的每个节点都由路径标识,如下图;

        

         ZooKeeper命名空间中的每个节点都可以具有与其关联的数据以及子节点。就像拥有一个文件系统一样,该文件系统也允许文件成为目录(ZooKeeper中的每个节点会存储一些自身的数据:状态信息,配置,位置信息等,因此存储在每个节点上的数据通常很小,在字节到千字节范围内);

        在ZooKeeper树形结构中的每个节点都可以称为znode;znode维持了一个stat结构,它包括数据变化的版本号、访问控制列表变化、和时间戳,允许缓存验证和协调更新;每当znode的数据有变化,版本号就会增加(例如,每当客户端检索数据时同时它也获取数据的版本信息);

    • Znode类型
      • 持久节点(PERSISTENT)

          持久节点的存活时间不依赖于客户端会话,只有客户端在显式执行删除节点操作时,节点才消失;

    创建了一个持久节点/module,且其数据为”demo”
    create /module demo
    
      • 持久顺序节点(PERSISTENT_SEQUENTIAL)

          该节点创建后持久存在,相对于持久节点它会在节点名称后面自动增加一个10位数字的序列号,这个计数对于此节点的父节点是唯一,如果这个序列号大于2^32-1就会溢出;

    create加上-s参数,可以创建持久顺序节点
    create -s /module/app app
    

          上面的命令便创建了一个持久顺序节点/module/app0000000001;如果再执行此命令,则会生成节点 /module/app0000000002;

      • 临时节点(EPHEMERAL)

          临时节点的存活时间依赖于客户端会话,当会话结束,临时节点将会被自动删除(当然也可以手动删除临时节点);利用临时节点的这一特性,我们可以使用临时节点来进行集群管理,包括发现服务的上下线等; ZooKeeper规定,临时节点不能拥有子节点;

    创建了一个临时节点 /module/app,数据为”app”,会话关闭后,临时节点会被删除
    create /module/app app
    

        

      • 临时顺序节点(EPHEMERAL_SEQUENTIAL)

        具有临时节点特征,但是它会有序列号,分布式锁中会用到该类型节点

    create加上-s参数,可以创建顺序节点
    create -s -e /module/app app
      • 节点属性

         使用 get /module/app20000000001 获取节点的数据,如下图;

        

    cZxid 创建节点时的事务ID
    ctime 创建节点时的时间
    mZxid 最后修改节点的事务ID
    mtime 最后修改节点时的时间
    pZxid 表示该节点的子节点列表最后一次修改的事务ID,添加子节点或删除子节点就会影响子节点列表,但是修改子节点的数据内容则不影响该ID
    cversion 子节点版本号,子节点每次修改版本号加1
    dataversion 数据版本号,数据每次修改该版本号加1
    aclversion 权限版本号,权限每次修改该版本号加1
    ephemeralOwner   用于临时节点,表示创建该临时节点的事务id,如果当前的节点不是临时
    节点,该字段值为
    0  
     numChildren 该节点拥有子节点的数量 

        

         Zookeeper里面的版本号它表示的是对数据节点的内容、子节点列表或者ACL信息的修改次数;节点创建时dataversion、aclversion,cversion都为0;

         Zookeeper中的版本号就是乐观锁,修改节点数据之前会读取这个数据并记录该数据版本号,当需要更新时会携带这个版本号去提交,如果此时携带的版本号(上次读取出来的)和当前节点的版本号相同,则说明该数据没有被修改过,那么数据修改就会成功提交,如果数据修改失败,说明该数据在你读取之后和提交之前这段时间内被修改了。 

         通过set命令并携带正确的版本号提交更新,版本号相同更新就会成功,并将dataversion的值加1;

          

         

        再次更新并使用之前的版本号那么就会失败;

        

  • 相关阅读:
    夺命雷公狗---PDO NO:9 使用PDO准备语句并执行语句3
    夺命雷公狗---PDO NO:9 使用PDO准备语句并执行语句2
    [LeetCode] Lowest Common Ancestor of a Binary Search Tree
    二叉树
    LeetCode Palindrome LinkList
    LeetCode Same Tree
    LeetCode Merge Sorted List
    LeetCode Remove Duplicated from Sorted List
    LeetCode Climbing Stairs
    LeetCode Count And Say
  • 原文地址:https://www.cnblogs.com/coder-zyc/p/11602889.html
Copyright © 2011-2022 走看看