Zookeeper問題集
1.啟動zookeeper后出現(xiàn)noClassFound等等錯誤,例如:
- Exception in thread "main" java.lang.NoSuchMethodError: method java.lang.management.ManagementFactory.getPlatformMBeanServer with signature ()Ljavax.management.MBeanServer; was not found.
- at org.apache.zookeeper.jmx.ManagedUtil.registerLog4jMBeans(ManagedUtil.java:48)
- at org.apache.zookeeper.server.quorum.QuorumPeerMain.runFromConfig(QuorumPeerMain.java:114)
- at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:103)
- at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:7
可能原因是該服務器的jdk版本不正確,或是環(huán)境變量未設置好。
例如,原來的linux下已經(jīng)裝有jdk-1.4,然后又安裝了新版本的jdk-1.6,我們按照網(wǎng)上教程的步驟安裝好zookeeper并設置環(huán)境變量后,
echo $JAVA_HOME顯示java-1.6,
但是用java -version命令發(fā)現(xiàn),仍然顯示java-1.4,說明環(huán)境變量未配好。zookeeper讀取的jdk版本仍然是舊版本的jdk-1.4。
解決方法是在/etc/bashrc文件的末尾,
- export JAVA_HOME=/usr/java/jdk1.6.0_23
- export JRE_HOME=$JAVA_HOME/jre
- export PATH=$JAVA_HOME/bin:$PATH
- //這里要注意,應該將$PATH放在尾部而不是放在頭部,網(wǎng)上有安裝教程寫的是$PATH :$JAVA_HOME/bin,這樣zookeeper讀取的將是$PATH中的jdk舊版本而出錯。
- export CLASSPATH=.:$JAVA_HOME/lib/*.jar
2.當一臺或某臺機器反復出現(xiàn)cannot open channel to xxxx:2888/3888,報錯(例如無法與leader進行同步等等錯誤),無法完成選舉(這個錯誤以前一直有出現(xiàn),但是時有時無,不知道為什么)。
可能原因是防火墻開啟,導致某臺機器的端口不能開啟,一般是2888不能開啟。linux下的很多分布式應用會要求關閉防火墻。。。所以還是干脆關閉算了。今天把防火墻直接關閉后zookeeper啟動正常。
用命令service iptables status查看,顯示一系列消息,表示防火墻處于開啟狀態(tài);可以用service iptables stop關閉防火墻。但是這個只是臨時關閉防火墻。
要使系統(tǒng)啟動時不自動啟動防火墻,則可以使用命令chkconfig –list iptables查看防火墻信息,chkconfig iptables off關閉防火墻。以后若要打開,用chkconfig iptables on命令。
ps今天早上來看發(fā)現(xiàn)防火墻又開啟了,貌似不管用。還是用以下三條命令關閉。
- chkconfig --level 35 iptables off
- /etc/init.d/iptables stop
- iptables -P INPUT DROP
3. Zookeeper能夠正常啟動,但是顯示如下錯誤:
- Starting zookeeper…
- ./zkServer.sh: line 80: /home /sysdata/zookeeper/zookeeper-data/zookeeper_server.pid: No such file or directory
- STARTED
在配置文件zoo.cfg文件中指定了zookeeper啟動的pid文件的生成位置:dataDir=/home /sysdata/zookeeper/zookeeper-data,但是我們發(fā)現(xiàn)該pid并沒有生成。而且想要停止zookeeper顯然也不能成功:
- Stopping zookeeper ...
- error: could not find file /zookeeper_server.pid。
請教大牛之后,這個讓我頭疼很久的問題,終于解決了。。。
原來是我的zoo.cfg文件中的給dataDir路徑賦值前多了一個空格!zookeeper在讀取此配置文件時會把空格也讀進文件名(腳本咋這不智能呢),將此空格刪去后zookeeper啟動、關閉就正常了!
轉(zhuǎn)載:http://www.aboutyun.com/thread-7483-1-1.html
4、Zookeeper:“Error contacting service. It is probably not running.”
問題:
Zookeeper配置集群后,啟動會報“Error contacting service. It is probably not running.”
原因:
1、上一次啟動時port被占用
- [root@test58 bin]# netstat -ptnl |grep 2181
- tcp 0 0 :::2181 :::* LISTEN 9907/java
2、只啟動了一臺zk,沒辦法形成集群
3、集群之間的節(jié)點通信不了
解決:
- 殺死已經(jīng)存在的進程
- 啟動集群的其他機器
- 查找不能通信的原因(防火墻,zk配置文件等)
5、zookeeper的API報錯問題
問題:
- KeeperErrorCode=ConnectionLoss for /servers
原因:
api中連接zookeeper的時候使用的ip,如:192.168.111.111,而不是域名,如:zk1,在大數(shù)據(jù)生態(tài)圈的api中,對ip的支持并不是很好,所以一般建議使用域名,使用ip會出現(xiàn)奇怪的bug。
解決:
將ip修改為域名
【本文為51CTO專欄作者“王森豐”的原創(chuàng)稿件,轉(zhuǎn)載請注明出處】