本文的命令和配置都是基於zookeeper-3.4.6版本。優化不少時候都是基於監控的,因此把這兩個內容寫在了一塊兒,慢慢消化。node
簡單地說,監控無非就是獲取服務的一些指標,再根據實際業務狀況給這些指標設定一個合適的閾值,而後進行告警的一個過程。apache
ZooKeeper 提供了四字命令(The Four Letter Words),用來獲取 ZooKeeper 服務的當前狀態及相關信息。vim
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 操做 |
寫事務日誌的目錄,須要保證目錄空間足夠大,並掛載到單獨的磁盤上服務器
爲了保證數據的一致性,Zookeeper 默認 forceSync 配置爲 yes ,session
即在返回客戶端事務請求響應以前,要將這次請求對應的事務日誌刷入到磁盤中,因此事務日誌的寫入速度,直接決定了 Zookeeper 的吞吐率app
調整爲 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
客戶端鏈接過多,限制客戶端請求,避免OOM
通常zk的應用提倡讀大於寫,性能較好(10:1),存儲元數據用來協調分佈式數據最終一致。寫過於頻繁使用緩存更好
autopurge.snapRetainCount=3 # 要在dataDir中保留的快照數 autopurge.purgeInterval=24 # 設置日誌清除時間間隔;設置爲「0」以禁用自動清除功能
謹慎修改:
忽略ACL驗證,能夠減小權限驗證的相關操做,提高一點性能。
在不追求強一致性的狀況下能夠把這個設爲no,對寫請求的性能提高頗有幫助。
forceSync指每次寫請求都強制從pagecache固化到磁盤上,纔算是寫成功返回。
當寫請求數量到達必定程度的時候,後續寫請求會等待前面寫請求的forceSync操做,形成必定延時。
若是追求低延時的寫請求,配置forceSync=no,數據寫到pagecache後就返回。
可是機器斷電的時候,pagecache中的數據有可能丟失。
若爲強一致性場景,能夠再設置個fsync.warningthresholdms=50, 數據固化到磁盤的操做fsync超過50ms的時候,將會在zookeeper.out中輸出一條warn日誌(forceSync=yes有效)。