基于3.5.x 版本进行zookeeper 集群搭建

发布时间 2023-04-02 19:45:26作者: 油腻……

搭建 zk 3.5.x 版本的集群环境

本次搭建使用 3.5.7 版本的zk。

3.5.x 版本进行集群环境的搭建,本质其实和 3.4.x 是没有太大区别的。

但是 3.5.x 的集群环境支持动态的扩缩容,因此 在配置文件方面,将集群节点的配置单独抽取出来了,存放到一个 zoo.cfg.dynamic 的配置文件中。

解压安装包

本次使用 192.168.1.41、192.168.1.42、192.168.1.43、192.168.1.44 四台机器进行初始搭建。其中 192.168.1.44 机器节点为 observer 节点。

所谓的 observer 就是观察者。他参与到集群环境中,但是不会参与master 的竞争。

tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /usr/local/
# 192.168.1.41
drwxr-xr-x.  7 root root   146 4月   2 05:28 zookeeper3.5.7

# 192.168.1.42
drwxr-xr-x.  7 root root   146 4月   2 05:28 zookeeper3.5.7

# 192.168.1.43
drwxr-xr-x.  7 root root   146 4月   2 05:28 zookeeper3.5.7

# 192.168.1.44
drwxr-xr-x.  7 root root   146 4月   2 05:28 zookeeper3.5.7

zk 的目录结构

  • bin 目录:该目录中包含启动脚本,客户端连接的脚本等等。
  • conf 目录:主要是一些配置文件
drwxr-xr-x. 2  502 games   232 2月  10 2020 bin
drwxr-xr-x. 2  502 games   148 4月   2 05:29 conf
drwxr-xr-x. 5  502 games  4096 2月  10 2020 docs
drwxr-xr-x. 2 root root   4096 4月   2 05:01 lib
-rw-r--r--. 1  502 games 11358 9月  13 2018 LICENSE.txt
drwxr-xr-x. 2 root root     45 4月   2 05:28 logs
-rw-r--r--. 1  502 games   432 2月  10 2020 NOTICE.txt
-rw-r--r--. 1  502 games  1560 2月   7 2020 README.md
-rw-r--r--. 1  502 games  1347 2月   7 2020 README_packaging.txt
# bin 目录中的内容
-rwxr-xr-x. 1 502 games  232 5月   4 2018 README.txt
-rwxr-xr-x. 1 502 games 2067 2月   7 2020 zkCleanup.sh
-rwxr-xr-x. 1 502 games 1158 2月  10 2020 zkCli.cmd
-rwxr-xr-x. 1 502 games 1621 2月   7 2020 zkCli.sh
-rwxr-xr-x. 1 502 games 1766 2月   7 2020 zkEnv.cmd
-rwxr-xr-x. 1 502 games 3690 1月  31 2020 zkEnv.sh
-rwxr-xr-x. 1 502 games 1286 1月  31 2020 zkServer.cmd
-rwxr-xr-x. 1 502 games 4573 2月   7 2020 zkServer-initialize.sh
-rwxr-xr-x. 1 502 games 9386 2月   7 2020 zkServer.sh
-rwxr-xr-x. 1 502 games  996 10月  3 2019 zkTxnLogToolkit.cmd
-rwxr-xr-x. 1 502 games 1385 2月   7 2020 zkTxnLogToolkit.sh

# conf 目录中的内容
-rw-r--r--. 1 502 games  535 5月   4 2018 configuration.xsl
-rw-r--r--. 1 502 games 2712 2月   7 2020 log4j.properties
-rw-r--r--. 1 502 games  922 2月   7 2020 zoo_sample.cfg

zk 常用命令

# zk 服务启动
./zkServer.sh start

# zk 服务重启
./zkServer.sh restart

# zk 服务停止
./zkServer.sh stop

# zk 的状态
./zkServer.sh status

进行集群环境配置

以 192.168.1.41 节点为例。其他节点的配置只需要重复上面的步骤。

基于 zoo_sample.cfg 配置文件创建 zoo.cfg 文件

zoo_sample.cfg 配置文件是zk 提供给我们的一个样例文件,我们需要根据该文件创建 一个 zoo.cfg 文件。

zoo.cfg 文件才是 zk 服务启动时所加载的真正的配置文件。

