线上ZK问题排查

  • 2019 年 10 月 3 日
  • 筆記

问题描述

测试环境ZK集群的三个节点中zk1状态虽然是follower,启动也能正常启动(通过telnet也能telnet 2181端口); 无法通过zk客户端去连接2181端口,状态一致是CONNECTING

查看zk集群所有节点状态
/data/zookeeper-new-1/bin/zkServer.sh status  /data/zookeeper-new-2/bin/zkServer.sh status  /data/zookeeper-new-3/bin/zkServer.sh status

得到zk2是主节点

查看各个节点的data数据大小
du -h /data/zookeeper/tmp/zk1/data/version-2/ --max-depth=1  du -h /data/zookeeper/tmp/zk2/data/version-2/ --max-depth=1  du -h /data/zookeeper/tmp/zk3/data/version-2/ --max-depth=1
[appadm@moonmall_Z1 zookeeper]$ du -h /data/zookeeper/tmp/zk1/data/version-2/ --max-depth=1  2.4G    /data/zookeeper/tmp/zk1/data/version-2/  [appadm@moonmall_Z1 zookeeper]$ du -h /data/zookeeper/tmp/zk2/data/version-2/ --max-depth=1  7.1G    /data/zookeeper/tmp/zk2/data/version-2/  [appadm@moonmall_Z1 zookeeper]$ du -h /data/zookeeper/tmp/zk3/data/version-2/ --max-depth=1  7.3G    /data/zookeeper/tmp/zk3/data/version-2/  [appadm@moonmall_Z1 zookeeper]$

结果: zk1节点的数据落后其它节点太多,查看ZK1的配置信息(zoo.conf

# The number of milliseconds of each tick  tickTime=2000  # The number of ticks that the initial  # synchronization phase can take  initLimit=10  # The number of ticks that can pass between  # sending a request and getting an acknowledgement  syncLimit=5  # the directory where the snapshot is stored.  # do not use /tmp for storage, /tmp here is just  # example sakes.  dataDir=/data/zookeeper/tmp/zk1/data  dataLogDir=/data/zookeeper/tmp/zk1/log  # the port at which the clients will connect  clientPort=2181

两个参数需要注意
参数名称|说明
—|—-
tickTime | zk服务器与客户端之间心跳维持的时间间隔。每隔tickTime的时间就会发送一个心跳。
initLimit | 允许所有follower与leader进行同步的时间,如果在设定的时间段内,半数以上的follower未能完成同步,集群会再进行一次选举。
syncLimit | leader与follower之间的同步时间,如果在设定的时间内未完成同步,它将会被集群丢弃。

解决方案
  1. 调整syncLimit, 如果文件大小相差较大,可以讲时间相应的调大.
  2. 将主节点的文件手动复制到有问题的节点中.
  3. 调整zoo.conf定时清理数据快照信息。减少数据同步信息
autopurge.snapRetainCount=5  # Purge task interval in hours  # Set to "0" to disable auto purge feature  autopurge.purgeInterval=1
  1. 对于集群节点data目录快照文件相差非常巨大。用方法2无法使集群正常工作。(即使集群能够正常启动起来,过不了多久又会停止工作。但是各个节点角色还是正常的)。考虑到之前有个节点总是挂起。可以想到整个集群数据不能保证一致,可以考虑是否重建数据目录。这个需要对整个业务衡量