iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Zookeeper 数据结构详解
  • 379
分享到

Zookeeper 数据结构详解

Zookeeper数据结构详解 2016-10-29 13:10:29 379人浏览 才女
摘要

ZooKeeper https://zookeeper.apache.org/doc/current/zookeeperOver.html ZooKeeper is a distributed, open-source coord

Zookeeper 数据结构详解

ZooKeeper

https://zookeeper.apache.org/doc/current/zookeeperOver.html

ZooKeeper is a distributed, open-source coordination service for distributed applications.
It exposes a simple set of primitives that distributed applications can build upon to implement higher level services for synchronization, configuration maintenance, and groups and naming.

It is designed to be easy to program to, and uses a data model styled after the familiar directory tree structure of file systems. 

Zookeeper是高性能,高可用,严格有序的分布式协调服务,提供了统一配置(configuration),命名(naming),同步(synchronization),以及分组服务(group service)。

同时,Zookeeper本身支持复制集群,实例间是两两连接的,维护内存中的数据状态,并持久存储中的事务日志和快照。只要大多数服务器可用,ZooKeeper服务将可用。
在“读为主”的工作负载中,它特别快。ZooKeeper应用程序可在数千台计算机上运行,并且在读取比写入更为常见的情况下,其性能最佳,比率约为10:1。

Zookeeper 保证的特性

  • 顺序一致性(Sequential Consistency):来自客户端的更新将按照其发送顺序进行执行。
  • 原子性(Atomicity):更新成功或失败。没有中间状态的结果。
  • 统一视图(Single System Image):无论客户端连接到哪个服务器,客户端都将看到相同服务的数据视图。
  • 可靠性(Reliability): 一旦数据更新被执行了,它将从那时起持续到客户端覆盖更新。
  • 及时性(Timeliness):确保系统的客户视图在特定时间范围内是最新的。

Zookeeper的数据结构

ZooKeeper提供的名称空间与标准文件系统的名称空间非常相似。

file

名称是由斜杠(/)分隔的一系列路径元素。ZooKeeper命名空间中的每个节点都由路径进行唯一标识。

ZooKeeper的层次命名空间

与标准文件系统不同,ZooKeeper命名空间中的每个节点都可以具有与其关联的数据以及子节点。就像拥有一个文件系统一样,该文件系统也允许文件成为目录。
每一个节点都可以存储数据,只是需要注意的是存储的容量是有限,一般不能超过 1MiB。

Znode 类型
  • Znode的类型分为三类:

    • 持久节点(persistent node)节点会被持久
    • 临时节点(ephemeral node),客户端断开连接后,ZooKeeper会自动删除临时节点
    • 顺序节点(sequential node),每次创建顺序节点时,ZooKeeper都会在路径后面自动添加上10位的数字,从1开始,最大是2147483647 (2^32-1)
      每个顺序节点都有一个单独的计数器,并且单调递增的,由Zookeeper的leader实例维护。
  • Znode实际上有四种形式,默认是persistent

    • PERSISTENT 持久节点: 如 create /test/a "hello" ,通过 create 参数指定为持久节点
    • PERSISTENT_SEQUENTIAL(持久顺序节点/s0000000001) ,通过 create -s 参数指定为顺序节点
    • EPHEMERAL 临时节点,通过 create -e 参数指定为顺序节点
    • EPHEMERAL_SEQUENTIAL(临时顺序节点/s0000000001) ,通过 create -s -e 参数指定为临时及顺序节点

file

  • 下面是一些实例:

(1) 创建顺序节点

[zk: 127.0.0.1:2281(CONNECTED) 0] create /seq_test/ ""
Created /seq_test
[zk: 127.0.0.1:2281(CONNECTED) 1] create -s /seq_test/s "hello"
Created /seq_test/s0000000001
[zk: 127.0.0.1:2281(CONNECTED) 2] create -s /seq_test/s "hello"
Created /seq_test/s0000000002
[zk: 127.0.0.1:2281(CONNECTED) 3] ls /seq_test
[s0000000001, s0000000002]

(2) 创建临时节点

