Session 指的是 ZooKeeper 服务器与客户端会话。在 ZooKeeper 中,一个客户端连接是指客户端和服务器之间的一个 TCP 长连接。客户端启动的时候,首先会与服务器建立一个 TCP 连接,从第一次连接建立开始,客户端会话的生命周期也开始了。通过这个连接,客户端能够通过心跳检测与服务器保持有效的会话,也能够向Zookeeper服务器发送请求并接受响应,同时还能够通过该连接接收来自服务器的Watch事件通知。 Session的sessionTimeout值用来设置一个客户端会话的超时时间。当由于服务器压力太大、网络故障或是客户端主动断开连接等各种原因导致客户端连接断开时,只要在sessionTimeout规定的时间内能够重新连接上集群中任意一台服务器,那么之前创建的会话仍然有效。

在为客户端创建会话之前,服务端首先会为每个客户端都分配一个sessionID。由于 sessionID 是 Zookeeper 会话的一个重要标识,许多与会话相关的运行机制都是基于这个 sessionID 的,因此,无论是哪台服务器为客户端分配的 sessionID,都务必保证全局唯一。

为什么需要会话

客户端与服务端之间任何交互操作都与会话息息相关,如临时节点的生命周期、客户端请求的顺序执行、Watcher通知机制等。Zookeeper的连接与会话就是客户端通过实例化Zookeeper对象来实现客户端与服务端创建并保持TCP连接的过程.

心跳机制
客户端向服务端ping包请求

会话状态

Zk客户端和服务端成功连接后,就创建了一次会话,ZK会话在整个运行期间的生命周期中,会在不同的会话状态之间切换,这些状态包括:

Zookeeper的Session会话 - 图1

CONNECTING(正在连接中)
CONNECTED(已经连接上了)
RECONNECTING(重新连接中)
RECONNECTED(重新连接)
CLOSE(关闭)

1.客户端开始创建Zookeeper对象,客户端状态就会变成CONNECTING(正在连接中)状态,底层是使用NIO进行连接的,同时客户端开始尝试连接服务端,
2.连接成功后,客户端状态变为CONNECTED(已经连接上了),
3.由于断网或其他原因,客户端与服务端之间会出现断开情况,Zookeeper客户端会自动进行重连服务,同时客户端状态再次变成CONNCTING(重新连接中),直到重新连上服务端后,状态又变为CONNECTED(已经连接上了),在通常情况下,客户端的状态总是介于CONNECTING和CONNECTED之间。
4.如果出现会话超时、权限检查或是客户端主动退出程序等情况,客户端的状态就会直接变更为CLOSE状态

详细介绍

https://www.cnblogs.com/leesf456/p/6103870.html