zookeeper重启,线上微服务全部掉线,怎么回事?
供稿:hz-xin.com 日期:2025-01-16
一次意外的zookeeper集群重启引发了线上微服务大规模的故障。19:43,错误的操作导致6台节点下线,引发19:56开始的大量服务调用失败。微服务框架依赖于zk的临时节点进行注册发现,而zk的session机制在这次异常中起了关键作用。
故障复现时,我们发现zk的session过期问题,特别是客户端过期后,服务端重启可能导致临时节点丢失,且自动恢复机制失效。在集群恢复后,服务端根据snapshot创建新session,而客户端旧的session已过期,导致创建临时节点失败。在40s后,服务端删除了过期的临时节点,触发了服务中断。
根本原因是zk服务端的session过期清理机制与客户端的session重连策略不匹配。解决方法是客户端设置更长的session过期时间,或者在重连时处理NodeExistsException,确保节点的正确创建。dubbo框架采用的处理策略是删除并重新创建,以避免因zk服务器删除延迟造成的旧session问题。
最佳实践上,应加强对异常的处理,如实施「推空保护」,避免在服务发现过程中清空所有节点,以防类似故障的发生。
总结这次教训,确保微服务框架对zk的依赖稳定,同时优化异常处理策略,是提升系统健壮性的关键。希望这些经验能帮助大家避免类似问题。
故障复现时,我们发现zk的session过期问题,特别是客户端过期后,服务端重启可能导致临时节点丢失,且自动恢复机制失效。在集群恢复后,服务端根据snapshot创建新session,而客户端旧的session已过期,导致创建临时节点失败。在40s后,服务端删除了过期的临时节点,触发了服务中断。
根本原因是zk服务端的session过期清理机制与客户端的session重连策略不匹配。解决方法是客户端设置更长的session过期时间,或者在重连时处理NodeExistsException,确保节点的正确创建。dubbo框架采用的处理策略是删除并重新创建,以避免因zk服务器删除延迟造成的旧session问题。
最佳实践上,应加强对异常的处理,如实施「推空保护」,避免在服务发现过程中清空所有节点,以防类似故障的发生。
总结这次教训,确保微服务框架对zk的依赖稳定,同时优化异常处理策略,是提升系统健壮性的关键。希望这些经验能帮助大家避免类似问题。