下载
- 下载地址
https://archive.apache.org/dist/zookeeper/
从这里选择适合自己的版本,由于我这里使用的是cdh
版本的,所以我这里的下载地址是http://archive.cloudera.com/cdh5/cdh/5/
从这里选择对应的cdh版本,然后使用wget 选择的版本的下载地址
命令加上下载地址进行下载。注意:这里虽然两个版本不一样,但是在集群安装的方式是没有什么大区别的!
安装
- 安装包解压
tar -zxvf zookeeper-3.4.5-cdh5.10.0.tar.gz -C /opt/modules/
配置
- 复制配置文件
进入到解压目录,我这里的解压目录是/opt/modules/zookeeper-3.4.5-cdh5.10.0/
,然后进入到conf
目录下,执行cp zoo_sample.cfg ./zoo.cfg
复制好配置文件 - 新建目录。用于存放数据的目录。默认在
/tmp
目录下,/tmp
目录对数据具有不安全性。所以我这里为了方便测试,直接把数据目录放在了/opt/modules/zookeeper-3.4.5-cdh5.10.0/
这目录下,使用mkdir -p zkData/tmp
建立两层目录,这里的目录名称,层级可以随意, - 配置
conf/zoo.cfg
文件
vim /conf/zoo.cfg
打开文件。修改下dataDir=/tmp/zookeeper
这个目录文件的地址为刚创建文件的地址dataDir=/opt/modules/zookeeper-3.4.5-cdh5.10.0/zkData/tmp
,增加目录多台机器的地址和端口
server.1=bigdata1.com:2888:3888
server.2=bigdata2.com:2888:3888
server.3=bigdata3.com:2888:3888
这里简单说明下server.x
:server.x其实是列举的集群中zookeeper服务器的地址。当启动服务是时。会去对应的server
中的dataDir
目录下寻找myid
文件。,每台机器的myid
文件中其实就是配置我们x
。 bigdata.com
这里可以写对应机器的ip
地址,我这里是在每台机器的hosts
文件中配置了对应关联的。
具体的的说明可以参考官方文档下给出的Wiki
- 在机器中的
dataDir
目录下新建一个名为myid
的文件,内容填写x
,这里的x
对应的server.x
。 - 把这台机器的文件分别同步到其他两台机器中去,可以使用
scp
命令进行同步 .ex:scp ./zookeeper-3.4.5-cdh5.10.0.tar.gz xxx@bigdata2.com:/opt/softwares/
- 修改其他两台机器上的
myid
文件,为对应的x
- 启动 从这三台机器中随机启动一台,
/opt/modules/zookeeper-3.4.5-cdh5.10.0/bin/zkServer.sh start
. 使用/opt/modules/zookeeper-3.4.5-cdh5.10.0/bin/zkServer.sh status
查看状态信息,会发现
JMX enabled by default
Using config: /opt/modules/zookeeper-3.4.5-cdh5.10.0/sbin/../conf/zoo.cfg
Error contacting service. It is probably not running.
在当前目录下出现的zookeeper.out
文件,使用less zookeeper.out
查看日志信息,
发现如下错误
2019-05-25 13:47:00,495 [myid:1] - INFO [main:QuorumPeer@444] - acceptedEpoch not found! Creating with a reasonable default of 0. This should only happen when you are upgrading your installation
2019-05-25 13:47:00,511 [myid:1] - INFO [Thread-1:QuorumCnxManager$Listener@486] - My election bind port: 0.0.0.0/0.0.0.0:3888
2019-05-25 13:47:00,532 [myid:1] - INFO [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumPeer@670] - LOOKING
2019-05-25 13:47:00,534 [myid:1] - INFO [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:FastLeaderElection@740] - New election. My id = 1, proposed zxid=0x0
2019-05-25 13:47:00,537 [myid:1] - INFO [WorkerReceiver[myid=1]:FastLeaderElection@542] - Notification: 1 (n.leader), 0x0 (n.zxid), 0x1 (n.round), LOOKING (n.state), 1 (n.sid), 0x0 (n.peerEPoch), LOOKING (my state)
2019-05-25 13:47:00,542 [myid:1] - WARN [WorkerSender[myid=1]:QuorumCnxManager@368] - Cannot open channel to 2 at election address bigdata2.com/192.168.31.252: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:354)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:327)
at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.process(FastLeaderElection.java:393)
at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.run(FastLeaderElection.java:365)
at java.lang.Thread.run(Thread.java:745)
2019-05-25 13:47:00,544 [myid:1] - WARN [WorkerSender[myid=1]:QuorumCnxManager@368] - Cannot open channel to 3 at election address bigdata3.com/192.168.31.253: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:354)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:327)
at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.process(FastLeaderElection.java:393)
at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.run(FastLeaderElection.java:365)
at java.lang.Thread.run(Thread.java:745)
2019-05-25 13:47:00,745 [myid:1] - WARN [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@368] - Cannot open channel to 2 at election address bigdata2.com/192.168.31.252: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:354)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:388)
at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:765)
at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:716)
大概意思是,不能连接到其他的两天服务器,为啥不能呢?相比原因不用多说。。其他服务器没有启动。在用同样的方式启动另外两台服务器/opt/modules/zookeeper-3.4.5-cdh5.10.0/bin/zkServer.sh start
然后使用less zookeeper.out
查看日志信息。会发现出现如下:
2019-05-25 13:49:05,196 [myid:1] - INFO [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxnFactory@197] - Accepted socket connection from /127.0.0.1:58191
2019-05-25 13:49:05,198 [myid:1] - INFO [NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxn@821] - Processing srvr command from /127.0.0.1:58191
2019-05-25 13:49:05,200 [myid:1] - INFO [Thread-3:NIOServerCnxn@1001] - Closed socket connection for client /127.0.0.1:58191 (no session established for client)
2019-05-25 13:49:16,835 [myid:1] - INFO [bigdata1.com/192.168.31.251:3888:QuorumCnxManager$Listener@493] - Received connection request /192.168.31.2
52:37842
2019-05-25 13:49:16,839 [myid:1] - INFO [WorkerReceiver[myid=1]:FastLeaderElection@542] - Notification: 2 (n.leader), 0x0 (n.zxid), 0x1 (n.round), LOOKING (n.state), 2 (n.sid), 0x0 (n.peerEPoch), FOLLOWING (my state)
2019-05-25 13:49:16,847 [myid:1] - INFO [WorkerReceiver[myid=1]:FastLeaderElection@542] - Notification: 3 (n.leader), 0x0 (n.zxid), 0x1 (n.round), LOOKING (n.state), 2 (n.sid), 0x0 (n.peerEPoch), FOLLOWING (my state)
会发现已经没有错误了。而且也会看到主和从的机器状态。
验证
- 查看每台机器的主从状态。
/opt/modules/zookeeper-3.4.5-cdh5.10.0/bin/zkServer.sh status
JMX enabled by default
Using config: /opt/modules/zookeeper-3.4.5-cdh5.10.0/sbin/../conf/zoo.cfg
Mode: follower
会看到只有一台机器的Mode: leader
,其他的都是Mode: follower
至此,zookeeper集群搭建完成