ZooKeeper编程指南(二)

ZooKeeper编程指南(二)  

会话 Sessions
    ZK客户端和ZK服务通过创建服务的句柄(handle)来建立会话。刚刚创建,句柄处于 CONNECTING状态。客户端库试图连接到其中的一台服务器,状态转变成 CONNECTED。
正常操作下,句柄处于这两个状态。如果不可恢复的错误发生,例如会话终结,认证失败,或者应用关闭句柄,句柄转变成 CLOSED状态。下面的图展示了zk客户端的状态变化。
ZooKeeper编程指南 - liuzhaomin - 机敏,Strong
为了创建客户端会话,应用代码必须提供逗号(,)分隔的host:port对(连接字符串),每一个对应一个zk服务器("127.0.0.1:4545" 或 "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002")。
客户端任意选择一个服务器,尝试连接。如果连接失败,或处于任何原因客户端和服务器断开连接,客户端会自动选择列表中的下一个服务器,直到建立连接(或重新建立连接)。

3.2.0新增 连接字符串后面可以追加“chroot”后缀。这会在运行客户端命令时,相对于这个root(和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"。这个特点在多用户环境中特别有用,zk的每一个用户根目录应该是不同的。这会让重用更加简单,每个用户写自己的应用就好像使用“/”根目录,而实际的路径可以在部署时确定。

    当客户端获得zk服务的一个句柄,zk创建一个会话,用一个64位的数字表示,分配给客户端。如果客户端连接到不同的服务器,他会发送会话id作为连接握手的一部分。处于安全的考虑,服务器为每一个会话id创建一个密码,任意的服务器都可以验证这个密码。当客户端建立会话时,密码和会话id一块被发送给客户端。无论何时,当客户端想和新的服务器建立会话时,他会发送会话id和密码。

    zk客户端创建会话时,其中的一个参数是会话超时(单位是毫秒)。客户端发送一个请求的超时值,服务器回复一个它能给定的超时值。当前的实现要求超时值最小是tickTime的2倍,最大是tickTime的20倍。客户端api允许访问协调的超时值。

    当客户端和服务器集群隔离的时候,它开始搜索会话创建时指定的服务器列表。最终,当客户端和其中的一个服务器重新建立连接时,会话要么转变成 CONNECTED状态(在超时时间以内建立连接),要么转变成EXPIRED状态(超时时间以外建立连接)。在失去连接的时候,并不推荐创建一个新的会话(a new ZooKeeper.class)。客户端库将会替你重新连接。特别的,客户端内置推演算法来处理羊群效应的这类事情。只有你被通知会话过期的时候( mandatory ),才能创建新的会话。
    会话过期被zk集群本身管理,而不是客户端。当客户端和集群建立会话的时候会提供一个超时值,集群使用这个值来确定会话超时。集群在指定的会话超时时间内不能监听到来自客户端的信息,发生过期。一旦会话过期,集群会删除所有这个会话创建的临时节点,并且立即通知监控这些节点的所有的客户端发生的改变。此时会话过期的客户端仍旧和集群失去联系,直到它重新和集群建立连接,才会被通知会话过期。
    会话过期监控所看到的过期会话的状态变化:
        1、“connected”,会话建立,客户端和集群通信(客户端和服务器通信正常)。
        2、客户端和服务器隔离。
        3、“disconnected”,客户端和服务器失去连接
        4、时间流逝。。。超时时间过后,集群使会话失效。由于客户端和集群失去连接,接收不到通知。
        5、时间流逝,客户端重新获得网络层面的联通性。
        6、“expired”,最终客户端重新连接到集群,这时会被通知会话过期。

    zk创建会话时的另一个参数是默认监控。客户端状态改变,监控会被通知。例如,客户端和服务器失去连接,客户端会话过期,此时,监控会被通知。监控应该仔细考虑初始状态为“disconnected”(状态改变前,事件被客户端库发送给监控)。如果是新建连接,发送给客户端的第一个事件是会话连接事件。
    通过客户端发送请求,会话被保持为活跃的。如果失去连接一段时间会话会超时。客户端通过发送PING请求来保持会话活跃。PING请求不仅允许服务器知道客户端仍旧活跃,同样也让客户端验证和服务器的连接是否活跃。PING的时序是保守的,只要能保证合理的时间来检测断开的连接和重新连接到一个服务器。
    当和服务器的连接建立后,有两种情况会使客户端产生失去连接的错误(connectionloss)(java中的异常,c中的返回码)。
        1、应用在失效的会话上执行操作
        2、客户端和服务器有未完成的操作(比如未完成的异步调用),此时客户端断开和服务器的连接。

3.2.0 新增 SessionMovedException  有一个内部异常(SessionMovedException),客户端通常不能看到。当请求在某个会话的连接上被接收,而这个会话被重新连接到不同的服务器,此时异常发生。这种错误的正常原因是,客户端发送请求给服务器,但是网络包被延迟,因此客户端超时,连接到新的服务器。当延迟的包到达第一个服务器,老的服务器检测到会话已经迁移,关闭客户端连接。客户端通常不能看到这个错误,因为老的连接已经关闭。能够看到的一种情况是,两个客户端使用一个保存的用户名和密码试图建立相同的连接,其中的一个客户端会重新建立连接,第二个客户端会被断开。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值