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有效)。