本文环境如下: 操作系统:CentOS 6 32位 ZooKeeper版本:3.4.8
0. 环境需求
Zookeeper需要JDK1.6以上版本的Java环境 可以参考: CentOS 6使用rpm方式安装JDK8
1. 下载软件包
到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
123
2. 单机模式
2.1 修改配置文件
cd /opt/zookeeper-
3.4.8/conf/
cp zoo_sample
.cfg zoo
.cfg
vi zoo
.cfg
123
Zookeeper提供了一份默认的配置文件,复制为zoo.cfg打开后,我们需要修改数据存放的路径:
dataDir=/opt/zookeeper-
3.4.8/
data
1
2.2 运行Zookeeper
cd /opt/zookeeper-
3.4.
8/bin/
./zkServer.sh start
12
如果运行无报错,说明Zookeeper启动成功了。 为了以后操作方便,我们可以将Zookeeper/bin添加到path
vi /etc/profile
1
在末尾添加:
ZOOKEEPER_HOME=
/opt/zookeeper-
3.4.
8
PATH=
$PATH:$ZOOKEEPER_HOME/bin
12
更新配置:
source /etc/profile
1
3. 集群模式
单机模式非常方便,适合开发、测试场景,但是在生产环境中,应该运行一个集群模式。集群模式至少应该有3个节点,并且强烈建议是奇数个节点,每个节点应该有相同的配置文件。
3.1 修改配置文件
cd /opt/zookeeper-
3.4.
8/conf/
vi zoo.cfg
12
打开后,修改为:
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
12345678
server后面跟的数字就是该节点的标号,我们需要将这个编号写入名为myid的文件。该文件应该存放在前面配置的dataDir指向的目录下。 例如上面的slave1节点,对应的data/myid文件中应该写入2。
3.2 拷贝文件夹
scp -r /opt/zookeeper-
3.4.
8 root
@slave1:/opt/
scp -r /opt/zookeeper-
3.4.
8 root
@slave2:/opt/
12
拷贝完成后,记得修改对应服务器的myid文件。
3.3 启动服务
需要到每个节点上启动Zookeeper服务,每个节点启动后可以用zkServer.sh status查看当前节点的启动状态以及是leader节点还是follower节点。
4. 异常分析
运行日志文件默认在程序目录下的zookeeper.out。
4.1 无法连接
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)
12345678910111213
出现这个异常,可能是zookeeper节点的防火墙是开启状态并且没有打开相应端口(2888,3888);也可能是有节点未启动或者挂掉了。