1. 程式人生 > >zookeeper-監控與優化-《每日五分鐘搞定大資料》

zookeeper-監控與優化-《每日五分鐘搞定大資料》

本文的命令和配置都是基於zookeeper-3.4.6版本。優化很多時候都是基於監控的,所以把這兩個內容寫在了一起,慢慢消化。

監控

簡單地說,監控無非就是獲取服務的一些指標,再根據實際業務情況給這些指標設定一個合適的閾值,然後進行告警的一個過程。

如何獲取這些指標?

ZooKeeper 提供了四字命令(The Four Letter Words),用來獲取 ZooKeeper 服務的當前狀態及相關資訊。

有哪些命令可以使用?

ZooKeeper四字命令 功能描述
conf 列印配置
cons 列出所有連線到這臺伺服器的客戶端全部連線/會話詳細資訊。包括"接受/傳送"的包數量、會話id、操作延遲、最後的操作執行等等資訊。
crst 重置所有連線的連線和會話統計資訊。
dump 列出那些比較重要的會話和臨時節點。這個命令只能在leader節點上有用。
envi 打印出服務環境的詳細資訊。
reqs 列出未經處理的請求
ruok 即"Are you ok",測試服務是否處於正確狀態。如果確實如此,那麼服務返回"imok",否則不做任何相應。
stat 輸出關於效能和連線的客戶端的列表。
srst 重置伺服器的統計。
srvr 列出連線伺服器的詳細資訊
wchs 列出伺服器watch的詳細資訊。
wchc 通過session列出伺服器watch的詳細資訊,它的輸出是一個與watch相關的會話的列表。
wchp 通過路徑列出伺服器watch的詳細資訊。它輸出一個與session相關的路徑。
mntr 輸出可用於檢測叢集健康狀態的變數列表

如何使用四字命令?

可以在客戶端可以通過 telnet 或 nc 向 ZooKeeper 提交相應的命令。舉個最常用的栗子:

echo mntr | nc ip 2181
指標名 解釋
zk_version 版本
zk_avg_latency 平均 響應延遲
zk_max_latency 最大 響應延遲
zk_min_latency 最小 響應延遲
zk_packets_received 收包數
zk_packets_sent 發包數
zk_num_alive_connections 活躍連線數
zk_outstanding_requests 堆積請求數
zk_server_state 主從狀態
zk_znode_count znode 數
zk_watch_count watch 數
zk_ephemerals_count 臨時節點數
zk_approximate_data_size 近似資料總和大小
zk_open_file_descriptor_count 開啟 檔案描述符 數
zk_max_file_descriptor_count 最大 檔案描述符 數
leader才有的指標
zk_followers Follower 數
zk_synced_followers 已同步的 Follower 數
zk_pending_syncs 阻塞中的 sync 操作

優化方案

1.日誌

快照目錄 dataDir 和 事務日誌目錄 dataLogDir 分離

寫事務日誌的目錄,需要保證目錄空間足夠大,並掛載到單獨的磁碟上

為了保證資料的一致性,Zookeeper 預設 forceSync 配置為 yes ,

即在返回客戶端事務請求響應之前,要將此次請求對應的事務日誌刷入到磁碟中,所以事務日誌的寫入速度,直接決定了 Zookeeper 的吞吐率

Log4j日誌優化

調整為 DaliyRollingFileAppender,每天滾動建立新的日誌檔案

vim $ZOOKEEPER_HOME/conf/log4j.properties

  zookeeper.root.logger=INFO, CONSOLE
  zookeeper.console.threshold=INFO
  zookeeper.log.dir=.
  zookeeper.log.file=zookeeper.log
  zookeeper.log.threshold=DEBUG
  zookeeper.tracelog.dir=.
  zookeeper.tracelog.file=zookeeper_trace.log
  log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender
  log4j.appender.ROLLINGFILE.Threshold=${zookeeper.log.threshold}
  log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file}
  log4j.appender.ROLLINGFILE.DatePattern='.'yyyy-MM-dd

增加 ZOO_LOG_DIR 配置

vim bin/zkServer.sh


  ZOO_LOG_DIR=$ZOOBINDIR/../log4j

CONSOLE改為ROLLINGFILE

vim bin/zkEnv.sh


  # if [ "x${ZOO_LOG4J_PROP}" = "x" ]
  # then
  #     ZOO_LOG4J_PROP="INFO,CONSOLE"
  # fi
  if [ "x${ZOO_LOG4J_PROP}" = "x" ]
  then
      ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
  fi

2.zoo.cfg配置

  • globalOutstandingLimit=100000

客戶端連線過多,限制客戶端請求,避免OOM

  • preAllocSize=64M 日誌檔案預分配大小; snapCount=100,000 多少次寫事務,生成一個快照如果快照生成頻繁可適當調大該引數。

一般zk的應用提倡讀大於寫,效能較好(10:1),儲存元資料用來協調分散式資料最終一致。寫過於頻繁使用快取更好

  • 日誌檔案自動清除
autopurge.snapRetainCount=3 # 要在dataDir中保留的快照數
autopurge.purgeInterval=24 # 設定日誌清除時間間隔;設定為“0”以禁用自動清除功能

謹慎修改:

  • skipACL=yes

忽略ACL驗證,可以減少許可權驗證的相關操作,提升一點效能。

  • forceSync=no

在不追求強一致性的情況下可以把這個設為no,對寫請求的效能提升很有幫助。

forceSync指每次寫請求都強制從pagecache固化到磁碟上,才算是寫成功返回。

當寫請求數量到達一定程度的時候,後續寫請求會等待前面寫請求的forceSync操作,造成一定延時。

如果追求低延時的寫請求,配置forceSync=no,資料寫到pagecache後就返回。

但是機器斷電的時候,pagecache中的資料有可能丟失。

  • forceSync=yes;fsync.warningthresholdms=50

若為強一致性場景,可以再設定個fsync.warningthresholdms=50, 資料固化到磁碟的操作fsync超過50ms的時候,將會在zookeeper.out中輸出一條warn日誌(forceSync=yes有效)。

歡迎關注大叔據