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 不在其本地会话跟踪器,服务器发验证包。会话连接结果取决于请求时间和集群对会话的确认情况。
相关推荐
wefg11 分钟前
【Linux】环境变量
linux·运维·服务器
扫地生大鹏2 分钟前
Linux登录用户名密码正确,报错Linux 登录报module is unknow
linux·运维·服务器
可爱又迷人的反派角色“yang”7 分钟前
ansible基本命令与剧本编写(二)
linux·运维·ansible
老王熬夜敲代码7 分钟前
linux系统IO
linux·笔记
小满、10 分钟前
RabbitMQ: 同步异步解析、安装与控制台实践
分布式·消息队列·rabbitmq·mq
Thexhy10 分钟前
基础篇:Redis核心命令及用法
java·linux·redis
不染尘.13 分钟前
虚拟网络环境及socket概述
linux·c语言·网络·windows·计算机网络
馨羽的玩具14 分钟前
麒麟虚拟机原盘扩容后没看到
linux·麒麟
XiaoHu020715 分钟前
Linux中的常见指令汇总以及权限认识
linux·运维·服务器
春日见21 分钟前
虚拟机上由于网络问题无法正常git clone
linux·服务器·网络·人工智能·git·ubuntu·debug