ZooKeeper开发手册中文翻译(2)

序列节点——命名不唯一 当你创建节点的时候,你会需要zookeeper提供一组单调递增的计数来作为路径结尾。这个计数对父znode是唯一的。用%010d的格式——用0来填充的10位数(计数如此命名是为了简单排序)。例如"0000000001",注意计数器是有符号整型,超过表示范围会溢出。

ZooKeeper中的时间

zookeeper有很多记录时间的方式:

Zxid(ZooKeeper Transaction Id): zookeeper每次发生改动都会增加zxid,zxid越大,发生的时间越靠后。

Version numbers: 对znode的改动会增加版本号。版本号包括version (znode上数据的修改数), cversion (znode的子节点的修改数), aversion (znode上ACL(权限)的修改数)。

Ticks : 多个server构成zookeeper服务时,各个server用ticks来标记如状态上报、连接超时等事件。ticks  time还间接反映了session超时的最小值(两次tick time);如果客户端请求的最小session  timeout低于这个最小值,服务端会通知客户端最小超时置为这个最小值。

Real time : 除了每次znode创建或改动时候将时间戳记录到状态结构中外,zookeeper不使用时钟时间。

ZooKeeper状态结构(Stat Structure)

存在于znode中的状态结构,由以下各个部分组成:

czxid - znode创建产生的zxid

mzxid - znode最后一次修改的zxid

ctime - znode创建的时间的绝对毫秒数

mtime - znode最后一次修改的绝对毫秒数

version - znode上数据的修改数

cversion - 子节点修改数

aversion - znode的ACL修改数

ephemeralOwner - 临时节点的所有者的session id。如果此节点非临时节点,该值为0

dataLength - znode的数据长度

numChildren - znode子节点数

ZooKeeper Sessions

客户端通过创建一个handle和服务端建立session连接。一旦创建完成,handle就进入了CONNECTING状态,客户端库尝试连接一台构成zookeeper的server,届时进入CONNECTED状态。通常情况下操作会介于这两种状态之间。 一旦出现了不可恢复的错误:如session中止,鉴权失败或者应用直接结束handle,则handle会进入到CLOSED状态。下图是客户端的状态转换图:

状态转换图

应用在创建客户端session时必须提供一串逗号分隔的主机号:端口号,每对主机端口号对应一个ZooKeeper的 server(如:"127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002"),客户端库会尝试连接任意一台服务 器,如果连接失败或是客户端主动断开连接,客户端会自动继续与下一台服务器连接,直到连接成功。

3.2.0版本新增内容:  一个新的操作“chroot”可以添加在连接字符串的尾部,用来指明客户端命令运行的根目录地址。类似unix的chroot命令,例如: "127.0.0.1:4545/app/a" or  "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/app/a",说明客户端会以"/app/a"为根目 录,所有路径都相对于根目录来设置,如"/foo/bar"的操作会运行在"/app/a/foo/bar"。 这一特性在多用户环境下非常好用,每个使用zookeeper服务的用户可以设置不同的根目录。

当客户端获得和zookeeper服务连接的handle时,zookeeper会创建一个Zookeeper  session分配给客户端,用一个64-bit数字表示。一旦客户端连接了其他服务器,客户端必须把这个session  id也作为连接握手的一部分发送。出于安全目的,zookeeper给session id创建一个密码,任何zookeeper服务器都可以验证密码。 当客户端创建session时密码和session id一起发送到客户端来,当客户端重新连接其他服务器时,同时要发送密码和session id。

zookeeper客户端库里有一个创建zookeeper session的参数,叫做session  timeout(超时),用毫秒表示。客户端发送请求超时,服务端在超时范围内响应客户端。session超时最小为2个ticktime,最大为20个 ticktime。zookeeper客户端API可以协调超时时间。 当客户端和zookeeper服务器集群断开时,它会搜索session创建时的服务器列表。最后,当至少一个服务器和客户端重新建立连 接,session或被重新置为"connected"状态(超时时间内重新连接),或被置为"expired(过期)"状态(超出超时时间)。不建议在 断开连接后重新创建session。ZK客户端库会帮你重新连接。特别地,我们将启发式学习模式植入客户的库中来处理类似“羊群效应”等问题。只有当你的 session过期时才重新创建(托管的)。 session过期的状态转换图示例同过期session的watcher:

'connected' : session正确创建,客户端和服务集群正常连接

.... 客户端从服务器集群断开

'disconnected' : 客户端失去和服务器集群的连接

.... 过了一段时间, 超过了集群判定session过期的超时时间, 客户端并没有发觉自己和服务集群断开了连接

.... 又过一段时间, 客户端恢复了同集群的网络连接

'expired' : 最终客户端重新连上集群,然后被通知已经到期

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/b940566122bcd3c2fd4771eb65cec93e.html