搜公众号
推荐 原创 视频 Java开发 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库
Lambda在线 > Java面试那些事儿 > 线上的zookeeper捉虫实战经验,值得读!!!

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

Java面试那些事儿 2018-06-26
举报

一、问题现象

最后发现线上的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捉虫实战经验,值得读!!!》的版权归原作者「Java面试那些事儿」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

举报