线上的zookeeper捉虫实战经验,值得读!!!

Posted Java面试那些事儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线上的zookeeper捉虫实战经验,值得读!!!相关的知识,希望对你有一定的参考价值。

一、问题现象

最后发现线上的zookeeper的日志zookeeper.out文件居然有6G,后来设置下日志为滚动输出「见参考」。但是改了之后,发现一天的日志量就是100多M,滚动日志一天就被冲掉了,这个不科学。

再仔细查看下日志里的内容,发现有很多连接建立好,马上又断开:

从日志输出的时间来看,秒连秒断,非常诡异。

二、排查问题

用netstat查看网络连接状态,到client的服务器上查看连接的状态:

netstat -antp | grep 2181

发现有很多TIME_WAIT状态的连接:

线上的zookeeper捉虫实战经验,值得读!!!

但是TIME_WAIT状态的连接是看不到进程号的。搜索研究了下netstat的参数,发现没有办法输出TIME_WAIT状态的连接的pid,只好尝试其它的办法。再用 jstack -l pid 来查看进程的线程栈,也没有发现什么异常的东东。查看到有几个zookeeper连接的线程,但也是正常状态。

再检查了机器的IO,CPU,内存,也没有异常的情况。没找到什么有用的信息,只好再研究下netstat的参数,发现用 netstat -ae 输出了一些信息:

线上的zookeeper捉虫实战经验,值得读!!!

发现user是root。便以为是非Java应用,在不断地连接zookeeper。于是停止java程序,发现没有TIME_WAIT连接了。但是确认是Java应用的问题,于是再重启Java应用,但没有再发现TIME_WAIT情况。很诡异。问题不能重现了,相当的蛋疼。忽然想到线上的应用也许也有这个问题,于是到线下zookeeper服务器上查看了下,果然发现有同样的问题。

三、用tcpdump抓包和wireshark分析

先用tcpdump来查看下具体的网络连接,发现的确是连接连上再断开。于是先保存成cap文件,再用wireshark来分析:

tcpdump -vv host 192.168.66.27 and port 2181 -w 2181.cap

但是也没有发现什么有用信息,的确是TCP连接连上,再FIN,ACK连接断开。查看应用日志,发现Tomcat webcontext没有正常启动

没办法了,有两种考虑,一个是用strace,二是用btrace。但是btrace好久没用过了,不太想再去看例子文档。还好,去下btrace之后,先去看了下应用的日志,发现应用报了一些ClassLoader的错误:

线上的zookeeper捉虫实战经验,值得读!!!

因为有经验了,马上知道这个Tomcat因为其它原因webcontext实始化失败退出,然后后面的一些线程继续跑时,会抛出ClassLoader,或者Class not found的异常。

于是,猜想到原因了:tomcat webcontext初始化失败,zookeeper的重连线程自动不断重连。但是,为什么重启Tomcat之后,没有重现TIME_WAIT的情况?

再折腾了下,发现只有当zookeeper重启后,应用才会出现大量的TIME_WAIT连接。报的是下面这个异常:

这个异常的原因,是某些zookeeper的类没有加载到。

四、总结

梳理下整个流程:Tomcat启动,初始化webcontext;初始化spring, spring初始某些些bean,这些bean包括了zookeeper的连接相关的bean;这时zkClient(独立线程)已经连接上服务器了,但是classloader没有加载到org/apache/zookeeper/proto/SetWatches类;spring初始化失败,导致Tomcat webcontext初始化也失败,应用在挂起状态,但zkClient线程还是正常的;zookeeper服务器重启,zkClient开始重连,连接上zookeeper服务器;zkClient触发watch的一些代码,ClassLoader尝试加载org/apache/zookeeper/proto/SetWatches类,但是发现找不到类,于是抛出异常;zkClient捕获到异常,认为重连失败,close掉connection,休眠几秒之后,再次重连;于是出现了zkClient反复重试连接zookeeper服务器,而且都是秒连秒断的情况。

这次排查花了不少时间,有个原因是开始没有去查看应用的日志,以为应用的是正常的,而且zookeeper.out的输出日志很多,也有一段时间了。还有线上的应用比较坑爹,活动已经过期很久了,但是程序还是线上跑,也没有人管是否出问题了。所以,主要精力放在各种网络连接状态的获取上。对去查看应用日志比较排斥。还有一个原因是,问题比较诡异,有点难重现,当发现可以重现时,基本已经发现问题所在了。排查问题还是要耐心收集信息,再分析判断。

五、参考

http://blog.csdn.net/hengyunabc/article/details/19006911

原文链接:https://m.aliyun.com/yunqi/articles/6071


推荐阅读:


—————END—————

看更多技术好文

请长按下方图片扫码关注

以上是关于线上的zookeeper捉虫实战经验,值得读!!!的主要内容,如果未能解决你的问题,请参考以下文章

Zookeeper 事件监听 - 史上最详解读

MapReduce全局变量之捉虫记

线上直播kafka分布式平台的设计和实战

今日头条 SEO 研究,值得深思的 5 个问题

Golang工程经验(上)

攻克痛点:DevOps线上部署的最后一公里(有彩蛋)