ZooKeeper系列:session会话

session会话

客户端在对Zookeeper集群执行任何请求前,都需要先与集群中的服务间里连接,这个连接就是session会话。客户端通过某一个特定的语言套件来创建一个ZooKeeper句柄时,它就会通过服务建立一个会话。客户端初始连接到集群中的某一个服务器或者一个独立的服务器。客户端通过TCP协议与服务器进行连接通信,使用的端口默认是2181,当然这个端口可以在zoo.cfg中修改的,配置如下图

zk-session-port

而且会话提供了顺序保障,也就是同一个会话的请求会以FIFO(先进先出)的顺序执行,前提是要保证一个客户端只打开一个会话。如果客户端有多个并发会话,不一定能够保持顺序了。

会话的创建

sessionID: 会话ID,用来唯一标识一个会话,每次客户端创建的时候,ZooKeeper都会为其分配一个全局唯一的sessionID。

Timeout: 会话超时时间,客户端在构造ZooKeeper实例时候,向服务端发送配置的超时时间,server端会根据自己的超时时间限制最终确认会话的超时时间。

TickTime: 下次会话超时时间点,默认2000毫秒,可以在配置文件zoo.cfg中修改,

isClosing: 标记一个会话是否已经关闭,当sever端检测到会话已经超时失效,改会话标记为已关闭,不再处理新的请求。

创建过程如下
  1. 客户端启动程序建立一个会话。
  2. 客户端尝试连接到localhost/127.0.0.1:2181.
  3. 客户端连接成功,服务器开始初始化这个新的会话。
  4. 会话初始化成功。
  5. 服务端向客户端发送一个SyncConnected事件

zk-session-create

如上客户端连接的日志,可以看到这个客户端当前的session id以及客户端使用SyncConnected事件通知应用的相关操作。

会话的状态与生命周期

会话的生命周期是指会话从创建到结束的时期(正常关闭或者超时导致过期),

会话的主要状态是:

  • CONNECTING:连接中,此状态的时间很短。
  • CONNECTED:已连接。连接成功之后的状态。
  • CLOSED:已关闭,session过期或者服务端宕机或者客户端主动断开的状态。
  • NOT_CONNECTED:未连接,客户端还没有连接之前的状态。

zk-session-status

一个会话从NOT_CONNECTED状态开始,当客户端初始化后转换到CONNECTING状态(1)。正常情况下,成功和zk服务器建立连接后,会话会转换到CONNECTED状态(2)。当客户端与zk服务器断开连接或者无法收到服务器的响应时,就会转换回CONNECTING(3)并尝试发现其他zk服务器,如果发现可用服务器而且确认会话有效后,状态又会转换成CONNECTED。否则会声明会话过期,状态变成CLOSED(4)。

会话超时

在创建会话的时候有个超时检测参数tickTime。如果经过时间t之后服务接收不到这个会话的任何消息,服务就会声明此会话过期。而在客户端,如果经过t/3的时间未收到任何消息,客户端将向服务器发送心跳消息(心跳检测)。在经过2t/3的时间后,ZooKeeper客户端开始寻找其他服务器,也就是说还有t/3的时间找到连接会话。

在集群模式下,会话超时就会触发客户端重连,在重新连到新的服务器节点时,有个要求就是这个节点的ZooKeeper状态要和最后连接的服务器的ZooKeeper状态保持最新。ZooKeeper是通过服务中排序更新来决定状态是否最新。集群根据每一个更新建立的顺序来分配给事务标识符。

我是纪先生,用输出倒逼输入而持续学习,持续分享技术系列文章,以及全网值得收藏好文,欢迎关注公众号,做一个持续成长的技术人。

猜你喜欢

转载自juejin.im/post/7126712589211402247
今日推荐