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 不在其本地会话跟踪器,服务器发验证包。会话连接结果取决于请求时间和集群对会话的确认情况。
相关推荐
Monly215 小时前
RabbitMQ:数据隔离
分布式·rabbitmq
wdxylb5 小时前
云原生俱乐部-shell知识点归纳(1)
linux·云原生
飞雪20076 小时前
Alibaba Cloud Linux 3 在 Apple M 芯片 Mac 的 VMware Fusion 上部署的完整密码重置教程(二)
linux·macos·阿里云·vmware·虚拟机·aliyun·alibaba cloud
路溪非溪7 小时前
关于Linux内核中头文件问题相关总结
linux
萧鼎9 小时前
Python pyzmq 库详解:从入门到高性能分布式通信
开发语言·分布式·python
Lovyk9 小时前
Linux 正则表达式
linux·运维
Fireworkitte10 小时前
Ubuntu、CentOS、AlmaLinux 9.5的 rc.local实现 开机启动
linux·ubuntu·centos
sword devil90011 小时前
ubuntu常见问题汇总
linux·ubuntu
ac.char11 小时前
在CentOS系统中查询已删除但仍占用磁盘空间的文件
linux·运维·centos
卡拉叽里呱啦12 小时前
缓存-变更事件捕捉、更新策略、本地缓存和热key问题
分布式·后端·缓存