zookeeper client使用笔记

本文是最近使用zookeeper client时所看资料的一些总结,主要内容来自Zookeeper的官方手册,以及FAQ文档。

Zookeeper数据模型

  • zk具有像文件系统一样的层状的命名空间。
  • 命名空间中的每一个节点都可存储数据。
  • 只有绝对路径,名字都是unicode字符。
  • 每个节点都是ZNode类型(如同文件系统的stat)。
  • 每个ZNode上可以设置Watch,znode改变会通知设置的watch的客户端,同时清除Watch
  • 每次对znode的读写都是原子的,每次读写都是带要操作znode版本号的。
  • 尽量保证单个znode在1MB一下。通常几K。
  • 临时节点的概念:只存在于一个Session的有效期内的节点。临时节点不允许有子节点。
  • 使用zxid来标示zk中的每个事件(导致zk状态改变的事件)。全局唯一。
  • 对每个znode的改变触发当前znode versions的改变。每个znode维护三个version(version:对应每次znode data改变,cversion:对应每次子节点改变,aversion:对应每次acl改变)

Zookeeper状态转换

zookeeper state machine

  • session timeout时间至少是ticket time(默认是2000ms)的2倍,同时最大不能超过20倍ticket time
  • 一旦session 过期,不必手动重新连接。zk client会处理重连。
  • Session的过期与否是由server端决定的。在timeout时间之内,server没有收到来自
  • client的任何信息(心跳)时,则判定client session过期。同时会删掉属于这个session的临时节点(znode),同时通知watch这个节点的client。
  • 一旦session过期的client重新连接上zk cluster,将会受到“session expired”通知。
  • 在建立zk连接时,会设置一个默认的watcher,当client状态改变的时候,这个watcher会被调用。一般将这个watcher的初始状态设为disconnect。这样就可以处理后续的session 过期事件。

Zookeeper Watch

  • 每一次的读操作(getData(), getChildren(), exists())都可以对操作的节点设置watcher。
  • watch是一次性的。一旦数据改变或是删除,则触发watcher,后续的改变则不会再触发。
  • 因为watch是异步发送的,所以有可能在节点操作返回码返回之前先返回给client。zk只能保证client收到的watch事件是在他设置watch事件返回成功后收到。
  • watch的两种类型:data watch(由getData() 和 exists()设置),返回znode data 和 child watch(由getChildren()设置), 返回children list。
  • 导致watch事件丢失的一种情况:“ a watch for the existance of a znode not yet created will be missed if the znode is created and deleted while disconnected. ”
comments powered by Disqus