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 不在其本地会话跟踪器,服务器发验证包。会话连接结果取决于请求时间和集群对会话的确认情况。
相关推荐
WKJay_11 分钟前
Linux 常用命令 - sort 【对文件内容进行排序】
linux·运维·服务器
言之。30 分钟前
Kafka 如何实现高性能
分布式·kafka
向上的车轮1 小时前
OpenEuler学习笔记(十五):在OpenEuler上搭建Java运行环境
java·linux·笔记·学习
skywalk81633 小时前
使用Ollama 在Ubuntu运行deepseek大模型:以DeepSeek-coder为例
linux·人工智能·ubuntu·deepseek
大秦王多鱼3 小时前
Kafka 消费端反复 Rebalance: `Attempt to heartbeat failed since group is rebalancing`
运维·分布式·kafka·apache
千航@abc4 小时前
vim的特殊模式-可视化模式
linux·编辑器·vim
mljy.4 小时前
Linux《基础指令》
linux
涛ing4 小时前
31. C语言 命令行参数
linux·c语言·开发语言·c++·vscode·vim·visual studio
就很对6 小时前
6.进程的使用方式
java·linux·jvm