成百上千个客户端同时断开又同时重连,就是「会话风暴」。这篇用 300 个 kazoo 客户端,量建立会话的代价、服务端重启后全部重连的时间分布,以及会话超时较短时有多少会话被判定过期。
300 个会话建立用时 166 ms(1812 个/秒);zxid 增加了 300(= 会话数);服务端连接数 zk_num_alive_connections = 301
服务端重启后能响应用时 642 ms;300/300 个客户端重新 CONNECTED:第一个 482 ms、中位 1161 ms、最后一个 11517 ms(相对服务端开始启动) 会话保持不变(会话 id 集合相同): True | 重启后 zk_global_sessions / alive connections = 300 / 301
300 个客户端对一个单机 ZooKeeper 来说负载并不大;如果是几千个客户端,客户端自己的重连退避与服务端的连接限流(第 19、26 篇)会变得更重要,本文没有测到那个规模。
重启后 288/300 个客户端已连上,其中状态出现过 LOST(会话过期)的 59 个,换了新会话 id 的 71 个;重启后 zxid 增加 130(新会话 + 过期会话的 closeSession 事务)
数字每次运行都会不同(取决于恢复时机)。它说明的是:会话超时设得太短,一次几秒的重启就可能让一批会话过期,临时节点(比如服务注册)集中消失,引发二次风暴。