zookeeper之数据模型

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/usagoole/article/details/82944230

版本声明

  1. Zookeeper服务器版本:3.4.6

数据模型

  1. Zookeeper维护着一个树形层次结构,树中的节点被称为znodeZnode可以用于存储数据,并且有一个与之关联的ACL(access control list,访问控制列表)。Zookeeper被设计为用来实现协调服务(通常使用小数据文件),而不是用于大容量数据存储。因此一个znode能存储的数据被限制在1MB以内。
  2. Zookeeper的数据访问具有原子性。客户端在读取一个znode的数据时,要么读到所有的数据,要么读操作失败,不会只读到部分数据。同样,写操作将替换znode存储的所有数据。Zookeeper会保证写操作不成功就失败,不会出现部分写之类的情况。
  3. Zookeeper中的路径必须是绝对路径,即每条路径必须从一个斜杠开始。所有路径必须是规范的,即每条路径只有唯一的一种表示方式,不支持路径解析。/zookeeper是一个保留词,不能用作一个路径组件。Zookeeper使用/zookeeper来保存管理信息

Znode

  1. ZnodeZookeeper中数据的最小单元,每个Znode上都可以保存数据,同时还可以挂载子节点,znode之间的层级关系就像文件系统的目录结构一样,zookeeper将全部的数据存储在内存中以此来提高服务器吞吐量、减少延迟的目的。

  2. Znode有三种类型,Znode的类型在创建时确定并且不能修改。

    • 临时(EPHEMERAL):在创建临时Znode的客户端会话结束时,服务器会将临时节点删除。临时节点不能有子节点(即使是临时子节点)。虽然每个临时Znode都会绑定一个特定的客户端会话,但是它们对所有客户端都是可见的
    • 持久(PERSISTENT):节点一旦被创建,会一直存在与服务器上,Zookeeper规定所有非叶子节点必须是持久化节点
    • 顺序(SEQUENTIAL):如果在创建Znode时设置了顺序标识,那么该Znode名称之后便会附加一个值,这个值由一个单调递增的计数器(由父节点维护)所添加
  3. 临时节点在两种情况下会被删除

    • 当创建Znode的客户端的会话因超时或者主动关闭而终止时(不是TCP连接断开)
    • 当某个客户端(不一定是临时Znode的创建者)主动删除该节点时
  4. 每个数据节点除了存储数据内容之外,还存储了数据节点本身的一些状态信息。Znode的状态(Stat)信息

        [zk: 127.0.0.1:2181(CONNECTED) 1] get /jannal-create/user/password
        123456
        cZxid = 0x6000000e4
        ctime = Wed Oct 03 22:46:07 CST 2018
        mZxid = 0x6000000e4
        mtime = Wed Oct 03 22:46:07 CST 2018
        pZxid = 0x6000000e4
        cversion = 0
        dataVersion = 0
        aclVersion = 0
        ephemeralOwner = 0x0
        dataLength = 6
        numChildren = 0
    
    状态属性 说明
    cZxid Created ZXID表示该数据节点被创建时的事务ID
    ctime Created Time表示节点被创建的时间
    mZxid Modified ZXID 表示该节点最后一次被更新时的事务ID
    mtime Modified Time表示节点最后一次被更新的时间
    pZxid 表示该节点的子节点列表最后一次被修改时的事务ID。只有子节点列表变更了才会变更pZxid,子节点内容变更不会影响pZxid
    cversion 子节点的版本号
    dataVersion 数据节点版本号
    aclVersion 节点的ACL版本号
    ephemeralOwner 创建该临时节点的会话的SessionID。如果节点是持久节点,这个属性为0
    dataLength 数据内容的长度
    numChildren 当前节点的子节点个数

    -w403

  5. Zookeeper中版本(version)表示的是对数据节点的数据内容、子节点列表或是节点ACL信息的修改次数,初始为0表示没有被修改,每当对数据内容进行更新,version就会加1。如果前后两次修改并没有使得数据内容发生变化,version的值依然会变化。修改时如果设置version=-1,表示客户端并不要求使用乐观锁,可以忽略版本对比。

        //第一次dataVersion是0
        [zk: 127.0.0.1:2181(CONNECTED) 1] get /jannal-create/user/password
        123456
        cZxid = 0x6000000e4
        ctime = Wed Oct 03 22:46:07 CST 2018
        mZxid = 0x6000000e4
        mtime = Wed Oct 03 22:46:07 CST 2018
        pZxid = 0x6000000e4
        cversion = 0
        dataVersion = 0
        aclVersion = 0
        ephemeralOwner = 0x0
        dataLength = 6
        numChildren = 0
        
        //将值修改为1234567后dataVersion变为1
        [zk: 127.0.0.1:2181(CONNECTED) 3] set /jannal-create/user/password 1234567
        cZxid = 0x6000000e4
        ctime = Wed Oct 03 22:46:07 CST 2018
        mZxid = 0x6000000e6
        mtime = Wed Oct 03 23:02:52 CST 2018
        pZxid = 0x6000000e4
        cversion = 0
        dataVersion = 1
        aclVersion = 0
        ephemeralOwner = 0x0
        dataLength = 7
        numChildren = 0
        
        //将值修改为原来的123456后dataVersion变为2
        [zk: 127.0.0.1:2181(CONNECTED) 4] set /jannal-create/user/password 123456
        cZxid = 0x6000000e4
        ctime = Wed Oct 03 22:46:07 CST 2018
        mZxid = 0x6000000e7
        mtime = Wed Oct 03 23:02:57 CST 2018
        pZxid = 0x6000000e4
        cversion = 0
        dataVersion = 2
        aclVersion = 0
        ephemeralOwner = 0x0
        dataLength = 6
        numChildren = 0
    
展开阅读全文

没有更多推荐了,返回首页