ZooKeeper-3.8.3-会话

ZooKeeper 会话

1. 会话创建与状态转换

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

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

2. 会话参数
  • 会话 ID 和密码:ZooKeeper 为会话分配 64 位 ID 并创建密码用于安全验证,客户端重连时需发送 ID 和密码。
  • 会话超时 :创建会话要指定超时时间(毫秒),服务器会将其调整到 2 * tickTime 至 20 * 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. 问答
  • 禁用本地会话升级原因:大型部署中防止意外创建大量临时节点和全局会话。
  • 会话创建时间 :处理 ConnectRequest 和 createSession 请求到达 FinalRequestProcessor 时尝试创建本地会话。
  • 客户端多服务器切换情况:客户端重连到新服务器,若会话 ID 不在其本地会话跟踪器,服务器发验证包。会话连接结果取决于请求时间和集群对会话的确认情况。
相关推荐
sunny066013 小时前
推理 INFRA 方法论(2):分布式推理:TP、DP、EP、CP 与 PP 的取舍
人工智能·分布式
字节探索13 小时前
Redis 分布式锁:从 SETNX 误删到看门狗自动续期的原理与实践
redis·分布式
Linux界最忧郁之人14 小时前
华为云ECS&IMS&AS实战|弹性云服务器、私有镜像、弹性伸缩完整实验
linux·运维·服务器·centos·华为云·openstack
真上帝的左手14 小时前
30. 技术专题-‌应用框架组件-缓存-Redis
数据库·redis·分布式·缓存·中间件
whyutianict_vv14 小时前
零基础转 AI 运维:投入清单、技术路线与核对表
linux·运维·人工智能·ai
无言听风雨丶14 小时前
systemd 与信号 / 僵尸进程:Linux 进程管理的底层逻辑与排错
linux·服务器·网络
DevOpenClub14 小时前
高考一分一段 API:分数查位次、科类枚举与历史对照
linux·数据库·高考
小贾要学习15 小时前
【C++后端开发项目】Reactor 模型 / C++ 仿写 muduo HTTP 服务器:让底层网络库真正跑起网页
linux·服务器·c++·http·网络编程·muduo·reactor模型
斯普信专业组15 小时前
Kafka 3.9.1 三节点集群部署方案(ZooKeeper 模式)
分布式·zookeeper·kafka
Blockbuater_drug15 小时前
OpenMM分子动力学模拟02 安装:Linux:conda 一条命令装通 GPU 加速的分子模拟环境
linux·conda·cuda·gpu驱动·pythonpath·openmm安装