11.1.5 会话与心跳机制

会话与心跳机制#

ZooKeeper 的会话(Session)是客户端与服务端之间的逻辑连接,用于维持临时节点、Watcher 注册与权限校验等状态。客户端创建会话并获得全局唯一 sessionId,服务端在会话存活期间维护其状态;会话过期会触发临时节点清理与事件通知。

原理草图:会话与心跳关系#

文章图片

会话生命周期与状态#

  • 建立:连接服务端并认证成功后分配 sessionId。
  • 存活:心跳或任何请求都会刷新超时计时器。
  • 失效:超过 sessionTimeout 未更新即过期,临时节点删除,Watcher 触发。
  • 重连:超时前重连可复用会话;超时后重连将创建新会话。

关键参数与配置示例#

tickTime 影响会话超时的允许范围(2*tickTime ~ 20*tickTime)。

# /opt/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
# 最大会话超时=20*tickTime=40s
# 最小会话超时=2*tickTime=4s

解释:
- tickTime:心跳与超时基础单位,过小易误判过期,过大降低故障感知。

会话与心跳示例(使用 zkCli)#

1)连接并创建临时节点:

/opt/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181
create -e /sess/ephemeral "alive"

预期效果:创建一个临时节点。

2)查看会话信息(stat 输出包含 sessionId):

stat /sess/ephemeral

3)模拟断连并验证临时节点删除
另开一个终端,观察节点:

/opt/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181
get /sess/ephemeral

关闭第一个终端或断开网络,等待超过 sessionTimeout。

get /sess/ephemeral

预期效果:节点不存在(Node does not exist)。

心跳维持策略#

  • 定期心跳:客户端库自动发送 ping。
  • 请求复用:读写请求也刷新会话时间。
  • 自动重连:网络抖动时尽量在超时前恢复。

运维排错与验证#

1)会话频繁过期
- 检查心跳与超时参数:

grep -E "tickTime|initLimit|syncLimit" /opt/zookeeper/conf/zoo.cfg
  • 调整 tickTime 或客户端 sessionTimeout。

2)临时节点丢失
- 确认客户端是否在超时前重连。
- 观察服务端会话过期日志:

grep -i "expiring session" /opt/zookeeper/logs/zookeeper.out

3)会话数量异常
- 通过 mntr 获取连接数(4lw 命令需启用):

echo mntr | nc 127.0.0.1 2181 | grep -E "zk_num_alive_connections|zk_open_file_descriptor_count"

练习题#

1)将 tickTime 从 2000 调为 1000,观察会话过期速度变化。
2)创建临时节点后强制 kill 客户端进程,验证节点是否在超时后删除。
3)模拟网络抖动(断开 3 秒再恢复),判断会话是否保持。
4)用 mntr 统计当前活跃连接数,并解释其与会话数的关系。