使用 docker 快速启动本地 ZooKeeper 集群

文章配图

前言

ZooKeeper ,翻译过来就是:动物园管理员,而这也是它 logo 的由来。它是一个为分布式应用提供一致性服务的软件,是大数据场景下的一个重要的基础组件。所以安装 ZooKeeper,也是入门学习大数据的第一步。

曾几何时,我们在学习大数据技术的时候,总是先在本地环境启动虚拟机应用,然后开始初始化虚拟机配置和环境,紧接着开始安装软件。此时如果需要模拟一些集群环境,还需要进行大量重复的苦不堪言的配置工作。

今天我们便利用 Docker 来快速的在本地启动一个 ZooKeeper 环境。

实操

环境

自行在本机安装 Docker 和 Docker Compose 软件,如果网络环境差的,可以配置阿里的镜像源地址,本文不再赘述。

寻找合适的镜像

前往 镜像仓库 可以很轻松的搜索到 ZooKeeper,发现已经提供了 官方镜像,美滋滋,省去了我们鉴别镜像甚至自己封装镜像的步骤。

启动单机版 ZooKeeper

你可以简单的执行下面的命令运行一个单节点的 ZooKeeper,这里我们选择目前最新的 3.7.0 版本。

1
$ docker run -d -p 2181:2181 --name dev-zk zookeeper:3.7.0

此时你就得到了一个单机版的 ZooKeeper,这里更推荐使用 Compose 的方式把参数持久化到文件中,方便后续调整为集群模式。

1
2
3
4
5
6
7
version: '3.8'

services:
zookeeper:
image: zookeeper:3.7.0
ports:
- 2181:2181

将上述内容保存为 docker-compose.yml 文件之后,在命令行执行:

1
$ docker-compose up -d

注意:这里你也可以不加 -d 参数,观察启动日志,方便排查问题,确保没问题后,下次再加上 -d 参数进行后台运行

启动集群版 ZooKeeper

这里我们利用 Docker Compose 的 Services 网络互通的特性,来组成一个集群。

修改上面的 Compose 文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
version: '3.8'

services:
zoo1:
image: zookeeper:3.7.0
hostname: zoo1
ports:
- 2181:2181
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181

zoo2:
image: zookeeper:3.7.0
hostname: zoo2
ports:
- 2182:2181
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zoo3:2888:3888;2181

zoo3:
image: zookeeper:3.7.0
hostname: zoo3
ports:
- 2183:2181
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181

在命令行执行 docker-compose up 启动,观察启动日志。

此时你就得到了一个 3 个节点的 ZooKeeper 集群,分别暴露在本机环境的 2181/2182/2183 端口。

其他

有些小伙伴在运行 spring-boot-demo 项目的 demo-zookeeper 模块时,出现了获取不到集群地址的错误,提了相关 ISSUE,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
2021-04-14 15:52:18.630 ERROR 23630 --- [ain-EventThread] o.a.c.f.imps.CuratorFrameworkImpl        : Background exception was not retry-able or retry gave up

java.lang.NullPointerException: null
at org.apache.curator.utils.Compatibility.getHostAddress(Compatibility.java:116) ~[curator-client-5.1.0.jar:na]
at org.apache.curator.framework.imps.EnsembleTracker.configToConnectionString(EnsembleTracker.java:185) ~[curator-framework-5.1.0.jar:5.1.0]
at org.apache.curator.framework.imps.EnsembleTracker.processConfigData(EnsembleTracker.java:206) ~[curator-framework-5.1.0.jar:5.1.0]
at org.apache.curator.framework.imps.EnsembleTracker.access$300(EnsembleTracker.java:50) ~[curator-framework-5.1.0.jar:5.1.0]
at org.apache.curator.framework.imps.EnsembleTracker$2.processResult(EnsembleTracker.java:150) ~[curator-framework-5.1.0.jar:5.1.0]
at org.apache.curator.framework.imps.CuratorFrameworkImpl.sendToBackgroundCallback(CuratorFrameworkImpl.java:892) [curator-framework-5.1.0.jar:5.1.0]
at org.apache.curator.framework.imps.CuratorFrameworkImpl.processBackgroundOperation(CuratorFrameworkImpl.java:649) [curator-framework-5.1.0.jar:5.1.0]
at org.apache.curator.framework.imps.WatcherRemovalFacade.processBackgroundOperation(WatcherRemovalFacade.java:152) [curator-framework-5.1.0.jar:5.1.0]
at org.apache.curator.framework.imps.GetConfigBuilderImpl$2.processResult(GetConfigBuilderImpl.java:222) [curator-framework-5.1.0.jar:5.1.0]
at org.apache.zookeeper.ClientCnxn$EventThread.processEvent(ClientCnxn.java:630) [zookeeper-3.6.0.jar:3.6.0]
at org.apache.zookeeper.ClientCnxn$EventThread.run(ClientCnxn.java:551) [zookeeper-3.6.0.jar:3.6.0]

解决方式如下:

  1. 在本机配置 hosts 文件,推荐使用 SwitchHosts! 软件配置。
1
127.0.0.1 zoo1 zoo2 zoo3
  1. 修改 Curator 连接 ZooKeeper 集群地址,通过 hostname 方式连接上 ZooKeeper。
1
2
- 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183
+ zoo1:2181,zoo2:2182,zoo3:2183

此时该问题就可以解决了。

-------------本文结束  感谢您的阅读-------------
xkcoding wechat
欢迎来我的公众号「xkcoding小凯扣丁」逛逛
o(╯□╰)o 赞助一杯咖啡 ~~