1. 前言
每一次搭建集群環(huán)境都像一次戰(zhàn)斗,作戰(zhàn)中任何一個細(xì)節(jié)的出錯都會導(dǎo)致嚴(yán)重的后果灵疮,所以搭建中所需要做的配置如系統(tǒng)配置织阅、網(wǎng)絡(luò)配置(防火墻記得關(guān))、用戶權(quán)限震捣、文件權(quán)限還有配置文件等等內(nèi)容荔棉,都必須非常仔細(xì)闹炉,將失誤扼殺在搖籃之中,避免因?yàn)榇中幕蛘呦胍岣咚俣仁∠碌囊环昼娙笥#诤竺娓冻鰩讉€小時的調(diào)試時間渣触,因小失大實(shí)在不值,切記核對壹若、核對再核對嗅钻。
今天就來說說在搭建ZooKeeper集群遇到的一個常見的問題Connection refused,也就是網(wǎng)上很多朋友也會出現(xiàn)的問題店展,問題的表現(xiàn)也許是一樣养篓,但是導(dǎo)致問題的原因卻不盡相同,所以要重視自己的log文件報的錯誤赂蕴,再確認(rèn)外部大環(huán)境沒有的情況下柳弄,集中力量解決log中的錯誤。
2. 我的問題
下面是我在搭建集群時報的錯:
這是表面上錯誤
2016-12-08 05:11:07,890 [myid:1] - WARN ?[QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@382] - Cannot open channel to 5 at election address lzx15/192.168.80.175:3888
java.net.ConnectException: Connection refused
? ? ? ?at java.net.PlainSocketImpl.socketConnect(Native Method)
? ? ? ?at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
? ? ? ?at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
? ? ? ?at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
? ? ? ?at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
? ? ? ?at java.net.Socket.connect(Socket.java:579)
? ? ? ?at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:368)
? ? ? ?at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:402)
? ? ? ?at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:840)
? ? ? ?at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:762)
? ? ? ?at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
? ? ? ?at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
? ? ? ?at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
? ? ? ?at java.net.Socket.connect(Socket.java:579)
? ? ? ?at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:368)
? ? ? ?at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:402)
? ? ? ?at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:840)
? ? ? ?at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:762)
這是實(shí)際上的錯誤
java.io.FileNotFoundException: /home/hadoop/data/zookeeper/zkdata/version-2/acceptedEpoch.tmp(Permissoin denied)
3. 其他人的解決方案:
主要為以下兩點(diǎn):
1)防火墻沒關(guān)導(dǎo)致通訊失敗概说,無法連接到其他節(jié)點(diǎn)上碧注,我在反復(fù)檢查之后確認(rèn)防火墻已全部關(guān)閉,所以這個方法對我的問題無效
命令行:
chkconfig iptables off (關(guān)閉防火墻)
service iptables status(查看防火墻狀態(tài))
2)配置文件問題
a. /zookeeper/conf/zoo.cfg文件配置問題
例如dataDir格式不對糖赔,或者沒有創(chuàng)建dataDir指定的文件等等萍丐,所以細(xì)心地檢查你的配置文件,至于這個文件的內(nèi)容請大家自行百度挂捻。
b. dataDir指定的目錄下創(chuàng)建myid文件碉纺,然后再文件寫上你在zoo.cfg中該節(jié)點(diǎn)的對應(yīng)server號,例如server.1刻撒,那么myid中就寫1骨田。
4. 我的解決方案
找到zookeeper的log文件zookeeper.out在哪里?正常的路徑是 你的zookeper安裝目錄/zookeeper.out声怔,我在這個zookeeper.out只能找到那個表面的錯誤即Connection refused态贤,所以一直找不到問題,最后我在無意中發(fā)現(xiàn)
[hadoop@lzx11 hadoop]$ cd /home/hadoop
[hadoop@lzx11 ~]$ ls
app ?data ?tools ?zookeeper.out
我在這個zookeeper.out中找到我問題的真實(shí)錯誤醋火,/home/hadoop/data/zookeeper/zkdata/version-2/acceptedEpoch.tmp(Permissoin denied)悠汽,所以我去查看了verison-2文件夾的權(quán)限,發(fā)現(xiàn)他居然是root用戶的芥驳,我立刻把它轉(zhuǎn)到hadoop用戶下柿冲,然后再重新啟動集群,三個節(jié)點(diǎn)啟動成功兆旬。
5. 總結(jié)
很多時候我們都會去針對遇到的表面問題來尋找解決思路假抄,但是很多問題只是因?yàn)槠渌胤匠隽藛栴}導(dǎo)致的,所以在你認(rèn)為找到解決目前這個問題的方法后卻仍然沒有能解決問題的時候,想想會不會在前面某個地方出錯宿饱,去別的地方找找答案熏瞄,記住,鑰匙一般不在鎖里面谬以。