困而学,学而知
最近在学习Zookeeper, 既然要学习Zookeeper,首先要需要搭建一个Zookeeper的环境.这里只讲怎么搭建,不会具体说具体原理.
我最开始搭建的是只有一个实例的Zookeeper服务. 然后开始搭建一个单机伪集群(因为我只有一台主机). 在搭建只有一个实例的Zookeeper实例的服务的时候,我是使用docker来搭建的. 本来也是想用docker来搭建这个伪集群的,但是我尝试了一天, 始终都报错,并且都没有找到原因…(也是心累)算了,还是用最简单的方式来搭建了单机伪集群.
搭建只有一个实例的Zookeeper服务是很简单的.
一. 使用docker搭建Zookeeper服务
1. 在docker hub
上找到zookeeper
的官方镜像, 并拉取官方镜像.
docker pull zookeeper
之前拉取过镜像, 就截图镜像列表啦.
2. 启动Zookeeper镜像, 将容器的2181映射到主机的2181端口
docker run --privileged=true -d --name myzk --publish 2181:2181 -d zookeeper
3. 来查看启动日志
> docker logs -f myzk
--------------------------------
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
2019-07-01 16:38:15,150 [myid:] - INFO [main:QuorumPeerConfig@133] - Reading configuration from: /conf/zoo.cfg
...
2019-07-01 16:38:15,365 [myid:1] - INFO [main:NIOServerCnxnFactory@686] - binding to port /0.0.0.0:2181
2019-07-01 16:38:15,387 [myid:1] - INFO [main:ZKDatabase@117] - zookeeper.snapshotSizeFactor = 0.33
2019-07-01 16:38:15,391 [myid:1] - INFO [main:FileTxnSnapLog@372] - Snapshotting: 0x0 to /data/version-2/snapshot.0
2019-07-01 16:38:15,396 [myid:1] - INFO [main:FileTxnSnapLog@372] - Snapshotting: 0x0 to /data/version-2/snapshot.0
2019-07-01 16:38:15,418 [myid:1] - INFO [main:ContainerManager@64] - Using checkIntervalMs=60000 maxPerMinute=10000
4. Zookeeper是有一个客户端的, 我们可以使用--link
来链接到容器的客户端
docker run -it --rm --link myzk:zookeeper zookeeper zkCli.sh -server zookeeper
至此, 我使用docker
搭建了一个只有一个实例的Zookeeper服务. 在这个过程中没有报错十分顺利. 想着一鼓作气使用docker来搭建一个伪集群(友链: 使用 Docker 一步搞定 ZooKeeper 集群的搭建),但是总是事与愿违, 搞了一天都没有搞出来, 气煞我也,换成了最简单的方式来搭建集群.
二. 使用官方包来搭建Zookeeper服务
首先当然是要从官网下载包啦.Download
这里我想说一句,我本来是下载最新版本3.5.5的,但是运行的时候居然报错, 后面会讲讲报错情况.
- 将zookeeper-3.4.14.tar.gz解压到文件夹(我的是/usr/local/apache/zookeeper)
- 进入解压目录下的
conf/
文件夹, 使用cp zoo_sample.cfg zoo.cfg
, 创建一个zoo.cfg
配置文件.因为Zookeeper的默认配置文件就是这个zoo.cfg
这个文件 - 后退进入解压目录下的
bin/
文件夹, 使用sh zkServer.sh start
启动Zookeeper文件. - 继续在
bin/
目录下,可以中sh zkCli.sh
使用客户端 - 最后使用结束后, 用
sh zkServer.sh stop
关闭Zookeeper.
三. 搭建Zookeeper单机伪集群
因为本人只有一台主机, 想想要搭建一个最少三台的Zookeeper集群,还是算了吧.但条条大路通罗马, 事情总是有解决办法的. 我的解决的办法就是在一个单机上通过不同的端口搭建一个伪集群.
1. 创建文件夹
为了搭建一个伪集群, 我们现在本地目录下创建三个目录. 我的是在/usr/local/apache/zookeeper
我们在/usr/local/apache/zookeeper
这个目录下创建一个tmp
的目录用于保存Zookeeper的data和log.
## /usr/local/apache/zookeeper
mkdir tmp
cd tmp
## 在tmp目录下创建`zk1/data`, `zk1/log`, `zk2/data`, `zk2/log`, `zk3/data`, `zk3/log`
mkdir zk1 zk2 zk3
mkdir zk1/data zk1/log zk2/data zk2/log zk3/data zk3/log
2. 解压zookeeper-3.4.14.tar.gz
进入到存有zookeeper-3.4.14.tar.gz
的目录, 执行下面的指令
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
tar -xvf zookeeper-3.4.14.tar.gz -C /usr/local/apache/zookeeper/
cd /usr/local/apache/zookeeper/
cp -rf zookeeper-3.4.14 zookeeper-1
cp -rf zookeeper-3.4.14 zookeeper-2
cp -rf zookeeper-3.4.14 zookeeper-3
rm -rf zookeeper-3.4.14
3. 配置zoo.cfg
进入上面图片中的conf/
目录下
cp zoo_sample.cfg zoo.cfg
将下面的内容复制到zoo.cfg中
3.1. zookeeper-1下的zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/apache/zookeeper/tmp/zk1/data
dataLogDir=/usr/local/apache/zookeeper/tmp/zk1/log
clientPort=2181
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389
3.2. zookeeper-2下的zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/apache/zookeeper/tmp/zk2/data
dataLogDir=/usr/local/apache/zookeeper/tmp/zk2/log
clientPort=2182
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389
3.3. zookeeper-3下的zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/apache/zookeeper/tmp/zk3/data
dataLogDir=/usr/local/apache/zookeeper/tmp/zk3/log
clientPort=2183
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389
4. 创建myid文件
这个配置很重要, 要配置集群的话,就必须要配置. 在zoo.cfg
中配置了dataDir
.在dataDir
的目录下, 创建一个myid
的文件, 文件内容为集群id
. 比如zookeeper-1
下的myid
内容就是1
, zookeeper-2
下的myid
内容就是2
, zookeeper-3
下的myid
内容就是3
.
5. 启动集群
现在配置好了,直接启动就好了.
/usr/local/apache/zookeeper/zookeeper-1/bin/zkServer.sh start
/usr/local/apache/zookeeper/zookeeper-2/bin/zkServer.sh start
/usr/local/apache/zookeeper/zookeeper-3/bin/zkServer.sh start
5.1. 查看状态
/usr/local/apache/zookeeper/zookeeper-1/bin/zkServer.sh status
6. 关闭集群
/usr/local/apache/zookeeper/zookeeper-1/bin/zkServer.sh stop
/usr/local/apache/zookeeper/zookeeper-2/bin/zkServer.sh stop
/usr/local/apache/zookeeper/zookeeper-3/bin/zkServer.sh stop
一个一个启动太麻烦了, 我创建了两个简单的脚本startZookeeper.sh
和stopZookeeper.sh
- startZookeeper.sh
/usr/local/apache/zookeeper/zookeeper-1/bin/zkServer.sh start
/usr/local/apache/zookeeper/zookeeper-2/bin/zkServer.sh start
/usr/local/apache/zookeeper/zookeeper-3/bin/zkServer.sh start
- stopZookeeper.sh
/usr/local/apache/zookeeper/zookeeper-1/bin/zkServer.sh stop
/usr/local/apache/zookeeper/zookeeper-2/bin/zkServer.sh stop
/usr/local/apache/zookeeper/zookeeper-3/bin/zkServer.sh stop
四. 问题记录
1. 错误: 找不到或无法加载主类 org.apache.zookeeper.server.quorum.QuorumPeerMain
问题: 我使用zookeeper-3.5.5.tar.gz
的时候, 发现启动不起来, 每次启动都是报这个错误. 在网上查阅资料发现是少了jar包, 进入目录一看,发现果然没有jar包. 重新下了一次也没有, 我就果断换成了zookeeper-3.4.14.tar.gz
这个版本.
2. 使用docker安装时候,报错as it does not belong to the default network.
查看当前的network
docker network ls
或
docker inspect [容器名]
最后宣传一下自己无人问津的个人网站http://meisen.pro