Zookeeper会话

来源:互联网 发布:淘宝静物拍摄相机 编辑:程序博客网 时间:2024/05/16 01:05

会话状态

在Zookeeper客户端与服务端与功完成连接创建后,就创建一个会话,Zookeeper会话在整个运行期间的生命周期中,会在不同的会话状态之间切换,这些状态可以分为Connecting connected reconnecting reconnected close等。

会话创建

1.sessionID,会话ID
2. TimeOut,会话超时时间。Zookeeper客户端向服务端发送这个超时时间后,服务端会根据自己的超时时间限制最终确定会话的超时时间。
3. TickTime,下次会话超时时间,其值大致等于当前时间加上TimeOut。
4. isClosing,标记一个会话是否已经被关闭。
public static long initializeNextSession(long id) {      long nextSid = 0;      // 无符号右移8位使为了避免左移24后,再右移8位出现负数而无法通过高8位确定sid值      nextSid = (System.currentTimeMillis() << 24) >>> 8;      nextSid = nextSid | (id << 56);      return nextSid;  }

其中的id表示配置在myid文件中的值,通常是一个整数,该算法的高8位确定了所在机器,后56位使用当前时间的毫秒表示进行随机。SessionTracker是Zookeeper服务端的会话管理器。

会话管理 

采用了分桶策略,将类似的会话放在同一区块中进行管理,分配的原则是每个会话的下次超时时间点。为了保持客户端会话的有效性,客户端会在会话超时时间过期t范围内向服务端发送PING请求来保持会话的有效性。同时,服务端需要不断地接收来自客户端的心跳检测,并且需要重新激活对应的客户端会话,这个重新激活过程称为TouchSession。
 
对于会话的超时检查而言,Zookeeper使用SessionTracker来负责,SessionTracker使用单独的线程专门进行会话超时检查,即逐个一次地对会话桶中剩下的会话进行清理。

会话清理

1.标记会话状态为已关闭。由于会话清理过程需要一段时间,为了保证在此期间不再处理来自该客户端的请求,SessionTracker会首先将该会话的isClosing标记为true,这亲在会话清理期间接收到该客户端的新请求也无法继续处理了。
2.发起会话关闭请求。为了使对该会话的关闭操作在整个服务端集群都生效,Zookeeper使用了提交会话关闭请求的方式,并立即交付给PreRequestProcessor进行处理。
3.收集需要清理的临时节点。一旦某个会话失效后,那么和该会话相关的临时节点都需要被清理,因此,在清理之前,首先需要将服务器上所有和该会话相关的临时节点都整理出来。Zookeeper在内存数据库中会为每个会话单独保存一份由该会话维护的所有临时节点集合,在Zookeeper处理会话关闭请求之前,若正好有以下两类请求到达服务端并正在处理中。
  • 节点删除请求,删除的目标节点正好是上述节点中的一个。
  • 临时节点创建请求,创建的目标节点正好是上述节点中的一个。
对于第一类请求,需要将所有请求对应的数据节点路径从当前临时节点列表中移出,以避免重复删除,对于第二类请求,需要将所有这些请求对应的数据路径添加到当前临时节点列表中,以删除这些即将被创建但是尚未保存到内存数据库的临时节点。

4.添加节点删除事务变更。完成该会话相关的临时节点收集后,Zookeeper会逐个将这些临时节点转换成“节点删除”请求,并放入事务变更队列outstandingChanges中。
5.移除会话。完成节点删除后,需要将会话从SessionTracker中删除。
6.关闭NIOServerCnxn。最后,从NIOServerCnxnFactory找到该会话对应的NIOServerCnxn,将其关闭。

重连

当客户端与服务端之间的网络连接断开时,Zookeeper客户端会自动进行反复的重连,直到最终成连接上Zookeeper集群中的一台机器。此时连接上服务端的客户端可能处于以下两种状态之一:
1.connected,如果在会话超时暗内重新连接上集群中一台服务器。
2. expired,如果在会话超时时间以外重新连接上,那么服务端其实已经对该会话进行了会话清理操作。
当客户端与服务端之间的连接断开后,用户在客户端可能主要看到两类异常:
1.connection_loss,此时,客户会自动从地址列表中重新逐个选取新的地址并尝试进行重新连接,直到最终成功连接上服务器。若客户端在setData时出现Connection_loss现象,此时客户端会收到none-disconnected通知,同时会抛出异常。应用程序需要捕捉异常并且等待Zookeeper客户端的自动完成重连,一旦重连成功,那么客户端会收到None-SyncConnected通知,之后就可以重试setData操作。
2.session_expired,客户端与服务端断开连接后,重连时间耗时太长,超过会话超时时间,此时状态为session_expired,用于需要重新实例化Zookeeper对象。
3.session_moved,客户端会话从一台服务器转移到另一台服务器,即客户端与服务端S1断开连接后,重连上服务端S2,此时会话就从S1转移到S2.



原创粉丝点击