5月30日 20:13
Zookeeper 连接超时、脑裂和数据不一致怎么排查?
Zookeeper 出问题时不要先调参数,先判断是客户端、网络、磁盘还是集群选举问题。连接超时通常看 sessionTimeout、端口连通性和服务端负载;脑裂要看是否真的出现多个可写 Leader,多数情况下是网络分区或监控误判;数据不一致多半是读到了落后的 Follower,需要用 sync() 或改读 Leader。
追问
连接超时一定是服务端问题吗?
不一定。先用 nc 验证 2181 端口,再看客户端 DNS、负载均衡、防火墙和连接池是否耗尽。服务端 latency_max 很高时,还要查磁盘 I/O、GC 暂停和 outstanding 请求堆积。
Zookeeper 会不会真的脑裂?
Zookeeper 依赖过半机制,正常配置下不会允许两个 Leader 同时提交事务。危险点通常是偶数节点、跨机房高延迟部署、错误 myid/server 配置或监控误判。
数据不一致时 sync() 为什么有用?
Follower 读可能落后于 Leader,sync(path) 会让当前连接先同步到较新的事务点。代价是多一次网络往返,强一致读路径不要滥用。
Watcher 泄漏怎么判断?
看 echo wchs | nc zk1 2181 和客户端注册逻辑。很多泄漏来自异常重试时重复注册,修复时要让 Watcher 与业务对象生命周期绑定。
故障恢复最怕什么?
最怕只恢复快照不恢复事务日志,或不同节点混用不同版本数据目录。恢复前先停集群、备份现状,再按 zxid 最新且完整的快照和日志恢复。
写段命令
bashecho ruok | nc zk1 2181 echo stat | nc zk1 2181 echo mntr | nc zk1 2181 | egrep 'latency|connections|outstanding|synced'