cp zoo_sample.cfg zoo.cfg
# 配置一些超时时间参数
tickTime=2000
initLimit=10
syncLimit=5

# 配置data 数据文件的目录
dataDir=/zookeeper

# 配置客户端连接的端口
clientPort=2181

根据配置文件中的配置,创建 对应的目录。

mkdir /zookeeper

进行myid 文件的配置

cd /zookeeper
echo 1 >myid

创建集群的节点配置文件 zoo.cfg.dynamic

# 创建一个 zoo.cfg.dynamic 文件
touch zoo.cfg.dynamic

# 编辑 zoo.cfg.dynamic 该文件,该文件中就是配置我们的集群中各个节点信息。
server.1=192.168.1.41:2888:3888
server.2=192.168.1.42:2888:3888
server.3=192.168.1.43:2888:3888
server.4=192.168.1.44:2888:3888:observer

zoo.cfg.dynamic 与 zoo.cfg 配置文件相关联

在 zoo.cfg 配置文件中加入 动态扩缩容的配置,引入 zoo.cfg.dynamic 配置文件。

# 配置一些超时时间参数
tickTime=2000
initLimit=10
syncLimit=5

# 配置data 数据文件的目录
dataDir=/zookeeper

# 配置客户端连接的端口
clientPort=2181

# 引入集群节点对应的配置文件。
skipACL=yes
reconfigEnabled=true
dynamicConfigFile=/usr/local/zookeeper3.5.7/conf/zoo.cfg.dynamic

其中可以看到,相比于3.4.x 而言,在3.5.x 版本以后,将集群的配置文件单独抽取到了一个 zoo.cfg.dynamic 文件中。

这样做,是有一定好处的,在后面的集群启动,以及动态的添加zk 节点中我们就可以看到。

至此,我们完成了 192.168.1.41 节点的配置。然后,我们可以依次配置 192.168.1.42、192.168.1.43、192.168.1.44 三台节点。

注意:在进行其他节点的配置的时候,所有步骤基本相同。但是注意 myid 文件中的内容。

# 192.168.1.42 节点内容
mkdir /zookeeper
cd /zookeeper
echo 2 >myid
# 192.168.1.43 节点内容
mkdir /zookeeper
cd /zookeeper
echo 3 >myid
# 192.168.1.44 节点内容
mkdir /zookeeper
cd /zookeeper
echo 4 >myid

启动集群

# 192.167.1.41 节点
./zkServer.sh start

# 192.167.1.42 节点
./zkServer.sh start

# 192.167.1.43 节点
./zkServer.sh start

# 192.167.1.44 节点
./zkServer.sh start

启动完集群环境,我们可以使用客户端连接集群中的任意一个节点

# 使用客户端进行连接
 ./zkCli.sh -server 192.168.1.41:2181
[zk: 192.168.1.41:2181(CONNECTED) 0] 
[zk: 192.168.1.41:2181(CONNECTED) 0] 
[zk: 192.168.1.41:2181(CONNECTED) 0] ls /
[zookeeper]

# 使用confg 命令查看配置信息
[zk: 192.168.1.41:2181(CONNECTED) 1] config
server.1=192.168.1.41:2888:3888:participant
server.2=192.168.1.42:2888:3888:participant
server.3=192.168.1.43:2888:3888:participant
server.4=192.168.1.44:2888:3888:observer
version=100000000

注意:config 命令在3.5.x 版本的客户端中才有,在3.4.x 的老版本中是无法执行该命令的。

version=100000000 就是一个版本号

集群启动,观察配置文件的变化

集群启动之后,我们依次进入 4台节点中,观察 conf 中配置文件的变化

# 集群启动之前
-rw-r--r--. 1  502 games  535 5月   4 2018 configuration.xsl
-rw-r--r--. 1  502 games 2712 2月   7 2020 log4j.properties
-rw-r--r--. 1 root root   182 4月   2 05:29 zoo.cfg
-rw-r--r--. 1 root root   137 4月   2 05:15 zoo.cfg.dynamic
-rw-r--r--. 1  502 games  922 2月   7 2020 zoo_sample.cfg
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
# 集群启动之后
-rw-r--r--. 1  502 games  535 5月   4 2018 configuration.xsl
-rw-r--r--. 1  502 games 2712 2月   7 2020 log4j.properties
-rw-r--r--. 1 root root   182 4月   2 05:29 zoo.cfg
-rw-r--r--. 1 root root   137 4月   2 05:15 zoo.cfg.dynamic
-rw-r--r--. 1 root root   172 4月   2 05:29 zoo.cfg.dynamic.100000000
-rw-r--r--. 1  502 games  922 2月   7 2020 zoo_sample.cfg

