基于docker-compose来搭建zookeeper集群

Linux下Docker搭建Zookeeper集群及数据同步验证

在任务开始之前,我们应该要在虚拟机上面把docker给部署好,具体的部署教程可以看看我之前发的文章。

在linux虚拟机上面配置Docker时所踩过的坑-CSDN博客

在确保自己的docker已经部署成功以后,先使用 systemctl start docker 命令来启动docker,然后就可以开始下面的内容了。

(注意前两步为搭建zookeeper集群的教程,后两步为使用zkCli.sh验证zookeeper数据的同步性。)

1.安装docker-compose(这里我们选择使用pyhton的pip下载)

(1)使用 yum 包管理工具安装 python3-pip-y 选项表示自动确认安装操作。pip 是 Python 包管理工具,用于安装和管理 Python 软件包。

yum -y install python3-pip

(2)通过 pip3 升级 pip 到最新版本。-i 后面的 URL 指定了 PyPI 镜像源(清华镜像源),这是为了加速安装和下载 Python 包,因为国内访问默认的 PyPI 源可能会比较慢。

pip3 install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple

(3)通过 pip3 安装 docker-composedocker-compose 是 Docker 的一个工具,允许你定义和管理多个 Docker 容器的应用。这个命令同样指定了清华大学的 PyPI 镜像源。

pip3 install docker-compose -i https://pypi.tuna.tsinghua.edu.cn/simple

(4)最后查看一下docker-compose是否安装成功,顺便看一下版本。

docker-compose version

如果安装成功,应该显示类似下面这样的内容

[root@node2 ~]# docker-compose version
/usr/local/lib/python3.6/site-packages/paramiko/transport.py:32: CryptographyDeprecationWarning: Python 3.6 is no longer supported by the Python core team. Therefore, support for it is deprecated in cryptography. The next release of cryptography will remove support for Python 3.6.
  from cryptography.hazmat.backends import default_backend
docker-compose version 1.29.2, build unknown
docker-py version: 5.0.3
CPython version: 3.6.8
OpenSSL version: OpenSSL 1.0.2k-fips  26 Jan 2017

2.开始搭建zookeeper集群

(1)先使用docker拉取zookeeper:3.4.14镜像。

(我这里的zookeeper没有拉取最新版的,因为如果拉取最新版的话可能会报错,我之前在配的时候因为没有指定zookeeper的版本,结果默认拉取最新版的,结果后来就报错了)

详见文章:zookeeper 最近的发行版大坑_client port not found in static config file. looki-CSDN博客

docker pull zookeeper:3.4.14

接着可以使用 docker images 命令来查看是否拉取成功,正如下面信息所显示的,已经拉取成功了。

