線上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無法使集群正常工作。(即使集群能夠正常啟動起來,過不了多久又會停止工作。但是各個節點角色還是正常的)。考慮到之前有個節點總是掛起。可以想到整個集群數據不能保證一致,可以考慮是否重建數據目錄。這個需要對整個業務衡量