启动之后,我们发现当前的配置文件中多了一个 zoo.cfg.dynamic.100000000 配置文件,该配置文件是 zk 自动为我们生成的。

查看 zoo.cfg 文件

syncLimit=5
initLimit=10
tickTime=2000
clientPort=2181
dataDir=/zookeeper

skipACL=yes
reconfigEnabled=true
dynamicConfigFile=/usr/local/zookeeper3.5.7/conf/zoo.cfg.dynamic.100000000

此时,zoo.cfg 文件中也发生了变化,原来我们配置的 动态文件是 dynamicConfigFile=/usr/local/zookeeper3.5.7/conf/zoo.cfg.dynamic 发生了变化,

已经变为了 zk 自动生成的 zoo.cfg.dynamic.100000000 文件

查看 zoo.cfg.dynamic.100000000 文件中的内容

server.1=192.168.1.41:2888:3888:participant
server.2=192.168.1.42:2888:3888:participant
server.3=192.168.1.43:2888:3888:participant
server.4=192.168.1.44:2888:3888:observer

我们发现,貌似zk 生成的该文件和我们自己定义的 zoo.cfg.dynamic 文件中内容一样。

其实,他这样设计,主要是为了动态扩缩容的时候使用,文件中的 00000000 后缀其实就是一个版本号。

当我们动态增加 zk 节点的时候,还会再次生成一个 新的文件,然后在 zoo.cfg 文件中重新指定新的节点配置文件。这样实现了类似于一个版本的递增的效果。

动态增加节点

假设,当前的zk 集群,我们需要增加一个节点 192.168.1.45 。该怎么增加呢?

增加 192.168.1.45 zk 节点

当前我们使用的3.5.x 的版本,是支持动态的扩缩容的,因此,我们在不重启现有 zk 集群的情况下,就可以实现。

  • 在 192.168.1.45 节点上正常部署 zk。配置对应的 zoo.cfg、zoo.cfg.dynamic 配置文件。
# 配置 zoo.cfg 配置文件
syncLimit=5
tickTime=2000
initLimit=10
skipACL=yes
reconfigEnabled=true
dataDir=/zookeeper
dynamicConfigFile=/usr/local/zookeeper3.5.7/conf/zoo.cfg.dynamic
# 配置 zoo.cfg.dynamic 配置文件。
# 该配置文件中,我们原来有 server1、server2、server3、server4 四个节点。
# 现在,我们需要增加 server.5 这个新的节点。
server.1=192.168.1.41:2888:3888
server.2=192.168.1.42:2888:3888
server.3=192.168.1.43:2888:3888
server.4=192.168.1.44:2888:3888:observer
server.5=192.168.1.45:2888:3888

在现有集群中加入该新增节点

使用 zkCli.sh 客户端连接集群中任意一个节点。然后进行 reconfig 重新配置即可。

[root@bogon bin]# ./zkCli.sh 
Connecting to localhost:2181
[zk: localhost:2181(CONNECTED) 2] 
[zk: localhost:2181(CONNECTED) 2] 
[zk: localhost:2181(CONNECTED) 2] reconfig -add 5=192.168.1.45:2888:3888;2181
Committed new configuration:
server.1=192.168.1.41:2888:3888:participant
server.2=192.168.1.42:2888:3888:participant
server.3=192.168.1.43:2888:3888:participant
server.4=192.168.1.44:2888:3888:observer
server.5=192.168.1.45:2888:3888:participant;0.0.0.0:2181
version=10000000b

reconfig -add 5=192.168.1.45:2888:3888;2181 完成了新节点的加入。

此时,我们可以看到,集群节点中已经有了 192.168.1.45 这个新的节点了。

server.1=192.168.1.41:2888:3888:participant
server.2=192.168.1.42:2888:3888:participant
server.3=192.168.1.43:2888:3888:participant
server.4=192.168.1.44:2888:3888:observer
server.5=192.168.1.45:2888:3888:participant;0.0.0.0:2181
version=
100000000

