1. 程式人生 > >記一次ZOOKEEPER叢集超時問題分析

記一次ZOOKEEPER叢集超時問題分析

CDH安裝的ZK,三個節點,基本都是預設配置,一直用得正常,今天出現問題,
客戶端連線超時6倍時長,預設最大會話超時時間是一分鐘。
原因分析:
1.首先要確認網路正確。確認時鐘同步。
2.檢視現有的配置,基本都是預設配置 JVM配置是1G 有 2g的,不一樣
3.檢視dataDir目錄,du -sh .發現已經有五百多M
具體原因不確定,沒有看到日誌中出現的問題,
分析可能是因為隨著時間的推移,ZOOKEEPER中的資料資訊量增大,啟動後
因為需要同步的資料量和初始同步時間過短簡(initLimit=10)等原因,
造成叢集不健康,
解決方案:
1.增大JVM堆疊記憶體從1G到3G,確認機器上有足夠記憶體,不能SWAP。
2.增大TICKTIME FROM 2000 TO 3000  增加“tickTime”或者“initLimit和syncLimit”的值,或者兩者都增大。


3.增大最大客戶端連線數 統一為600 (以防萬一)

查詢相關的資料:

1 參考這位兄弟的文章:菜鳥小玄: https://www.jianshu.com/p/f30ae8e75d6d

一個server廣播的資料包括4個部分:

自己所選取的leader的id:首次選舉的話,這個id就是自己的id;

當前server儲存的資料的zxid:越新就越應該被其它server選為leader,保證資料的最新

邏輯時鐘:也就是這是第幾次選舉,越大表示這是越新的選舉;

本機狀態:LOOKING,FOLLOWING,OBSERVING,LEADING幾種;

每個server收到其它server發來的值後,進行判斷,選擇所儲存的資料最新(zxid最大)、邏輯時鐘最大,且在選舉狀態的id作為leader(當然,還有其它條件,邏輯比較複雜,這裡不再贅述),並重新廣播。來來回回幾次之後,系統達成一致,得票多的為leader,leader被選出。

現在leader被選出,但這並不意味著它能坐穩leader的位置,因為接下來,leader要向所有的follower同步自己所儲存的資料(多寫問題)。如果這個過程出錯或超時,則又需要重新選舉leader;

那麼一般造成zookeeper叢集掛掉的原因是什麼呢?歸根到底一句話:要同步的資料太大!多大?500M

zookeeper叢集中leader和follower同步資料的極限值是500M,這500M的資料,載入到記憶體中,大約佔用3個G的記憶體。資料過大,在每次選舉之後,需要從server同步到follower,容易造成下面2個問題:

網路傳輸超時,因為檔案過大,傳輸超過最大超時時間,造成TimeoutException,從而引起重新選舉。