ZooKeeper-3.8.3-会话

ZooKeeper 会话

1. 会话创建与状态转换

ZooKeeper 客户端通过语言绑定创建服务句柄来建立会话。句柄初始为"连接中"(CONNECTING)状态,成功连接到 ZooKeeper 服务的某台服务器后转为"已连接"(CONNECTED)状态。若遇不可恢复错误(如会话过期、认证失败)或应用程序显式关闭句柄,句柄进入"已关闭"(CLOSED)状态。

创建会话需提供包含逗号分隔的主机:端口对的连接字符串。从 3.2.0 版本起,连接字符串可加"chroot"后缀,使客户端操作路径相对该根路径。

2. 会话参数
  • 会话 ID 和密码:ZooKeeper 为会话分配 64 位 ID 并创建密码用于安全验证,客户端重连时需发送 ID 和密码。
  • 会话超时 :创建会话要指定超时时间(毫秒),服务器会将其调整到 2 * tickTime20 * tickTime 范围,客户端可通过 API 获取协商后的超时时间。
3. 会话超时处理

会话超时由集群管理。若集群在指定超时时间内未收到客户端心跳,判定会话过期,删除该会话的临时节点并通知相关客户端。客户端重连后,监听器收到"会话已过期"通知。不建议断开连接时创建新会话,客户端库会自动处理重连。

4. 监听器(Watcher)

创建会话可指定默认监听器,客户端状态变化(如断连、会话过期)时,监听器会收到通知。初始状态视为断开连接,新连接建立时,监听器首个收到的通常是会话连接事件。

5. 保持会话活跃

客户端通过发送请求保持会话活跃,空闲接近超时时会发 PING 请求,既能让服务器知道客户端活跃,也能让客户端验证连接正常。

6. 连接丢失与异常
  • 连接丢失:同步或异步操作中,会话无效或有未完成异步调用时客户端断连,客户端库会生成连接丢失错误。
  • SessionMovedException(3.2.0 引入):会话在不同服务器重新建立连接后,旧连接收到该会话请求会触发此异常。通常客户端看不到,两个客户端用相同 ID 和密码重连时可能出现。
7. 更新服务器列表

客户端可提供新连接字符串更新服务器列表,使用概率负载均衡算法。若当前连接主机不在新列表,连接会断开;否则根据服务器数量变化决定是否断连并连到新服务器。

8. 本地会话(3.5.0 引入)
  • 背景:ZooKeeper 会话创建和关闭成本高,引入本地会话以缓解处理大量客户端连接时的瓶颈。
  • 功能限制(localSessionsUpgradingEnabled 禁用):不能创建临时节点;会话丢失后无法用 ID 和密码重连;会话信息仅在连接服务器维护,领导者不知情且状态不写磁盘;会话心跳、过期和状态维护由连接服务器处理。
  • 升级功能(localSessionsUpgradingEnabled 启用):本地会话可自动升级为全局会话,仅创建临时节点操作需升级。升级时会话兼具本地和全局属性,但升级操作不能由两线程并发调用。
9. 会话的类的 UML 图
plaintext 复制代码
+----------------+     +--------------------+       +---------------------+
|                | --> |                    | ----> | LocalSessionTracker |
| SessionTracker |     | SessionTrackerImpl |       +---------------------+
|                |     |                    |                              +-----------------------+
|                |     |                    |  +-------------------------> | LeaderSessionTracker  |
+----------------+     +--------------------+  |                           +-----------------------+
           |                                   |
           |                                   |
           |                                   |
           |           +---------------------------+
           +---------> |                           |
                       | UpgradeableSessionTracker |
                       |                           |
                       |                           | ------------------------+
                       +---------------------------+                         |
                                                                             |
                                                                             |
                                                                             v
                                                                           +-----------------------+
                                                                           | LearnerSessionTracker |
                                                                           +-----------------------+
10. 问答
  • 禁用本地会话升级原因:大型部署中防止意外创建大量临时节点和全局会话。
  • 会话创建时间 :处理 ConnectRequestcreateSession 请求到达 FinalRequestProcessor 时尝试创建本地会话。
  • 客户端多服务器切换情况:客户端重连到新服务器,若会话 ID 不在其本地会话跟踪器,服务器发验证包。会话连接结果取决于请求时间和集群对会话的确认情况。
相关推荐
東雪蓮☆2 分钟前
Docker 资源限制与性能优化(CPU / 内存 / IO 管控实战)
linux·运维·docker
阑梦清川38 分钟前
深入理解动态链接和静态链接
linux
孞㐑¥44 分钟前
Linux网络部分—网络层
linux·c++·经验分享·笔记
ms72wx1 小时前
拥抱终端:Linux 新手命令行入门指南
linux·运维·服务器
東雪蓮☆1 小时前
容器生命周期与管理策略
linux·运维·docker
---学无止境---2 小时前
Linux 内核等待队列(Wait Queue)机制深度分析
linux
wheeldown2 小时前
【Linux】Linux管道与进程池深度解析:从原理到实战
linux·运维·服务器
_extraordinary_3 小时前
Java Linux --- 基本命令,部署Java web程序到线上访问
java·linux·前端
Ronin3053 小时前
【Linux网络】网络命令
linux·网络·网络命令
XUE-52113144 小时前
BGP实验-路由反射器
linux·运维·网络