此时的 version 也已经从原来的 100000000 变为了 10000000b

启动新增加的节点

最后,192.168.1.45 已经加入到了 zk的集群中,我们只需要将 该节点启动,提供服务即可。

./zkServer.sh 

观察配置文件的变化

192.168.1.41、192.168.1.42、192.168.1.43、192.168.1.44 三个老节点中。

配置文件中已经又多了一个 zoo.cfg.dynamic.10000000b 配置文件

-rw-r--r--. 1  502 games  535 5月   4 2018 configuration.xsl
-rw-r--r--. 1  502 games 2712 2月   7 2020 log4j.properties
-rw-r--r--. 1 root root   182 4月   2 06:47 zoo.cfg
-rw-r--r--. 1 root root   137 4月   2 05:13 zoo.cfg.dynamic
-rw-r--r--. 1 root root   172 4月   2 05:29 zoo.cfg.dynamic.100000000
-rw-r--r--. 1 root root   229 4月   2 06:47 zoo.cfg.dynamic.10000000b
-rw-r--r--. 1  502 games  922 2月   7 2020 zoo_sample.cfg

zoo.cfg 配置文件中也重新指向了 zoo.cfg.dynamic.10000000b 这个新的配置文件。

syncLimit=5
tickTime=2000
initLimit=10

clientPort=2181
dataDir=/zookeeper

skipACL=yes
reconfigEnabled=true
dynamicConfigFile=/usr/local/zookeeper3.5.7/conf/zoo.cfg.dynamic.10000000b
192.168.1.5 这个新的节点中。

启动之后,配置文件中自动生成了 一个 zoo.cfg.dynamic.10000000b 配置文件

-rw-r--r--. 1  502 games  535 5月   4 2018 configuration.xsl
-rw-r--r--. 1  502 games 2712 2月   7 2020 log4j.properties
-rw-r--r--. 1 root root   166 4月   2 06:48 zoo.cfg
-rw-r--r--. 1 root root   169 4月   2 06:41 zoo.cfg.dynamic
-rw-r--r--. 1 root root   229 4月   2 06:48 zoo.cfg.dynamic.10000000b
-rw-r--r--. 1  502 games  922 2月   7 2020 zoo_sample.cfg

配置文件 zoo.cfg 指向了新生成的节点文件

syncLimit=5
tickTime=2000
initLimit=10
dataDir=/zookeeper

skipACL=yes
reconfigEnabled=true
dynamicConfigFile=/usr/local/zookeeper3.5.7/conf/zoo.cfg.dynamic.10000000b

至此,我们就完成了 zk 集群中新增节点操作。

动态缩容

动态缩容和动态扩容类似,都可以在不重启zk 集群环境的情况下实现。指定 reconfig 命令即可。

假如,现在要动态的将 5 号server 删除,要如何做?

直接使用 reconfig -remove 5 即可。

./zkCli.sh 
[zk: localhost:2181(CONNECTED) 4] 
[zk: localhost:2181(CONNECTED) 4] 
[zk: localhost:2181(CONNECTED) 4] reconfig -remove 5
Committed new configuration:
server.1=192.168.1.41:2888:3888:participant
server.2=192.168.1.42:2888:3888:participant
server.3=192.168.1.43:2888:3888:participant
server.4=192.168.1.44:2888:3888:observer
version=10000000f

至此,我们就将 serverid=5 的zk 节点实现了移除。

此时,我们发现我们 version=10000000f 又发生了变化

我们的配置文件文件版本也递增的一版。新增了 zoo.cfg.dynamic.10000000f 版本。

-rw-r--r--. 1  502 games  535 5月   4 2018 configuration.xsl
-rw-r--r--. 1  502 games 2712 2月   7 2020 log4j.properties
-rw-r--r--. 1 root root   182 4月   2 07:26 zoo.cfg
-rw-r--r--. 1 root root   137 4月   2 05:15 zoo.cfg.dynamic
-rw-r--r--. 1 root root   172 4月   2 05:29 zoo.cfg.dynamic.100000000
-rw-r--r--. 1 root root   229 4月   2 06:47 zoo.cfg.dynamic.10000000b
-rw-r--r--. 1 root root   172 4月   2 07:26 zoo.cfg.dynamic.10000000f
-rw-r--r--. 1  502 games  922 2月   7 2020 zoo_sample.c