经过线报,说前方应用有异常,导致了可用性变差。咦!讨厌的异常,抛异常是程序猿最讨厌的事情之一。

经过收集异常信息如下

2019-06-24 10:57:41.806 ERROR [hades-afe-opw,,,] 67380 --- [erFactory-Timer] c.t.p.s.s.TBScheduleManagerFactory       : KeeperErrorCode = ConnectionLoss for /taobao-pamirs-schedule/hades-earn-opw/factory/10.10.128.163$tjsr-2$9235182DDA104802AB642BC0CF418A22$0000003165

org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /taobao-pamirs-schedule/hades-earn-opw/factory/10.10.114.63$tjsr-2$9235182DDA104802AB642BC0CF418A22$0000003165
at org.apache.zookeeper.KeeperException.create(KeeperException.java:99)
at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)
at org.apache.zookeeper.ZooKeeper.exists(ZooKeeper.java:1045)
at org.apache.zookeeper.ZooKeeper.exists(ZooKeeper.java:1073)
at com.taobao.pamirs.schedule.zk.ScheduleStrategyDataManager4ZK.loadManagerFactoryInfo(ScheduleStrategyDataManager4ZK.java:295)
at com.taobao.pamirs.schedule.strategy.TBScheduleManagerFactory.refresh(TBScheduleManagerFactory.java:164)
at com.taobao.pamirs.schedule.strategy.ManagerFactoryTimerTask.run(TBScheduleManagerFactory.java:438)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)

  

一看异常很神秘,

从异常的表面意思看就是去zookeeper查询某个node是否存在然后爆出了 KeeperErrorCode = ConnectionLoss这个错误

经过各种查询说需要调优zookeeper,具体情况大家可以自行进行搜索。


我们的实现马上转移到zookeeper上面,观察zk的运行环境。

我们经过了如下各种过程处理(以下是未成功的处理):

加内存:2G-->4G(虽然我们知道加内存没有用,自己心里安慰一下万一能解决那,哈哈)

加CPU:4C-->6C

换磁盘空间并打开虚拟机读写限制

移动虚拟机主机位置

调整前后统计对比图:

网络 I/O:sar -n DEV 1

CPU I/O: vmstat 1

磁盘 I/O : sar -d 1

这里我说下经过各种环境的取值分析得出如下现象和结论:

现象:

CPU有点高但是在可接受范围内

内存完全够用不存在内存溢出可能

磁盘读写完全没有达到所能承受的上限

网络同样没有达到可用的上限

问题指标

发现cpu执行的IO等待高,why?

经过各种数据的分析有了如下大胆的猜测,

zookeeper是强一致性的分布式系统,

CAP理论中它属于CP系列,

所以对于读写有强一致的要求,

大量并发情况下对一个文件的读写(zookeeper日志文件 log.xxxxx的那个文件)会有排队想象同时他还会对从机进行分发数据,

搞得主机(master)很忙造成cpu的操作都在等待那一个文件上面,

但实际上读写的内容并不多,

也就没有达到磁盘的上限。

然后就造成了主动断开连接上面的异常 ConnectionLoss。

也就是说这个异常个人猜测是zookeeper的主动行为,否则的话会报超时异常。

所以针对各种分析与搜索以及实践有如下两种方法解决:

  1. 设置zookeeper本身的参数forceSync=no 
  2. 将日志文件写入目录指向内存句柄

以上两个方案都有一个弊端,就是在zookeeper集群中master突然断电的时候会造成少量数据因为没有落盘而丢失,所以对于数据有相应要求的情况请慎用

本次采用第二种方法:修改zoo.cfg配置文件:

dataLogDir=/zookeeper/logs 修改为
dataLogDir=/dev/shm

从目前情况看问题基本解决,也请大家调整相关系统框架与zookeeper的心跳频率,以减少zk的压力。

