IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    zookeeper client使用笔记

    zhpengg发表于 2012-08-29 04:00:00
    love 0

    本文是最近使用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. ”


沪ICP备19023445号-2号
友情链接