在任务开始之前,我们应该要在虚拟机上面把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-compose
。docker-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.