大家好,我是程序员小罗,这是我的技术学习笔记。

起因

由于最近在学习zookeeper的原理,所以需要在安装一个集群来实验一些特性加深理解。

但是问题来了,我们作为个人学习者,要搭建集群又没有那么多机器,要么就是搭建伪集群,或者就是需要安装一个虚拟机软件(比如vmWare),装多个虚拟机。 这两种方法我之前都试过,都不太理想,一个需要改端口,一种需要安装很多虚拟机,而且换了电脑也不好迁移。每次都得搞重复的配置,实现是太令人烦恼了;

目标

综上,上述的痛点,都不是我们愿意做的。接下来,就要介绍今天我用的神器:Docker

使用Docker 基本上不用我们装环境之类的配置,比如安装 jdk。现在我们直接可以从镜像仓库拉别人制作好的镜像,简直不要太方便,直接运行即可。

今天我要搭建的是一个由四台 zk 构成的 zk 集群,其中一台为 Leader,两台 Follower,一台 Observer。

talk is cheap,show me your code, 接着往下看吧!


实战

不管你现在用的windows 还是linux 系统,首先你需要安装好Docker环境。 这里就不在叙述了,官网下载安装即可。

如果对Docker 基本操作不熟悉的话,可以看我之前写的 Docker入门(镜像、容器、仓库)

PS: 本次所制作的镜像,可以直接保存到自己的私服,以后随时随地直接拉取运行即可。一次制作,到处运行

私服的搭建也可以看我之前写的Docker入门。

获取镜像

docker pull zookeeper:3.4.11 这里我选择了3.4.11 版本。

设置docker固定ip

因为我们要搭建的是集群环境,所以ip地址必须固定,因此需要自定义一种网络类型。

创建自定义网络类型,并且指定网段

sudo docker network create --subnet=192.168.0.0/24 staticnet

通过docker network ls可以查看到网络类型中多了一个 staticnet

使用新的网络类型创建并启动容器

chong@L MINGW64 ~
$ docker run --name zookeeper-1 --restart always --net staticnet --ip 192.168.0.10 -d zookeeper:3.4.11
61a331b2584b6ef949e2183892c5a73a2e214b7071d4879993f7cbba41c836ed

通过docker inspect可以查看容器 ip为192.168.0.10,关闭容器并重启,发现容器ip并未发生改变。

进入容器进行配置

由于容器在后台运行,因此我们需要进入容器,有三种方式,有兴趣的可以看我之前写的 Docker入门(镜像、容器、仓库)

$ docker exec -ti 61a bash   # 61a为容器id

登入后,我们只需要做2件事:

  1. 修改zoo.cfg

在 zoo.cfg 文件中添加 zk 集群节点列表

bash-4.4# vi /conf/zoo.cfg
clientPort=2181
dataDir=/data
dataLogDir=/datalog
tickTime=2000
initLimit=5
syncLimit=2
maxClientCnxns=60
server.1=192.168.0.10:2888:3888
server.2=192.168.0.11:2888:3888
server.3=192.168.0.12:2888:3888
server.4=192.168.0.13:2888:3888:observer
  1. 创建 myid 文件

在一步的zoo.cfg文件中我们可以看到dataDir的路径,在/data 目录中创建表示当前主机编号的 myid 文件。该主机编号要与 zoo.cfg 文件中设置的编号一致。

bash-4.4# echo 1 > /data/myid

保存修改后的镜像

因为我们上面对正在运行的容器做了三点修改,这也正是我们需要的集群配置,所以我们要将这个容器制作成镜像,如下操作:

$ docker commit -m "create zk1" -a "coderluo" 61a zookeeper-1:3.4.11
sha256:455b27d32c83365790b7b6eff7d58021556858390d28d27b07aca206e83c507c

chong@L MINGW64 ~
$ docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
zookeeper-1                  3.4.11              455b27d32c83        8 seconds ago       146MB
39.108.186.135:5000/ubuntu   v1                  a2a15febcdf3        13 days ago         64.2MB
zookeeper                    3.4.11              56d414270ae3        19 months ago       146MB

