zookeeper集群搭建及優化
zookeeper二進制包安裝方法:
tar -xf zookeeper-3.4.6.tar.gz -C /usr/local
cd /usr/local
mv zookeeper-3.4.6 zookeeper
三臺:
153:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/var/zookeeper
clientPort=2181
server.1=192.168.1.153:2888:3888
server.2=192.168.1.154:2888:3888
server.3=192.168.1.155:2888:3888
forceSync=yes
globalOutstandingLimit=100000
preAllocSize=64M
snapCount=100000
skipACL=yes
myid:這個需要手動創建
mkdir -p /var/zookeeper
cd /var/zookeeper
echo 1 myid
cat myid
1
154:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/var/zookeeper
clientPort=2181
server.1=192.168.1.153:2888:3888
server.2=192.168.1.154:2888:3888
server.3=192.168.1.155:2888:3888
fsync.warningthresholdms=50
globalOutstandingLimit=100000
preAllocSize=64M
snapCount=100000
skipACL=yes
myid:這個需要手動創建
mkdir -p /var/zookeeper
cd /var/zookeeper
echo 2 myid
cat myid
2
155:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/var/zookeeper
clientPort=2181
server.1=192.168.1.153:2888:3888
server.2=192.168.1.154:2888:3888
forceSync=yes
fsync.warningthresholdms=50
globalOutstandingLimit=100000
preAllocSize=64M
snapCount=100000
skipACL=yes
myid:這個需要手動創建
mkdir -p /var/zookeeper 創建數據目錄
cd /var/zookeeper
echo 3 myid
cat myid
3
設置zookeeper的java虛擬機使用內存:
vim /usr/local/zookeeper/conf/java.env
export JVMFLAGS="-Xms2048m -Xmx2048m $JVMFLAGS" 此處的內存根據實際的內存做調整。
zookeeper服務端命令:
- 啟動ZK服務: zkServer.sh start
- 查看ZK服務狀態: zkServer.sh status
- 停止ZK服務: zkServer.sh stop
- 重啟ZK服務: zkServer.sh restart
以上命令快捷使用方式:
echo ‘PATH=/usr/local/zookeeper/bin:$PATH‘ > /etc/profile.d/zookeeper.sh
source /etc/profile.d/zookeeper.sh
說明:其他服務也可以使用類似方案操作。
zookeeper客戶端命令:
- 顯示根目錄下、文件: ls / 使用 ls 命令來查看當前 ZooKeeper 中所包含的內容
- 顯示根目錄下、文件: ls2 / 查看當前節點數據並能看到更新次數等數據
- 創建文件,並設置初始內容: create /zk "test" 創建一個新的 znode節點“ zk ”以及與它關聯的字符串
- 獲取文件內容: get /zk 確認 znode 是否包含我們所創建的字符串
- 修改文件內容: set /zk "zkbak" 對 zk 所關聯的字符串進行設置
- 刪除文件: delete /zk 將剛才創建的 znode 刪除
- 退出客戶端: quit
-
幫助命令: help
ZooKeeper 支持某些特定的四字命令字母與其的交互。它們大多是查詢命令,用來獲取 ZooKeeper 服務的當前狀態及相關信息。用戶在客戶端可以通過 telnet 或 nc 向 ZooKeeper 提交相應的命令
- 可以通過命令:echo stat|nc 127.0.0.1 2181 來查看哪個節點被選擇作為follower或者leader
- 使用echo ruok|nc 127.0.0.1 2181 測試是否啟動了該Server,若回復imok表示已經啟動。
- echo dump| nc 127.0.0.1 2181 ,列出未經處理的會話和臨時節點。
- echo kill | nc 127.0.0.1 2181 ,關掉server
- echo conf | nc 127.0.0.1 2181 ,輸出相關服務配置的詳細信息。
- echo cons | nc 127.0.0.1 2181 ,列出所有連接到服務器的客戶端的完全的連接 / 會話的詳細信息。
- echo envi |nc 127.0.0.1 2181 ,輸出關於服務環境的詳細信息(區別於 conf 命令)。
- echo reqs | nc 127.0.0.1 2181 ,列出未經處理的請求。
- echo wchs | nc 127.0.0.1 2181 ,列出服務器 watch 的詳細信息。
- echo wchc | nc 127.0.0.1 2181 ,通過 session 列出服務器 watch 的詳細信息,它的輸出是一個與 watch 相關的會話的列表。
- echo wchp | nc 127.0.0.1 2181 ,通過路徑列出服務器 watch 的詳細信息。它輸出一個與 session 相
zookeeper服務優化
1.快照文件和事務日誌文件分別掛在不同磁盤。zoo.cfg文件中,dataDir是存放快照數據的,dataLogDir是存放事務日誌的。zookeeper更新操作過程:先寫事務日誌,再寫內存,周期性落到磁盤(刷新內存到快照文件)。事務日誌的對寫請求的性能影響很大,保證dataLogDir所在磁盤性能良好、沒有競爭者。
-
默認jvm沒有配置Xmx、Xms等信息,可以在conf目錄下創建java.env文件(內存堆空間一定要小於機器內存,避免使用swap)
export JVMFLAGS="-Xms2048m -Xmx2048m $JVMFLAGS" - 按天出zookeeper日誌,避免zookeeper.out文件過大。
zkEnv.sh文件日誌輸出方式從CONSOLE改為ROLLINGFILE;
if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
ZOO_LOG4J_PROP="INFO,CONSOLE"
ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
fi
conf/log4j.properties設置為按天生成文件DailyRollingFileAppender
#zookeeper.root.logger=INFO, CONSOLE
zookeeper.root.logger=INFO, ROLLINGFIL
log4j.appender.ROLLINGFILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ROLLINGFILE.Threshold=${zookeeper.log.threshold}
log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file}
log4j.appender.ROLLINGFILE.DatePattern=‘.‘yyyy-MM-dd
Max log file size of 10MB
#log4j.appender.ROLLINGFILE.MaxFileSize=10MB
-
zoo.cfg文件中skipACL=yes,忽略ACL驗證,可以減少權限驗證的相關操作,提升一點性能。
-
zoo.cfg文件中forceSync=no,這個對寫請求的性能提升很有幫助,是指每次寫請求的數據都要從pagecache中固化到磁盤上,才算是寫成功返回。當寫請求數量到達一定程度的時候,後續寫請求會等待前面寫請求的forceSync操作,造成一定延時。如果追求低延時的寫請求,配置forceSync=no,數據寫到pagecache後就返回。但是機器斷電的時候,pagecache中的數據有可能丟失。
默認為forceSync=yes,為yes可以設置fsync.warningthresholdms=50 如果數據固化到磁盤的操作fsync超過50ms的時候,將會在zookeeper.out中輸出一條warn日誌(forceSync=yes有效)。 -
globalOutstandingLimit=100000 客戶端連接過多,限制客戶端請求,避免OOM
-
zoo.cfg文件中preAllocSize=64M 日誌文件預分配大小; snapCount=100,000 多少次寫事務,生成一個快照如果快照生成頻繁可適當調大該參數。
一般zk的應用提倡讀大於寫,性能較好(10:1),存儲元數據用來協調分布式數據最終一致。寫過於頻繁使用緩存更好 - 日誌文件自動清除(如果追求性能,可手動清除)
autopurge.snapRetainCount=3 # The number of snapshots to retain in dataDir
autopurge.purgeInterval=24 # Purge task interval in hours Set to "0" to disable auto purge feature
zookeeper集群搭建及優化