[root@node2 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
zookeeper    3.4.14    4b03fe5b3f64   3 years ago   260MB
[root@node2 ~]# 

(2)先cd回到根目录,再在根目录新建docker-compose.yml文件

(其实这里的文件路径无所谓,我只是为了方便所以创建在了这里)

vim docker-compose.yml

先按 i 进入insert模式,然后往文件里面粘贴如下内容

version: '2'
networks:
  zk:
services:
  zookeeper1:
    image: zookeeper:3.4.14
    container_name: zk1.cloud
    networks:
        - zk
    ports:
        - "2181:2181"
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=zk2.cloud:2888:3888 server.3=zk3.cloud:2888:3888
  zookeeper2:
    image: zookeeper:3.4.14
    container_name: zk2.cloud
    networks:
        - zk
    ports:
        - "2182:2181"
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=zk1.cloud:2888:3888 server.2=0.0.0.0:2888:3888 server.3=zk3.cloud:2888:3888
  zookeeper3:
    image: zookeeper:3.4.14
    container_name: zk3.cloud
    networks:
        - zk
    ports:
        - "2183:2181"
    environment:
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=zk1.cloud:2888:3888 server.2=zk2.cloud:2888:3888 server.3=0.0.0.0:2888:3888

记得保存并且退出。

(3)后台启动 zookeeper 集群

docker-compose up -d

如果成功,应该显示如下内容 

[root@node2 ~]# docker-compose up -d
/usr/local/lib/python3.6/site-packages/paramiko/transport.py:32: CryptographyDeprecationWarning: Python 3.6 is no longer supported by the Python core team. Therefore, support for it is deprecated in cryptography. The next release of cryptography will remove support for Python 3.6.
  from cryptography.hazmat.backends import default_backend
Creating network "root_zk" with the default driver
Creating zk1.cloud ... done
Creating zk2.cloud ... done
Creating zk3.cloud ... done

接着使用 docker ps 命令用于列出当前正在运行的 Docker 容器

[root@node2 ~]# docker ps
CONTAINER ID   IMAGE              COMMAND                   CREATED              STATUS              PORTS                                                           NAMES
6dbef33904d8   zookeeper:3.4.14   "/docker-entrypoint.…"   About a minute ago   Up About a minute   2888/tcp, 3888/tcp, 0.0.0.0:2183->2181/tcp, :::2183->2181/tcp   zk3.cloud
68b24f470c0f   zookeeper:3.4.14   "/docker-entrypoint.…"   About a minute ago   Up About a minute   2888/tcp, 3888/tcp, 0.0.0.0:2182->2181/tcp, :::2182->2181/tcp   zk2.cloud
ee5d5bad93b1   zookeeper:3.4.14   "/docker-entrypoint.…"   About a minute ago   Up About a minute   2888/tcp, 0.0.0.0:2181->2181/tcp, :::2181->2181/tcp, 3888/tcp   zk1.cloud
[root@node2 ~]# 

好的,做到这一步,zookeeper集群算是搭建成功了。

3.第四步前的准备工作:熟悉一下zookeeper的一些简单命令

(1)在根目录创建节点

其实在别的目录创建也行,比如create /parent_dir/new_node "data",这会尝试在 /parent_dir 下创建 new_node 节点。如果 parent_dir 不存在,你需要先创建它:

create /parent_dir ""
create /parent_dir/new_node "data"

create /new_node "data"

(2)查看某个节点的数据

get /node_name

(3)设置(修改)某个节点的数据

set /node_name "new_data"

(4)删除一个节点

delete /node_name

(5)查看根目录下的所有节点

ls /

4.使用zkCli.sh验证zookeeper数据的同步性

做这一个任务前最好在Finalshell中打开三个node2的窗口类似下面这样,这样后面好进入三个容器内进行操作。

Finalshell的具体安装以及使用教程详见这篇文章:

保姆级教程下载finalshell以及连接云服务器基础的使用教程_finalshell下载安装-CSDN博客

(1)在上图中第一个窗口进入zk1.cloud并且启动zkCli.sh

依次输入如下命令:

# 使用 Docker exec 命令进入名为 zk1.cloud 的容器,并启动交互式 shell
docker exec -it zk1.cloud /bin/bash

# 进入容器内的 /bin 目录,通常 Zookeeper 的可执行文件存放在这个目录下
cd bin/

# 列出 /bin 目录下的文件,查看是否包含 zkCli.sh 等可执行文件
ls

# 执行 zkCli.sh 脚本,进入 Zookeeper 命令行客户端(zkCli.sh 是 Zookeeper 提供的命令行客户端工具)
./zkCli.sh

效果大致如下:

[root@node2 ~]# docker exec -it zk1.cloud /bin/bash
root@ee5d5bad93b1:/zookeeper-3.4.14# cd bin/
root@ee5d5bad93b1:/zookeeper-3.4.14/bin# ls
README.txt  zkCleanup.sh  zkCli.cmd  zkCli.sh  zkEnv.cmd  zkEnv.sh  zkServer.cmd  zkServer.sh  zkTxnLogToolkit.cmd  zkTxnLogToolkit.sh
root@ee5d5bad93b1:/zookeeper-3.4.14/bin# ./zkCli.sh
Connecting to localhost:2181
2024-11-15 12:50:28,092 [myid:] - INFO  [main:Environment@100] - Client environment:zookeeper.version=3.4.14-4c25d480e66aadd371de8bd2fd8da255ac140bcf, built on 03/06/2019 16:18 GMT
2024-11-15 12:50:28,100 [myid:] - INFO  [main:Environment@100] - Client environment:host.name=ee5d5bad93b1
2024-11-15 12:50:28,100 [myid:] - INFO  [main:Environment@100] - Client environment:java.version=1.8.0_292
2024-11-15 12:50:28,104 [myid:] - INFO  [main:Environment@100] - Client environment:java.vendor=Oracle Corporation
2024-11-15 12:50:28,106 [myid:] - INFO  [main:Environment@100] - Client environment:java.home=/usr/local/openjdk-8
2024-11-15 12:50:28,106 [myid:] - INFO  [main:Environment@100] - Client environment:java.class.path=/zookeeper-3.4.14/bin/../zookeeper-server/target/classes:/zookeeper-3.4.14/bin/../build/classes:/zookeeper-3.4.14/bin/../zookeeper-server/target/lib/*.jar:/zookeeper-3.4.14/bin/../build/lib/*.jar:/zookeeper-3.4.14/bin/../lib/slf4j-log4j12-1.7.25.jar:/zookeeper-3.4.14/bin/../lib/slf4j-api-1.7.25.jar:/zookeeper-3.4.14/bin/../lib/netty-3.10.6.Final.jar:/zookeeper-3.4.14/bin/../lib/log4j-1.2.17.jar:/zookeeper-3.4.14/bin/../lib/jline-0.9.94.jar:/zookeeper-3.4.14/bin/../lib/audience-annotations-0.5.0.jar:/zookeeper-3.4.14/bin/../zookeeper-3.4.14.jar:/zookeeper-3.4.14/bin/../zookeeper-server/src/main/resources/lib/*.jar:/conf:
----(省略大部分冗余内容)
Welcome to ZooKeeper!
2024-11-15 12:50:28,183 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1025] - Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2024-11-15 12:50:28,769 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@879] - Socket connection established to localhost/127.0.0.1:2181, initiating session
2024-11-15 12:50:29,164 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1299] - Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x100003655d60000, negotiated timeout = 30000

WATCHER::

WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0] 

(2)在上图中第二个窗口进入zk2.cloud并且启动zkCli.sh

依次输入如下命令:

# 使用 Docker exec 命令进入名为 zk2.cloud 的容器,并启动交互式 shell
docker exec -it zk2.cloud /bin/bash

# 进入容器内的 /bin 目录,通常 Zookeeper 的可执行文件存放在这个目录下
cd bin/

# 列出 /bin 目录下的文件,查看是否包含 zkCli.sh 等可执行文件
ls

# 执行 zkCli.sh 脚本,进入 Zookeeper 命令行客户端(zkCli.sh 是 Zookeeper 提供的命令行客户端工具)
./zkCli.sh

效果大致如下:

[root@node2 ~]# docker exec -it zk2.cloud /bin/bash
root@68b24f470c0f:/zookeeper-3.4.14# cd bin/
root@68b24f470c0f:/zookeeper-3.4.14/bin# ls
README.txt  zkCleanup.sh  zkCli.cmd  zkCli.sh  zkEnv.cmd  zkEnv.sh  zkServer.cmd  zkServer.sh  zkTxnLogToolkit.cmd  zkTxnLogToolkit.sh
root@68b24f470c0f:/zookeeper-3.4.14/bin# ./zkCli.sh
Connecting to localhost:2181
2024-11-15 12:57:59,261 [myid:] - INFO  [main:Environment@100] - Client environment:zookeeper.version=3.4.14-4c25d480e66aadd371de8bd2fd8da255ac140bcf, built on 03/06/2019 16:18 GMT
2024-11-15 12:57:59,271 [myid:] - INFO  [main:Environment@100] - Client environment:host.name=68b24f470c0f
2024-11-15 12:57:59,271 [myid:] - INFO  [main:Environment@100] - Client environment:java.version=1.8.0_292
2024-11-15 12:57:59,277 [myid:] - INFO  [main:Environment@100] - Client environment:java.vendor=Oracle Corporation
2024-11-15 12:57:59,277 [myid:] - INFO  [main:Environment@100] - Client environment:java.home=/usr/local/openjdk-8
----(省略大部分冗余内容)
Welcome to ZooKeeper!
2024-11-15 12:57:59,390 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1025] - Opening socket connection to server localhost/0:0:0:0:0:0:0:1:2181. Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2024-11-15 12:57:59,733 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@879] - Socket connection established to localhost/0:0:0:0:0:0:0:1:2181, initiating session
2024-11-15 12:57:59,818 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1299] - Session establishment complete on server localhost/0:0:0:0:0:0:0:1:2181, sessionid = 0x200003655dd0000, negotiated timeout = 30000

WATCHER::

WatchedEvent state:SyncConnected type:None path:null

(3)在上图中第三个窗口进入zk3.cloud并且启动zkCli.sh

依次输入如下命令:

# 使用 Docker exec 命令进入名为 zk3.cloud 的容器,并启动交互式 shell
docker exec -it zk3.cloud /bin/bash

# 进入容器内的 /bin 目录,通常 Zookeeper 的可执行文件存放在这个目录下
cd bin/

# 列出 /bin 目录下的文件,查看是否包含 zkCli.sh 等可执行文件
ls

# 执行 zkCli.sh 脚本,进入 Zookeeper 命令行客户端(zkCli.sh 是 Zookeeper 提供的命令行客户端工具)
./zkCli.sh

效果大致如下:

[root@node2 ~]# docker exec -it zk3.cloud /bin/bash
root@6dbef33904d8:/zookeeper-3.4.14# cd bin/
root@6dbef33904d8:/zookeeper-3.4.14/bin# ls
README.txt  zkCleanup.sh  zkCli.cmd  zkCli.sh  zkEnv.cmd  zkEnv.sh  zkServer.cmd  zkServer.sh  zkTxnLogToolkit.cmd  zkTxnLogToolkit.sh
root@6dbef33904d8:/zookeeper-3.4.14/bin# ./zkCli.sh
Connecting to localhost:2181
2024-11-15 13:01:14,174 [myid:] - INFO  [main:Environment@100] - Client environment:zookeeper.version=3.4.14-4c25d480e66aadd371de8bd2fd8da255ac140bcf, built on 03/06/2019 16:18 GMT
2024-11-15 13:01:14,180 [myid:] - INFO  [main:Environment@100] - Client environment:host.name=6dbef33904d8
2024-11-15 13:01:14,183 [myid:] - INFO  [main:Environment@100] - Client environment:java.version=1.8.0_292
2024-11-15 13:01:14,188 [myid:] - INFO  [main:Environment@100] - Client environment:java.vendor=Oracle Corporation
2024-11-15 13:01:14,189 [myid:] - INFO  [main:Environment@100] - Client environment:java.home=/usr/local/openjdk-8
----(省略大部分冗余内容)
Welcome to ZooKeeper!
JLine support is enabled
2024-11-15 13:01:14,277 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1025] - Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
2024-11-15 13:01:14,637 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@879] - Socket connection established to localhost/127.0.0.1:2181, initiating session
2024-11-15 13:01:14,726 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1299] - Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x300003655e70000, negotiated timeout = 30000

WATCHER::

WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0] 

(4)在zk1.cloud的根目录创建结点my ,值为zhangsan

[zk: localhost:2181(CONNECTED) 5] create /my zhangsan
Created /my

接着在zk2.cloud和zk3.cloud查看结点my

zk2.cloud

[zk: localhost:2181(CONNECTED) 0] get /my
zhangsan
cZxid = 0x100000007
ctime = Fri Nov 15 13:05:58 UTC 2024
mZxid = 0x100000007
mtime = Fri Nov 15 13:05:58 UTC 2024
pZxid = 0x100000007
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 0
[zk: localhost:2181(CONNECTED) 1] 

zk3.cloud

[zk: localhost:2181(CONNECTED) 0] get /my
zhangsan
cZxid = 0x100000007
ctime = Fri Nov 15 13:05:58 UTC 2024
mZxid = 0x100000007
mtime = Fri Nov 15 13:05:58 UTC 2024
pZxid = 0x100000007
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 0
[zk: localhost:2181(CONNECTED) 1] 

(5)在在zk1.cloud上修改结点my 的值,修改后的值为Lisi

[zk: localhost:2181(CONNECTED) 6] set /my Lisi
cZxid = 0x100000007
ctime = Fri Nov 15 13:05:58 UTC 2024
mZxid = 0x100000008
mtime = Fri Nov 15 13:10:04 UTC 2024
pZxid = 0x100000007
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0

接着在zk2.cloud和zk3.cloud查看结点my

zk2.cloud

[zk: localhost:2181(CONNECTED) 1] get /my
Lisi
cZxid = 0x100000007
ctime = Fri Nov 15 13:05:58 UTC 2024
mZxid = 0x100000008
mtime = Fri Nov 15 13:10:04 UTC 2024
pZxid = 0x100000007
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0
[zk: localhost:2181(CONNECTED) 2] 

zk3.cloud

[zk: localhost:2181(CONNECTED) 1] get /my
Lisi
cZxid = 0x100000007
ctime = Fri Nov 15 13:05:58 UTC 2024
mZxid = 0x100000008
mtime = Fri Nov 15 13:10:04 UTC 2024
pZxid = 0x100000007
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0
[zk: localhost:2181(CONNECTED) 2] 

(5)在zk1.cloud上删除结点my 

[zk: localhost:2181(CONNECTED) 1] delete /my

接着在zk2.cloud和zk3.cloud查看结点my

zk2.cloud

[zk: localhost:2181(CONNECTED) 2] get /my
Node does not exist: /my

zk3.cloud

[zk: localhost:2181(CONNECTED) 2] get /my
Node does not exist: /my

5.总结

到了这一步,可以说zookeeper数据的同步性已经被我们成功验证了。

"感谢您的耐心阅读,至此,所有问题已基本解答,感谢您的关注与支持!"

6.参考文章:

1.

centos7安装docker和compose_centos7 安装docker-compose-CSDN博客

2.

1分钟搞定,通过docker-compose 搭建zookeeper 集群实验环境(非生产环境)-CSDN博客

3.

zookeeper 最近的发行版大坑_client port not found in static config file. looki-CSDN博客

4.

Zookeeper集群搭建 & 数据同步性测试_zk如何检查从节点数据是否同步完成-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值