使用docekr commit 进行基于已有的镜像进行创建,我的上一篇Docker入门中也有写。然后通过docker images 查看到zookeeper-1 这个镜像已经存在了。

到这里一台镜像已经制作好了,接下来就是一样的事情重复干几遍:

  • 进入容器
  • 修改myid
  • 保存修改制作为新镜像

查询容器id

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                          NAMES
61a331b2584b        zookeeper:3.4.11    "/docker-entrypoint.…"   About an hour ago   Up 12 minutes       2181/tcp, 2888/tcp, 3888/tcp   zookeeper-1

进入容器执行修改(第2,3台都执行此操作):

$ docker exec -ti 61a bash
bash-4.4# echo 2 > /data/myid
bash-4.4# cat /data/myid
2
bash-4.4# exit
exit

创建新的镜像(第2,3台都执行此操作):

$ docker commit -m "create zookeeper-2" -a "coderluo" 61a zookeeper-2:3.4.11
sha256:c775aff13fd3b2fc30066f6fc5f8a5ee429be3052b790c8e02cf74b5e4bf71e9

完成后,这里要注意,第四台主机因为我们要让他作为Observer,所以他需要在zoo.cfg中增加一行配置:

peerType=observer





docker安装zookeeper集群端口已被占用 docker搭建zookeeper集群_docker


1.png


然后在执行上面和第2,3台机器一样的操作。

最后我们查看当前所有的镜像,不出意外的话下图展示的你也都有了:



docker安装zookeeper集群端口已被占用 docker搭建zookeeper集群_Docker_02


2.png


到这里,今天的学习就要接近尾声了,最后一步

依次启动4台zookeeper实例

直接按照我下面的命令一次执行即可:

chong@L MINGW64 ~
$  docker run --name zookeeper-1 --restart always --net staticnet --ip 192.168.0.10 -d zookeeper-1:3.4.11 #第一台
35acd4f798c8154047f30af184145d8b4124ec8a4e8e4a549db0d333a1c33785
chong@L MINGW64 ~
$  docker run --name zookeeper-2 --restart always --net staticnet --ip 192.168.0.11 -d zookeeper-2:3.4.11 #第二台
7ef30c809183dc223e42e891880ad8c85381fac11d15da5c0455400b915c77bb

chong@L MINGW64 ~
$  docker run --name zookeeper-3 --restart always --net staticnet --ip 192.168.0.12 -d zookeeper-3:3.4.11 #第三台
f138451dd21ce5217eb6e4472116b3ffa32e9ea2afbcaae44ee4d633040299f9
chong@L MINGW64 ~
$  docker run --name zookeeper-4 --restart always --net staticnet --ip 192.168.0.13 -d zookeeper-4:3.4.11 #第四台
c662d3438db74414c9b0178bc756b6cf96cd0458cbc226e8854da4a06337d656

查看运行状态:

$ docker ps -a
CONTAINER ID        IMAGE                COMMAND                  CREATED              STATUS              PORTS                          NAMES
c662d3438db7        zookeeper-4:3.4.11   "/docker-entrypoint.…"   6 seconds ago        Up 4 seconds        2181/tcp, 2888/tcp, 3888/tcp   zookeeper-4
f138451dd21c        zookeeper-3:3.4.11   "/docker-entrypoint.…"   24 seconds ago       Up 23 seconds       2181/tcp, 2888/tcp, 3888/tcp   zookeeper-3
7ef30c809183        zookeeper-2:3.4.11   "/docker-entrypoint.…"   41 seconds ago       Up 39 seconds       2181/tcp, 2888/tcp, 3888/tcp   zookeeper-2
35acd4f798c8        zookeeper-1:3.4.11   "/docker-entrypoint.…"   About a minute ago   Up About a minute   2181/tcp, 2888/tcp, 3888/tcp   zookeeper-1

总结

至此我们今天要搭建的四台zk实例组成的集群已经搞定了,有没有感觉到有了Docker 简直是神奇啊,只有亲身体会下才能感觉他的便利。

欢迎在留言区讨论,今天就到这里啦,可以愉快的学习第zk的底层原理了。

Docker 入门基础知识,可以看我整理的这篇文章:

Docker入门(镜像、容器、仓库)