[zk: 127.0.0.1:2281(CONNECTED) 0] create /ephe_test/ ""
Created /ephe_test
[zk: 127.0.0.1:2281(CONNECTED) 1] create -e /ephe_test/e "hello"
Created /ephe_test/e
[zk: 127.0.0.1:2281(CONNECTED) 2] ls /ephe_test
[e]

断开重新连接

[zk: 127.0.0.1:2281(CONNECTED) 0] ls /ephe_test
[]

(3) 创建临时顺序节点

[zk: 127.0.0.1:2281(CONNECTED) 0] create /ephe_seq_test/ ""
Created /ephe_seq_test
[zk: 127.0.0.1:2281(CONNECTED) 1] create -e -s /ephe_seq_test/s "hello"
Created /ephe_seq_test/s0000000001
[zk: 127.0.0.1:2281(CONNECTED) 2] ls /ephe_seq_test
[s0000000001]
Zxid(ZooKeeper Transaction Id

file

每次的变化都会产生一个集群全局的唯一的事务id, Zxid(ZooKeeper Transaction Id),由Zookeeper的leader实例维护。
这里的变化包括:

  • 任何的客户端连接到Server
  • 任何的客户端断开与Server连接
  • 任何的Znode节点被创建create、修改set、删除deletermr

Zxid是一个64位的数字,高32位表示纪元,从1开始,每次选举出一个新的leader,就会递增1;低32位是当前纪元维护的单调递增的数字,同样从1开始。

Znode 属性

file

  • cZxid :创建的事务标识。
  • ctime:创建的时间戳
  • mZxid:修改的事务标识,每次修改操作(set)后都会更新mZxidmtime
  • mtime:修改的时间戳
  • pZxid:直接子节点最后更新的事务标识,子节点有变化(创建create、修改set、删除deletermr)时,都会更新pZxid
  • cversion :直接子节点的版本号。当子节点有变化(创建create、修改set、删除deletermr)时,cversion 的值就会增加1。
  • dataVersion :节点数据的版本号,每次对节点进行修改操作(set)后,dataVersion的值都会增加1(即使设置的是相同的数据)。
  • aclVersion :节点ACL的版本号,每次节点的ACL进行变化时,aclVersion 的值就会增加1。
  • ephemeralOwner:当前节点是临时节点(ephemeral node )时,这个ephemeralOwner的值是客户端持有的session id。
  • dataLength:节点存储的数据长度,单位为 B (字节)。
  • numChildren:直接子节点的个数。
➜ zkCli.sh -server 127.0.0.1:2281
[zk: 127.0.0.1:2281(CONNECTED) 0] get /

cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1

默认根节点 / 和 /zookeeper 是存在,因此 cZxid 是 0x0。

[zk: 127.0.0.1:2281(CONNECTED) 1] ls /
[zookeeper]
[zk: 127.0.0.1:2281(CONNECTED) 2] create /test "hello"
Created /test
[zk: 127.0.0.1:2281(CONNECTED) 3] ls /
[zookeeper, test]

当创建了一个 /test 节点后,根节点的子节点就多出来了。

[zk: 127.0.0.1:2281(CONNECTED) 4] get /test
hello
cZxid = 0x100000002
ctime = Sat May 23 15:43:10 CST 2020
mZxid = 0x100000002
mtime = Sat May 23 15:43:10 CST 2020
pZxid = 0x100000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0

为什么cZxid 高32位是 0x1 表明了当前纪元为第一代,低32位是00000002 表明了当前纪元第2笔事务操作创建了 /test 节点。
为什么是2呢?因为我们是通过 zkCli.sh 客户端连接到Server的,这里会消耗一次 Zxid。

[zk: 127.0.0.1:2281(CONNECTED) 5] set /test "hello world"
cZxid = 0x100000002
ctime = Sat May 23 15:43:10 CST 2020
mZxid = 0x100000003
mtime = Sat May 23 15:43:41 CST 2020
pZxid = 0x100000002
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 11
numChildren = 0

修改 /test 节点数据,mZxidmtimedataVersion发生了变化, dataLength 变为了( "hello world"占用了11个字节)。

[zk: 127.0.0.1:2281(CONNECTED) 6] create /test/a ""   
Created /test/a
[zk: 127.0.0.1:2281(CONNECTED) 7] get /test              
hello world
cZxid = 0x100000002
ctime = Sat May 23 15:43:10 CST 2020
mZxid = 0x100000003
mtime = Sat May 23 15:43:41 CST 2020
pZxid = 0x100000004
cversion = 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 11
numChildren = 1

创建 子节点 /test/a,我们查看 /test 节点属性,发现 pZxidcversion, numChildren 都发生了变化。

[zk: 127.0.0.1:2281(CONNECTED) 8] get /test/a

cZxid = 0x100000004
ctime = Sat May 23 15:44:12 CST 2020
mZxid = 0x100000004
mtime = Sat May 23 15:44:12 CST 2020
pZxid = 0x100000004
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 0

查看 /test/a 节点属性,发现 cZxid 与 父节点的 pZxid 是一致的,证实了 pZxid是直接子节点最后更新的事务标识。

Znode的监视(Watch)

ZooKeeper支持 Watch。客户端可以在znode上设置 Watch。

znode更改时,将触发并删除监视。触发监视后,客户端会收到一个数据包,说明znode已更改。

如果客户端与其中一个ZooKeeper服务器之间的连接断开,则客户端将收到本地通知。

3.6.0中的新增功能:

客户端还可以在znode上设置永久性的递归监视,这些监视在触发时不会删除,并且会以递归方式触发注册znode以及所有子znode的更改。

支持 Watch的 客户端命令:

  • stat path [watch]

  • ls path [watch]

  • ls2 path [watch]

  • get path [watch]

[zk: 127.0.0.1:2281(CONNECTED) 3] get /test/d watch

cZxid = 0x100000013
ctime = Sat May 23 16:47:41 CST 2020
mZxid = 0x100000013
mtime = Sat May 23 16:47:41 CST 2020
pZxid = 0x100000013
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 0

此时使用另外一个客户端去更改 /test/d 节点的数据,我们就可以看到原来的客户端自动收到了一个WATCHER 通知。

[zk: 127.0.0.1:2281(CONNECTED) 4] 
WATCHER::

WatchedEvent state:SyncConnected type:NodeDataChanged path:/test/d

@SvenAugustus(Https://www.flysium.xyz/)
更多请关注微信公众号【编程不离宗】,专注于分享服务器开发与编程相关的技术干货:

您可能感兴趣的文档:

--结束END--

本文标题: Zookeeper 数据结构详解

本文链接: https://www.lsjlt.com/news/6269.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JS数据结构之队列结构详解
    目录一.认识队列二.队列的应用三.队列类的创建四.队列的常见操作五.击鼓传花六.优先级队列七.优先级队列的实现一.认识队列 受限的线性结构: 我们已经学习了一种受限的线性结构:栈结构...
    99+
    2022-11-13
    JS队列结构 JS队列 JS 数据结构
  • java数据结构ArrayList详解
    目录简介成员变量构造函数无参构造函数构造一个初始容量大小为initialCapacity的ArrayList使用指定Collection来构造ArrayList的构造函数主要操作方法...
    99+
    2024-04-02
  • 数据结构-----串(String)详解
    目录 前言 1.串的定义 相关类型 2.串的储存结构 顺序储存表示 堆分配储存表示 块链储存表示 3.串的操作方式 4.串的匹配算法 (1)BF算法 过程原理  代码实现(C/C++)  算法分析 (2)KMP算法 过程原理 匹配过程:  ...
    99+
    2023-10-12
    数据结构 算法 c语言 c++ 字符串
  • JavaScript队列数据结构详解
    目录什么是队列?JavaScript中的队列JavaScript中的应用场景最近的请求次数补充总结写在前面: 在上一篇文章中介绍了栈这个数据结构,这篇文章介绍一下队列。 什么是队列?...
    99+
    2024-04-02
  • JavaScript的Set数据结构详解
    目录1. 什么是 Set2. Set 构造函数2.1) 数组2.2) 字符串2.3) arguments2.4) Node...
    99+
    2024-04-02
  • Python数据结构之栈详解
    目录0. 学习目标1. 栈的基本概念1.1 栈的基本概念1.2 栈抽象数据类型1.3 栈的应用场景2. 栈的实现2.1 顺序栈的实现2.1.1 栈的初始化2.2 链栈的实现2.3 栈...
    99+
    2024-04-02
  • C++数据结构之list详解
    目录前言一、list的节点二、list的迭代器2.1 const 迭代器2.2 修改方法二、美中不足三、迭代器的分类3.x std::find的一个报错总结前言 list相较于vec...
    99+
    2024-04-02
  • 【数据结构】 Map和Set详解
    文章目录 🍀Map与Set的概念及场景🌳Map与Set模型介绍🎨Map 的使用📌Map说明📌Map.Entry ...
    99+
    2023-10-11
    数据结构 set Map 哈希 java
  • Redis底层数据结构详解
    Redis作为Key-Value存储系统,数据结构如下: Redis没有表的概念,Redis实例所对应的db以编号区分,db本身就是key的命名空间。 比如:user:1000作为...
    99+
    2024-04-02
  • C++数据结构之堆详解
    目录堆的概念提示:完全二叉树堆的性质最大堆最小堆代码定义有限数组形式动态数组形式操作向下调整结点建立堆初始化打印堆测试main函数结果完整代码堆的概念 堆(heap)是计算机科学中一...
    99+
    2024-04-02
  • Java数据结构之栈的线性结构详解
    目录一:栈二:栈的实现三:栈的测试四:栈的应用(回文序列的判断)总结一:栈 栈是限制插入和删除只能在一个位置上进行的表,此位置就是表的末端,叫作栈顶。 栈的基本操作分为push(入...
    99+
    2024-04-02
  • Python数据结构之图的存储结构详解
    一、图的定义 图是一种比树更复杂的一种数据结构,在图结构中,结点之间的关系是任意的,任意两个元素之间都可能相关,因此,它的应用极广。图中的数据元素通常被称为顶点 ( V e r t ...
    99+
    2024-04-02
  • zookeeper数据结构及基本命令是什么
    Zookeeper是一个开源的分布式协调服务,它可以用于构建和管理分布式应用程序的配置信息,命名服务、分布式锁、分布式队列等。Zoo...
    99+
    2023-10-22
    zookeeper
  • 详解Pytorch中的tensor数据结构
    目录torch.TensorTensor 数据类型view 和 reshape 的区别Tensor 与 ndarray创建 Tensor传入维度的方法torch.Tensor tor...
    99+
    2024-04-02
  • C++数据结构哈希表详解
    目录实现散列函数开散列方法闭散列方法(开地址方法)删除*实现 哈希表,即散列表,可以快速地存储和查询记录。理想哈希表的存储和查询时间都是 O(1)。 本《资料》中哈希表分以下几部分:...
    99+
    2024-04-02
  • C++数据结构的队列详解
    目录前言1.队列的概念及结构2.队列的实现2.1queue.h2.2queue.c2.3test.c总结前言 hello,大家好,这期文章我们来分享数据结构关于队列的知识。希望对大家...
    99+
    2024-04-02
  • Python基础之数据结构详解
    目录一、列表1.1 列表更新元素1.2 列表增加元素1.3 列表删除元素1.4 列表的其他操作二、元组2.1 删除元组2.2 元组的其他操作三、字典3.1 字典删除元素3.2 字典的...
    99+
    2024-04-02
  • Python数据结构之链表详解
    目录0.学习目标1.线性表的链式存储结构1.1指针相关概念1.2指针结构1.3结点1.4结点类2.单链表的实现2.1单链表的初始化2.2获取单链表长度2.3读取指定位置元素2.4查找...
    99+
    2024-04-02
  • JavaScript中的Map数据结构详解
    目录1. 什么是 Map2. Map 构造函数2.1) 数组2.2) Set2.3) Map3. Map 的实例属性和方法...
    99+
    2024-04-02
  • Redis数据结构之链表详解
    目录1 链表和链表节点的结构2 链表相关的API1 链表和链表节点的结构 1.1 节点结构 节点的结构大概长下边这个样子: 那么,把这些节点就连起来就成了这个样子: 1.2 链表...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作