【zookeeper】Zookeeper 开发者手册

Zookeeper 数据模型

Zookeeper 有一个分层的名称空间(name space),很像一个标准的分布式文件系统,不同点在于,每个节点都可以有关联的数据 和子节点。节点的路径是规范的,绝对的,斜杠分隔的路径;像下面这样:

Znodes

在 Zookeeper 树中的每个节点被称为 一个znode;Znodes 维持着如下的统计结构

  ★ 数据变化的版本号 :和时间戳一起用于验证 缓存 以及 协调更新。每次 节点中的数据变化时,版本号也会增加。例如,一旦客户端接收到数据,也会接收到数据的版本。当客户端执行更新操作 或者 删除操作时,必须要提供他要改变的节点的 数据的版本号。如果提供的版本号不能够与当前数据的实际版本号匹配上,更新操作就会失败(该行为可以被重写)

  ★ acl (Access Control List)变化的版本号

  ★ 时间戳

Znodes 相关的几个特性

  ★  监听(watches):客户端可以在 znode 上 设置监听。znode 的改变 会触发 监听,然后清除 监听。一旦 监听触发,Zookeeper 会 向客户端发送通知。

  ★  数据访问(data access):znode 中数据的读和写都是原子级的;read 会 读取znode相关的所有数据,write 会 替换znode 中所有的数据。每个节点都有一个访问控制列表(Access Control List ACL)限制 谁可以做什么。 zookeeper 并不是设计成一个常规的数据库 或者 大对象的存储,如果有需求可以 存储在大容量的存储系统(例如 NFS 或者 HDFS );

  ★ 临时节点:临时节点 随着 创建 节点的 session 的存在而存在,消亡 而 消亡,临时节点不允许 有子节点;

  ★ 序列节点—唯一命名 :当创建一个节点后,也可以请求 zookeeper 在路径 结尾 追加一个 单调递增的计数器。这个计数器相对于父节点是唯一的;

  ★ 容器节点(3.6.0版本增加):容器节点是一种特殊的节点,用于 诸如 leader , 锁 等情景。

Zookeeper 中的 时间

Zookeeper 跟踪时间的多种方式:

  ★ zxid :Zookeeper 状态的每次改变会 接收到一个 zxid 形式的标记(Zookeeper 事务 id)。这个标记显示了 Zookeeper 所有的变化顺序。每次变化都有一个 唯一的 zxid,如果 zxid1 小于 zxid2,就表示 zxid1 发生在 zxid2 之前。

  ★ 版本号(version numbers):节点的每次变化都会导致 节点的其中一个版本号增加。三个版本号:

           version:znode 数据变化的版本号;

           cversion:znode 子节点变化的版本号;

           aversion:znode  acl 变化的版本号;

  ★ 票据(ticks):当使用多服务的 Zookeeper 时,服务器使用 票据定义 事件的时间,例如状态上传,会话超时,节点之间的连接超时。

  ★ real time:Zookeeper 不会使用 real time 或者 clock time,除了 在 znode 创建 和 znode 修改时 把 时间戳放到 stat structure 。

Zookeeper Stat Structure (数据结构)

每个 znode 由如下几个 字段组成:

  • czxid

    The zxid of the change that caused this znode to be created.

  • mzxid

    The zxid of the change that last modified this znode.

  • pzxid

    The zxid of the change that last modified children of this znode.

  • ctime

    The time in milliseconds from epoch when this znode was created.

  • mtime

    The time in milliseconds from epoch when this znode was last modified.

  • version

    The number of changes to the data of this znode.

  • cversion

    The number of changes to the children of this znode.

  • aversion

    The number of changes to the ACL of this znode.

  • ephemeralOwner

    The session id of the owner of this znode if the znode is an ephemeral node. If it is not an ephemeral node, it will be zero.

  • dataLength

    The length of the data field of this znode.

  • numChildren

    The number of children of this znode.

Zookeeper 会话

Zookeeper 客户端  使用语言绑定 创建 通向 服务的 句柄(handle) 来 和 Zookeeper 服务 建立 会话。一旦会话创建,句柄 处于 CONNECTING 状态,并且客户端客户端类库连接到 Zookeeper 服务中的其中一个服务器,这个时候处于 CONNECTED 状态。正常情况下将会处于这两个状态中的任一个状态。如果发生了不可恢复的错误,例如会话超时 或者 认证失败,再或者 应用程序显示地关闭了句柄,该 句柄将处于 CLOSED 状态。下面的流程图展示了可能状态:


为了创建客户端会话,应用代码必须提供包含以逗号分隔的 主机 :端口号 成对出现的连接字符串,每个主机:端口号对应一个Zookeeper服务器,例如 127.0.0.1:4545 或者 127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002。Zookeeper 客户端会选择任意一个 服务器连接,如果连接失败,或者其他原因与服务器断开连接,这个客户端会自动尝试和列表中的下一个服务器连接,直到重新建立连接。

当客户端得到了连接 Zookeeper 服务的 句柄,Zookeeper 创建一个 Zookeeper 会话,用 64位数字表示,指向 客户端。如果客户端连接到其他的 Zookeeper 服务器,将会把该session id 作为 连接前 握手 的 一部分发送过去。作为一种安全措施,服务器 为 会话 id 创建 一个 所有的 服务器 都可以验证的 密码。这个密码 会在 客户端建立会话时 和 session id 一起发送到客户端。 每当 客户端 和 新的服务器重新建立连接,客户端会 发送 密码 和 session id。

会话过期 是由 Zookeeper 集群自身管理,而不是 客户端。当 ZK 客户端 和 集群建立连接时,提供了一个 超时时间。这个超时时间被集群用来决定 什么时候 客户端的会话过期。当集群在指定的会话超时期间内 不能监听到 客户端,就代表超时。当会话超时,集群会删除所有属于会话的 节点,并且通知 已经连接的客户端。。此时,过期会话的客户端与集群仍然保持断开连接,除非和 集群建立了新的连接,否则不会通知会话已过期。

ZK 会话建立 调用的另一个参数是 默认的 watcher。当客户端发生任何的状态改变都会 通知 watcher 。例如如果客户端 和 服务器 失去连接,watcher 将会被通知,或者客户端的会话过期,等等。

< 未完 >

原文参看官方文档


搭建可参看: ZK 集群安装配置



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值