盡管zookeeper在編程上有很多的阱陷,API也非常的難用,但zookeeper服務(wù)本身可以說(shuō)是很牢靠的了,所以在網(wǎng)上貌似關(guān)于運(yùn)維的文章比較少。
但省心并不代表不會(huì)出麻煩,下面總結(jié)下zookeeper運(yùn)維相關(guān)的東東。
重要的參考資料
這里有一個(gè)很好的Pdf,介紹了很多zookeeper的東東,作者是zookeeper的committer之一:
http://www.infoq.com/presentations/Misconfiguration-ZooKeeper
另外,這里有一個(gè)總結(jié):http://marcin.cylke.com.pl/blog/2013/03/21/zookeeper-tips/
配置zookeeper開(kāi)機(jī)啟動(dòng)
首先修改bin/zkEnv.sh,配置ZOO_LOG_DIR的環(huán)境變量,ZOO_LOG_DIR是zookeeper日志輸出目錄,ZOO_LOG4J_PROP是log4j日志輸出的配置:
if [ "xZOOBINDIR/../logs"
fi
if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
fi
再在/etc/init.d目錄下增加zookeeper1文件,并加個(gè)可執(zhí)行權(quán)限:
cd /etc/init.d
touch zookeeper1
chmod +x zookeeper1
再修改zookeeper1的內(nèi)容為:
/bin/sh
chkconfig: 2345 20 80
description: zookeeper1
case $1 in
start) su zookeeper /home/zookeeper/zookeeper345_1/bin/zkServer.sh start ;;
stop) su zookeeper /home/zookeeper/zookeeper345_1/bin/zkServer.sh stop;;
status) su zookeeper /home/zookeeper/zookeeper345_1/bin/zkServer.sh status;;
restart) su zookeeper /home/zookeeper/zookeeper345_1/bin/zkServer.sh restart;;
*) echo "require start|stop|status|restart" ;;
esac
最后用chkconfig -add zookeeper1 增加服務(wù)。這樣就搞定了。注意用su zookeeper來(lái)切換到zookeeper用戶(hù)。
如果是想配置Upstart方式的啟動(dòng),可以參考:http://blog.csdn.net/hengyunabc/article/details/18967627
zookeeper VIRT虛擬內(nèi)存占用過(guò)大的問(wèn)題:
這個(gè)和zookeeper的實(shí)現(xiàn)有關(guān),參考這里:http://zookeeper-user.578899.n2.nabble.com/setting-zookeeper-heap-size-td6983511.html
線上的zookeeper的VIRT有30多G,查看了data, dataLog,總共才幾百M(fèi)。不過(guò)一直沒(méi)什么問(wèn)題。
Unreasonable length的問(wèn)題:
https://issues.apache.org/jira/browse/ZOOKEEPER-1513
目前線上用的是345版本,而zookeeper最后的release版本就是這個(gè),有大概一年多沒(méi)更新了。。
這個(gè)問(wèn)題有可能是client嘗試向zookeeper上放超過(guò)1M的數(shù)據(jù)時(shí),出現(xiàn)的。
想修改這個(gè)默認(rèn)配置,則可以修改"jute.maxbuffer"這個(gè)環(huán)境變量。參考:http://zookeeper.apache.org/doc/r3.3.3/zookeeperAdmin.html
但是我們線上是因?yàn)槎丝趻呙韫ぞ咴斐傻?,這個(gè)就相當(dāng)?shù)卦幃惲?。停止端口掃描工具之后,就沒(méi)有這個(gè)問(wèn)題了。
watches數(shù)量多的問(wèn)題:
dubbo對(duì)于每個(gè)結(jié)點(diǎn)都會(huì)watch,導(dǎo)致watch數(shù)很多,隨便都幾千個(gè)。
用wchs,wchc,wchp這些命令可以查看watches的信息,包括總數(shù),每條路徑上的watch的數(shù)量。每個(gè)client的。
查找不能成功啟動(dòng)原因:
zookeeper會(huì)有很多原因啟動(dòng)不成功,可以通過(guò):
./zkServer.sh start-foreground
來(lái)查看啟動(dòng)時(shí)報(bào)的是什么異常,同時(shí)也可以查看運(yùn)行過(guò)程中的異常。
另外,通過(guò):
./zkServer.sh print-cmd
可以查看zookeeper啟動(dòng)的各個(gè)參數(shù),包括java路徑等,也可以便于查找問(wèn)題。
配置自動(dòng)清理日志:
從3.4.0開(kāi)始,會(huì)自動(dòng)清理日志了,所以這個(gè)通常不用配置。
配置autopurge.snapRetainCount 和 autopurge.purgeInterval 參數(shù)。
保留的snapshop的數(shù)量,默認(rèn)是3個(gè),最小也是3.
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
參考這里:http://nileader.blog.51cto.com/1381108/932156
另外要注意的是,zookeeper重啟會(huì)自動(dòng)清除zookeeper.out日志,所以如果出錯(cuò)要注意先備份這個(gè)文件。
配置zookeeper.out的位置及l(fā)og4j滾動(dòng)日志輸出
今天發(fā)現(xiàn)線上的bin/zookeeper.out 居然有6G大小??戳讼聑kServer.sh的代碼,這個(gè)zookeeper.out實(shí)際上是nohup的輸出。
而nohup的輸出實(shí)際上是stdout,stderr的輸出,所以還是zookeepe本身的日志配置的問(wèn)題。
研究了下bin/zkServer.sh和conf/log4j.properties,發(fā)現(xiàn)zookeeper其實(shí)是有日志相關(guān)的輸出的配置,只要定義相關(guān)的變量就可以了。
主要是ZOO_LOG_DIR和ZOO_LOG4J_PROP這兩個(gè)環(huán)境變量:
zkServer.sh里的:
if [ ! -w "ZOO_LOG_DIR"
fi
_ZOO_DAEMON_OUT="$ZOO_LOG_DIR/zookeeper.out"
nohup $JAVA "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
-cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &
log4j.properties里的:
Add ROLLINGFILE to rootLogger to get log file output
Log DEBUG level and above messages to a log file
log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLINGFILE.Threshold={zookeeper.log.dir}/${zookeeper.log.file}
而zkServer.sh會(huì)加載zkEnv.sh。
因此,其實(shí)修改下bin/zkEnv.sh就可以了:
https://gist.github.com/hengyunabc/61d74672e7a662a5366c
if [ "xZOOBINDIR/../logs"
fi
if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
ZOO_LOG4J_PROP="INFO,ROLLINGFILE"
fi
還可以修改下conf/log4j.properties,設(shè)置滾動(dòng)日志最多為10個(gè):
Max log file size of 10MB
log4j.appender.ROLLINGFILE.MaxFileSize=10MB
uncomment the next line to limit number of backup files
log4j.appender.ROLLINGFILE.MaxBackupIndex=10
Too many connections from 錯(cuò)誤
這個(gè)錯(cuò)誤是因?yàn)橥粋€(gè)IP的zookeeper socket 連接數(shù)大于60了。zookeeper server默認(rèn)限制每個(gè)IP最多60個(gè)連接。
這個(gè)在測(cè)試服務(wù)器上出現(xiàn)的,因?yàn)闇y(cè)試服務(wù)器上太多進(jìn)程在跑了。。
修改為:
maxClientCnxns=150
http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_advancedConfiguration
This ZooKeeper instance is not currently serving requests 的錯(cuò)誤提示
當(dāng)集群里的結(jié)點(diǎn)只剩下一臺(tái),或者不足半數(shù)時(shí),就會(huì)出現(xiàn)這個(gè)錯(cuò)誤提示。
通常在,只啟動(dòng)第一臺(tái)zookeeper時(shí)會(huì)報(bào)這個(gè)錯(cuò)誤。
在zookeeper server的日志里,會(huì)有類(lèi)似的日志:
Exception causing close of session 0x0 due to java.io.IOException: ZooKeeperServer not running
Zookeeper連接速度很慢,Dubbo初始化很慢,應(yīng)用啟動(dòng)很慢的問(wèn)題
發(fā)現(xiàn)線下環(huán)境遷移到新機(jī)器后,應(yīng)用啟動(dòng)變得很慢,本來(lái)十幾秒啟動(dòng)的應(yīng)用,變成幾分鐘才能啟動(dòng)。
啟動(dòng)過(guò)程沒(méi)有報(bào)錯(cuò),只是Dubbo的注冊(cè)信息日志一直在比較慢地刷。
開(kāi)始懷疑是網(wǎng)絡(luò)問(wèn)題,但是檢查了iptables沒(méi)有開(kāi)啟,用iptraf查看流量,也不高。機(jī)器的空閑內(nèi)存也足夠。
再檢查Zookeeper的配置,磁盤(pán)的空間,應(yīng)用的dubbo配置,jvm配置,發(fā)現(xiàn)都沒(méi)有問(wèn)題。
沒(méi)辦法了,用jprofiler來(lái)測(cè)試下,發(fā)現(xiàn)“org.I0Itec.zkclient.ZkClient$1.call”,這個(gè)調(diào)用耗時(shí)比較大。
這樣確認(rèn)是zookeeper本身比較慢,不是應(yīng)用的問(wèn)題。
用下面的zookeeper benchmark工具測(cè)試了下性能,發(fā)現(xiàn)read速度還可能,create/write速度非常慢,qps只有個(gè)位數(shù)。
于是問(wèn)了下運(yùn)維的同事,原來(lái)新機(jī)器是用共享磁盤(pán)的,所以速度很慢。
而zookeeper每次write請(qǐng)求都要寫(xiě)到log日志,并刷到磁盤(pán)里,所以非常的慢。
后來(lái)運(yùn)維的同事?lián)Q為本地磁盤(pán),一切恢復(fù)正常。
管理工具:
Zookeeper官方自帶的管理員工具:
http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html 官方的命令行工具可以勝任絕大部分工作了。
zktop
https://github.com/phunt/zktop python寫(xiě)的小工具,很有意思
taokeeper
項(xiàng)目地址:https://github.com/alibaba/taokeeper
淘寶出品的一個(gè)監(jiān)控工具,還有可以用腳本來(lái)監(jiān)控的功能。雖然開(kāi)源了,但是實(shí)際上很難用,代碼也很難擴(kuò)展,而且有些jar包是淘寶內(nèi)部的。
我修改了下,可以正常使用,代碼地址在:https://github.com/hengyunabc/taokeeper
但是我們線上也沒(méi)有用這個(gè),線上只有zabbix的監(jiān)控。
安裝配置參考:
編譯
1.下載這兩個(gè)項(xiàng)目:
git clone https://github.com/hengyunabc/common-toolkit.git
git clone https://github.com/nileader/zkclient.git
先分別執(zhí)行 mvn -Dmaven.test.skip install
2.下載本項(xiàng)目:
git clone https://github.com/hengyunabc/taokeeper.git
執(zhí)行 mvn -Dmaven.test.skip clean package
到taokeeper-monitor/target/目錄就可以看到生成的War包了。
部署
taokeeper使用mysql數(shù)據(jù)庫(kù)來(lái)保存一些配置和日志。
導(dǎo)入taokeeper-build/etc/taokeeper.sql 文件,也可以從這里下載:文件:Taokeeper.sql.zip 。
配置tomcat啟動(dòng)參數(shù),增加JVM啟動(dòng)參數(shù):
JAVA_OPTS=-DconfigFilePath="~/taokeeper/taokeeper-monitor-config.properties"
并在上面的配置中配置好參數(shù),例如:
systemInfo.envName=TEST
DBCP
dbcp.driverClassName=com.mysql.jdbc.Driver
dbcp.dbJDBCUrl=jdbc:mysql://localhost:3306/taokeeper
dbcp.characterEncoding=GBK
dbcp.username=root
dbcp.password=root
dbcp.maxActive=30
dbcp.maxIdle=10
dbcp.maxWait=10000
SystemConstant
SystemConstent.dataStoreBasePath=~/taokeeper/
SSH account of zk server
SystemConstant.userNameOfSSH=hello
SystemConstant.passwordOfSSH=hello
其中SSH用戶(hù)密碼要配置對(duì),zookeeper部署的機(jī)器要開(kāi)放SSH服務(wù)。
把生成的War包改為ROOT.war,放到tomcat的webapps目錄下,啟動(dòng)tomcat。
如果報(bào)log4j錯(cuò)誤,則還要配置webapps/ROOT/WEB-INF/classes/log4j.properties 文件。也可以在編繹前先修改好。
打開(kāi) http://localhost:8080/ ,就可以看到taokeeper的界面了。
工作原理
taokeeper通過(guò)SSH連接到zookeeper部署的機(jī)器上,再在上面執(zhí)行zookeeper的Four Letter Words來(lái)得到統(tǒng)計(jì)信息,再分析保存到mysql數(shù)據(jù)庫(kù)中。
參考:http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html#sc_zkCommands
監(jiān)控目標(biāo)機(jī)器的負(fù)載,也是通過(guò)SSH連接到目標(biāo)機(jī)器,再執(zhí)行top等命令,再分析得到數(shù)據(jù)。
注意事項(xiàng)
在chrome瀏覽器下,“機(jī)器監(jiān)控”這個(gè)功能有時(shí)會(huì)把信息顯示下瀏覽器的下面,要拉到最后才能看到,并不是這個(gè)功能不能工作。
Exhibitor
這個(gè)是Netflix出品的一個(gè)監(jiān)控工具,但實(shí)際上也很難用。。
Exhibitor的主要功能 監(jiān)控本機(jī)的Zookeeper服務(wù),可以自動(dòng)重啟掛掉的Zookeeper服務(wù);
定期備份數(shù)據(jù);
定期清理Zookeeper日志;
提供了一個(gè)Web界面可以修改Zookeeper的數(shù)據(jù);
REST API。
Exhibitor安裝
Exhibitor提供了三種運(yùn)行方式:獨(dú)立的jar文件,War包,core jar。推薦用jar方式運(yùn)行,配置管理都很方便。
安裝方法可以參考這里:https://github.com/Netflix/exhibitor/wiki/Building-Exhibitor,也可以從這里下載已經(jīng)編繹好的jar文件:文件:Exhibitor-war-1.0-jar-with-dependencies.zip,下載后要修改后綴為jar。
運(yùn)行
java -jar <path>/exhibitor-xxx.jar -c file
Exhibitor自動(dòng)創(chuàng)建配置文件,在web界面所做的配置更改都會(huì)保存到exhibitor.properties中。
配置項(xiàng)
參考:https://github.com/Netflix/exhibitor/wiki/Configuration-UI
在配置“Servers”參數(shù)時(shí),一定要注意要配置的是hostname,而不是IP。所以如果配置的是IP的話,一定要到目標(biāo)機(jī)器上去檢查hostname和IP是否一致。
注意事項(xiàng)
Exhibitor通過(guò)jps命令來(lái)判斷Zookeeper服務(wù)是否運(yùn)行,所以要配置好jps命令,如果沒(méi)有當(dāng)前沒(méi)有jps命令的話,可以通過(guò)類(lèi)似如下的命令創(chuàng)建一個(gè)軟鏈接:
ls -s /home/www/jdk/jdk1.7.0_15/bin/jps /usr/bin/jps
Exhibitor會(huì)自動(dòng)創(chuàng)建并覆蓋zookeeper的配置文件,所以要在Web界面上把Zookeeper的所有參數(shù)都配置,
否則如果Zookeeper被Exhibitor重啟后,可以會(huì)出現(xiàn)因?yàn)榕渲糜绣e(cuò)誤而無(wú)法啟動(dòng)的狀況。
在“control panel”面板中,當(dāng)顯示綠色,則說(shuō)明Zookeeper服務(wù)正常,可以對(duì)外服務(wù),當(dāng)顯示黃色或者紅色,
則Zookeeper不能對(duì)外提供服務(wù)(這個(gè)和Zookeeper進(jìn)程是否存在,是兩個(gè)概念,即使Zookeeper進(jìn)程存在,也可能無(wú)法對(duì)外提供服務(wù))。
Exhibitor會(huì)定時(shí)探測(cè)Zookeeper服務(wù)是否正常,但是時(shí)間間隔默認(rèn)配置為0,這個(gè)會(huì)導(dǎo)致機(jī)器CPU被消耗。要在Web界面中配置好“Live Check (ms)”參數(shù)。
因?yàn)镋xhibitor如果探測(cè)到Zookeeper服務(wù)沒(méi)有啟動(dòng),會(huì)自動(dòng)啟動(dòng)Zookeeper進(jìn)程,所以在升級(jí)Zookeeper之前,要先停掉Exhibitor。
其它的一些東東:
性能測(cè)試相關(guān):
https://github.com/brownsys/zookeeper-benchmark
這個(gè)工具輸出結(jié)果比較亂,不過(guò)用起來(lái)還不錯(cuò)。
mvn -DZooKeeperVersion=3.4.5 package
./runBenchmark.sh test
然后在test文件夾下,會(huì)有生成的信息。主要在zk-benchmark.log這個(gè)文件里。
http://zookeeper.apache.org/doc/r3.4.5/zookeeperOver.html
http://wiki.apache.org/hadoop/ZooKeeper/ServiceLatencyOverview 自帶的文檔里有一點(diǎn),不過(guò)貌似沒(méi)更新過(guò)
http://wiki.apache.org/hadoop/ZooKeeper/ServiceLatencyOverview Hadoop里帶的一個(gè)測(cè)試
https://ramcloud.stanford.edu/wiki/display/ramcloud/ZooKeeper+Performance
http://rdc.taobao.com/team/jm/archives/1070 淘寶的一個(gè)測(cè)試
作者:橫云斷嶺
來(lái)源:CSDN
原文:https://blog.csdn.net/hengyunabc/article/details/19006911
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!