zookeeper客户端KeeperErrorCode = ConnectionLoss异常问题排查历险记的更多相关文章

  1. zookeeper错误KeeperErrorCode = ConnectionLoss解决

    原因: 一般是由于连接还未完成就执行zookeeper的get/create/exsit操作引起的. 解决方法: 利用"CountDownLatch 类 + zookeeper的watche ...

  2. java连接zookeeper服务器出现“KeeperErrorCode = ConnectionLoss for ...”

    错误信息如下: Exception in thread "main" org.apache.zookeeper.KeeperException$ConnectionLossExce ...

  3. java连接zookeeper服务器出现“KeeperErrorCode = ConnectionLoss for /test”

    昨天调试java连接zookeeper服务器,zookeeper搭建过程在这里不做赘述,在创建连接后,然后操作节点一直报异常 错误信息如下: Exception in thread "mai ...

  4. alimama open source mdrill启动后访问蓝鲸任务时出错:Caused by:org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss

    启动后,访问:http://IP:1107/mdrill.jsp  蓝鲸任务

  5. org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /eclipse20171118

    1:如果有一天,你有幸看到了这个错误,也许你像我一样low,因为此时,你已经准备开发Zookeeper程序了,却还没有把Zookeeper的服务启动起来. org.apache.zookeeper.K ...

  6. zk的KeeperErrorCode = ConnectionLoss错误

    额,这东西都快把人搞崩溃了,各种排查各种正常. 最后竟然是因为我在客户端未连接上zkserver的时候就进行了create操作造成的错误. 噗, Exception in thread "m ...

  7. Zookeeper客户端介绍

    客户端是开发人员使用Zookeeper的主要的途径,以下内容将对Zookeeper的内部原理进行详细的学习和讲解.ZooKeeper的客户端主要有一下几个核心组件组成: Zookeeper:提供客户端 ...

  8. Zookeeper客户端Curator使用详解

    Zookeeper客户端Curator使用详解 前提 最近刚好用到了zookeeper,做了一个基于SpringBoot.Curator.Bootstrap写了一个可视化的Web应用: zookeep ...

  9. zookeeper会话超时 链接超时的排查

    1.会话概述 在ZooKeeper中,客户端和服务端建立连接后,会话随之建立,生成一个全局唯一的会话ID(Session ID).服务器和客户端之间维持的是一个长连接,在SESSION_TIMEOUT ...

随机推荐

  1. QT 自定义消息

    #define TEST_EVENT QEvent::User + 100   class CVxActuatorMain : public QMainWindow {   protected:    ...

  2. Flutter移动电商实战 --(23)分类页_左侧类别导航制作

    自动生成dart类 https://javiercbk.github.io/json_to_dart/ 生成的代码 class Autogenerated { String code; String ...

  3. Android中实现日期时间选择器(DatePicker和TimePicker)

    利用Android应用框架提供的DatePicker(日期选择器)和TimePicker(时间选择器),实现日期时间选择器. Dialog的Content布局文件(date_time_dialog.x ...

  4. 图解 HTTP 笔记(二)——简单的 HTTP 协议

    本章主要以 HTTP 1.0 为例,讲解 HTTP 协议的基本结构. 在两台计算机之间使用 HTTP 协议进行通讯时,在一条通讯线路上必定有一端是客户端,另一端则是服务器端. 请求访问文本或图像等资源 ...

  5. 修改Eclipse启动时的选择工作空间

    对于eclipse的默认的工作空间,如果不需要正常切换workspace的用户很方便,打开eclipse便自动进入默认的工作空间.而如果用户经常在多个workspace之间切换的话,启动eclipse ...

  6. 将SSRF升级为RCE(AWS环境)

    原文:https://generaleg0x01.com/2019/03/10/escalating-ssrf-to-rce/ 查找域名范围: 在枚举客户端的子域名时.找到了子域名[docs] 打开这 ...

  7. Flutter磨砂玻璃效果制作

    Flutter的Fliter Widget 也是非常强大的,它可以制作出你想要的神奇滤镜效果.下面制作一个毛玻璃效果. 这个和以前的写法都一样,所以就直接贴代码了. import 'package:f ...

  8. Flutter中通过循环渲染组件

    class ContactsState extends State<Contacts>{ List formList; initState() { super.initState(); f ...

  9. 100% 加速 WebSAMS 3.0 (轉載)

    今日已經是WebSAMS Upgrade 的最後一日,已經有99.8% 學校成功upgrade WebSAMS 3.0.但有學校向我們反映WebSAMS 3.0 比2.0 慢,經過我們的Enginee ...

  10. Ubuntu搭建Spring源码环境常见问题

    在一心想要学习Spring框架源码时,我们会遇到很多麻烦的问题.开始本文前,你只需要拥有一个装好IDEA的Ubuntu系统就可以愉快启程了.如果还没有IDEA,可以参考在Ubuntu上安装Intell ...