本文環境如下:
操作系統:CentOS 6 32位
ZooKeeper版本:3.4.8
Zookeeper需要JDK1.6以上版本的Java環境
可以參考:
CentOS 6使用rpm方式安裝JDK8
到ZooKeeper官網上http://zookeeper.apache.org/下載軟件包,例如:
wget "http://apache.opencas.org/zookeeper/stable/zookeeper-3.4.8.tar.gz"
tar -xzvf zookeeper-3.4.8.tar.gz
mv zookeeper-3.4.8 /opt
cd /opt/zookeeper-3.4.8/conf/
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
Zookeeper提供了一份默認的配置文件,復制為zoo.cfg打開後,我們需要修改數據存放的路徑:
dataDir=/opt/zookeeper-3.4.8/data
cd /opt/zookeeper-3.4.8/bin/
./zkServer.sh start
如果運行無報錯,說明Zookeeper啟動成功了。
為了以後操作方便,我們可以將Zookeeper/bin添加到path
vi /etc/profile
在末尾添加:
ZOOKEEPER_HOME=/opt/zookeeper-3.4.8
PATH=$PATH:$ZOOKEEPER_HOME/bin
更新配置:
source /etc/profile
單機模式非常方便,適合開發、測試場景,但是在生產環境中,應該運行一個集群模式。集群模式至少應該有3個節點,並且強烈建議是奇數個節點,每個節點應該有相同的配置文件。
cd /opt/zookeeper-3.4.8/conf/
vi zoo.cfg
打開後,修改為:
tickTime=2000
dataDir=/opt/zookeeper-3.4.8/data
clientPort=2181
initLimit=5
syncLimit=2
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
server後面跟的數字就是該節點的標號,我們需要將這個編號寫入名為myid的文件。該文件應該存放在前面配置的dataDir指向的目錄下。
例如上面的slave1節點,對應的data/myid文件中應該寫入2。
scp -r /opt/zookeeper-3.4.8 root@slave1:/opt/
scp -r /opt/zookeeper-3.4.8 root@slave2:/opt/
拷貝完成後,記得修改對應服務器的myid文件。
需要到每個節點上啟動Zookeeper服務,每個節點啟動後可以用zkServer.sh status查看當前節點的啟動狀態以及是leader節點還是follower節點。
運行日志文件默認在程序目錄下的zookeeper.out。
2016-04-13 05:18:21,531 [myid:1] - WARN [WorkerSender[myid=1]:QuorumCnxManager@400] - Cannot open channel to 2 at election address slave1/5.2.8.5:3888
java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:381)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:354)
at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.process(FastLeaderElection.java:452)
at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.run(FastLeaderElection.java:433)
at java.lang.Thread.run(Thread.java:745)
出現這個異常,可能是zookeeper節點的防火牆是開啟狀態並且沒有打開相應端口(2888,3888);也可能是有節點未啟動或者掛掉了。