简介
Zookeeper 是 一个分布式。开放源码的分布式应用程序协调服务,是Google Chubby的一个开源实现,大多数的分布式应用都需要Zookeeper的支持,这篇文章先简单的和大家分享如何搭建一个zookeeper集群。(笔者注:Chubby是一个lock service,通过这个lock service可以解决分布式中的一致性问题。为这个lock service的实现是一个分布式的文件系统。
环境: 由于我是用自己的笔记本做实验,所以就用了一台虚拟机;其实和真实的差不多;也就配置有些许不同。
这是我的虚拟机版本
步骤
第一步:在你的虚拟机上安装JDK/JRE ;
第二步:下载zookeeper:http://mirrors.hust.edu.cn/apache/zookeeper/
这边下载版本的需要注意了。3.4.6 和3.4.8+ 是有区别的,后面具体说一下,建议下载3.4.8+。
第三步:创建相关目录,解压zk 目录和日志目录。
mkdir /tools/zookeeper/zookeeper-3.4.6/server1
mkdir /tools/zookeeper/zookeeper-3.4.6/server2
mkdir /tools/zookeeper/zookeeper-3.4.6/server3
mkdir /data/dataLogs/zookeeper/s1
mkdir /data/dataLogs/zookeeper/s2
mkdir /data/dataLogs/zookeeper/s3
第四步:上传安装包到服务器到 server1 目录;
第五步: 解压使用 “tar -xzvf zookeeper-3.4.8.tar.gz “来 解压安装包 。
解压后的目录如下:
zookeeper 解压目录
第五步:修改zookeeper配置文件(集群和数据目录的配置)
使用“cp zoo_sample.cfg zoo.cfg”来创建一个zookeeper配置文件,在zoo.cfg中配置syncLimit,dataDir,clientPort,autopurge.purgeInterval,以及集群的server list
这几个参数主要是注意一下:
dataDir zk 的放置一下数据的目录如版本号,id 等等,所以每一个节点都区分一下如,/data/dataLogs/zookeeper/s1;
clientPort 接受客户端请求的端口,每个节点都需要不一样。如:2181
server.X 这个数字就是对应 data/myid中的数字。你在3个server的myid文件中分别写入了1,2,3,那么每个server中的zoo.cfg都配server.1,server.2,server.3就OK了。因为在同一台机器上,后面连着的2个端口3个server都不要一样,否则端口冲突,其中第一个端口用来集群成员的信息交换,第二个端口是在leader挂掉时专门用来进行选举leader所用。
具体的文件,我会附在附件中。
好了,现在一个节点已经配置好了,其他就使用cp 命令直接复制到server2 ,server3 下;主要需要更改clientPort dataDir.
第六步: 创建myid 文件,分别在dataDir 设置的目录下创建myid,里面内容填写server.X 中的X 就好,比如我上面写的1,2,3;
到这一步之后基本就完成了配置,现在我们来启动看看。
使用命令 :
./zkServer.sh start
./ zkServer.sh status
好了已经启动。已经成功了!
注意:如果你是第一启动,看到日志里面报错类似下面的:
[myid:2] - WARN [WorkerSender[myid=2]:[email protected]] - Cannot open channel to 3 at election address /127.0.0.1:3890
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.toSend(QuorumCnxManager.java:341)
at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.process(FastLeaderElection.java:449)
at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.run(FastLeaderElection.java:430)
at java.lang.Thread.run(Thread.java:745)
不要担心,这个只是其他节点没有开启,它在尝试连接而已。把其他节点都启动了,就可以了。
下面讲一下我在部署伪集群过程出的错,真的是郁闷死了。。
我刚开始下载的3.4.6 版本的zk ,下载后也是按照上述的步骤配置后,一直报:
Error: Could not find or load main class org.apache.zookeeper.server.quorum.
一直说找不到这类,开始我还以为是jdk 版本的问题,但是我想也不对啊。这类明显是zk 自己的啊,我就去目录下找了一下;发现3.4.6 目录加压后是没有lib 和 zookeeper-3.4.x.jar.
所以如果你下载的是3.4.6以下的版本的,需要手动加,火车票在服务器上下载这些资源。
原文地址:http://blog.51cto.com/13952955/2176170