问题现象:

        Linux 系统如何部署 zookeeper集群?


解决方法:

0、环境

环境:

        linux 系统、JDK8、zookeeper 压缩包(bin-tar.gz)。

由于zookeeper 是基于 Java 语言的,因此安装 zookeeper 必须先安装好JAVA(JDK),这里我们安装常用的JDK8

注意:对于 linux 系统上安装 JDK8 感兴趣的小伙伴,可以参考一下文章:

        Linux 安装 JAVA(JDK)

1、下载

地址:

        Index of /dist/zookeeper

java nacos 集群连通性测试_服务器


版本很多不用担心选择哪个,我们直接点击 stable/ (稳定的)文件夹:

java nacos 集群连通性测试_压缩包_02


这里要注意如果你选择的版本(这里我下载的是 apache-zookeeper-3.6.3-bin.tar.gz)目录下,出现了两种压缩包(tar.gz):

        一种是容量比较大的(如12M),名字以 -bin.tar.gz 结尾的,例如上图中红色标记的压缩包,是我们要下载的

        另一种是容量小的(如3.2M),名字以 .tar.gz 结尾的,例如上图中蓝色标记的压缩包,不是我们要下载的。

2、安装和配置

2.1 新建目录

先新建一个目录,如 zookeeper-cluster

# 进入自定义目录路径,用于存放zookeeper服务,如/home/thp/public
cd /home/thp/public

# 创建文件夹(目录),如zookeeper-cluster
mkdir zookeeper-cluster

java nacos 集群连通性测试_服务器_03


2.2 上传zookeeper压缩包到服务器

上传zookeeper压缩包到zookeeper-cluster文件夹下:

# 进入zookeeper-cluster目录路径
cd /home/thp/public/zookeeper-cluster

java nacos 集群连通性测试_linux_04


2.3 解压

# 解压 zookeeper压缩包
tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz

java nacos 集群连通性测试_linux_05

2.4 重命名解压后的文件夹

由于要搭建zookeeper集群,所以为了区分,我们对解压后的文件夹进行重命名:

# 重命名为 zookeeper-3.6.3-1
mv apache-zookeeper-3.6.3-bin zookeeper-3.6.3-1

java nacos 集群连通性测试_压缩包_06

 2.5 创建logs日志目录和data数据目录

新建 logs目录 和 data目录,分别用来存放 日志数据

# 进入 zookeeper-3.6.3-1目录
cd /home/thp/public/zookeeper-cluster/zookeeper-3.6.3-1

#创建 logs 和 data 目录
mkdir logs data

java nacos 集群连通性测试_服务器_07

2.6 创建 zoo.cfg 配置文件

进入 conf目录后可以看见 zoo_sample.cfg配置文件

# 进入 conf目录
cd /home/thp/public/zookeeper-cluster/zookeeper-3.6.3-1/conf

java nacos 集群连通性测试_压缩包_08

将 zoo_sample.cfg 复制一份并命名为 zoo.cfg。

# 复制一份并命名为 zoo.cfg
cp zoo_sample.cfg zoo.cfg

java nacos 集群连通性测试_压缩包_09

 拓展:

这里说一下为什么要命名为 zoo.cfg。

是因为 zookeeper 的启动脚本 zkServer.sh 中,使用了 zkEnv.sh 脚本文件:

启动脚本 zkServer.sh:

java nacos 集群连通性测试_压缩包_10

 zkEnv.sh 脚本:

java nacos 集群连通性测试_服务器_11

  可以看到:

        这里是使用到了 conf 目录下的一个名为 zoo.cfg 的配置文件,而不是 zoo_sample.cfg。

2.7 修改 zoo.cfg配置文件

# 修改配置
vi zoo.cfg

1、修改 dataDir 变量,赋值为 2.5 中创建好的 data目录,如:

dataDir=/home/thp/public/zookeeper-cluster/zookeeper-3.6.3-1/data

2、添加 dataLogDir 变量,赋值为 2.5 中创建好的 logs目录,如:

dataLogDir=/home/thp/public/zookeeper-cluster/zookeeper-3.6.3-1/logs

3、配置 clientPort 客户端端口,用于zookeeper服务集群之间的通信,(默认为2181),如:

clientPort=2181

4、在文件末尾添加zookeeper服务集群实例(本文章将搭建3个服务实例),如:

server.1=服务器ip:2881:3881
server.2=服务器ip:2882:3882
server.3=服务器ip:2883:3883

拓展:

server.1=192.168.16.230:2881:3881 的各参数含义如下:        

server.实例ID=服务器IP:zk服务之间通信端口:zk服务之间投票选举端口

修改后,内容如下,:wq 保存并退出:

java nacos 集群连通性测试_linux_12

2.8 创建 myid数据文件

在 2.5 中创建的 data 目录下创建 myid数据文件:

# 进入自定义数据目录
cd /home/thp/public/zookeeper-cluster/zookeeper-3.6.3-1/data

前提:

从 2.7 中配置的 clientPort=2181 和 server.1=172.17.80.219:2881:3881 可知,当前服务实例ID为 1 。

2种创建方式:

1、先用 mkdir命令 创建文件,再用vi命令 写入数据(当前服务实例ID):

# 创建 myid文件
mkdir myid

# 编辑 myid文件,写入1
vi myid

2、由于该文件是文本文件,所以可以使用echo 命令,在创建的同时写入数据:

# 创建 myid文本文件,同时写入当前服务实例ID(1)
echo 1 > myid

这里强烈推荐使用方法2,简单快捷!!!

创建后,myid数据文件的内容如下:

java nacos 集群连通性测试_linux_13

至此服务实例1就完成了!!!

拓展: 

这里说一下为什么要命名为 myid因为 zookeeper 的启动脚本 zkServer.sh 中,使用到了名为 myid的数据文件:

java nacos 集群连通性测试_压缩包_14

myid数据文件的作用是:文件中记载了当前服务实例的id,也就是上面配置服务实例时的实例ID:

        server.实例ID=实例IP:zk服务之间通信端口:zk服务之间投票选举端口

实例ID可用于zookeeper识别和管理当前服务实例,以便服务实例之间的通信。

2.9 部署其他服务实例

有了上面已经配置好的服务实例1,接下来部署其他服务实例就容易多了:

1、复制 zookeeper-3.6.3-1 文件夹到 /home/thp/public/zookeeper-cluster 目录下 ,命名为 zookeeper-3.6.3-2 :

# 进入 zookeeper-cluster目录路径
cd /home/thp/public/zookeeper-cluster

# 复制 zookeeper-3.6.3-1 并命名为 zookeeper-3.6.3-2
cp -r zookeeper-3.6.3-1 zookeeper-3.6.3-2

2、仿照 2.7 ,修改 /home/thp/public/zookeeper-cluster/zookeeper-3.6.3-2/conf 目录下的 zoo.conf文件,需要修改的内容如下:

dataDir=/home/thp/public/zookeeper-cluster/zookeeper-3.6.3-2/data
dataLogDir=/home/thp/public/zookeeper-cluster/zookeeper-3.6.3-2/logs
clientPort=2182

修改后内容如下:

java nacos 集群连通性测试_服务器_15

3、修改 /home/thp/public/zookeeper-cluster/zookeeper-3.6.3-2/data 目录下的 myid文件,修改后内容如下:

java nacos 集群连通性测试_zookeeper_16

4、同样的,仿照上面的1、2、3、步骤再配置一个服务实例:

# 进入 zookeeper-cluster目录路径
cd /home/thp/public/zookeeper-cluster

# 复制 zookeeper-3.6.3-1 并命名为 zookeeper-3.6.3-3
cp -r zookeeper-3.6.3-1 zookeeper-3.6.3-3

java nacos 集群连通性测试_服务器_17

 

java nacos 集群连通性测试_服务器_18

 至此3个服务实例都安装并配置完成!!!

3、启动

3.1 开放防火墙端口

开放上面 2.7 中配置的所有端口号,如下:

2181、2182、2183

2881、2882、2883

3881、3882、3883

依次执行一下代码:

# 开放端口
sudo firewall-cmd --zone=public --add-port=2181/tcp --permanent
sudo firewall-cmd --zone=public --add-port=2182/tcp --permanent
sudo firewall-cmd --zone=public --add-port=2183/tcp --permanent
sudo firewall-cmd --zone=public --add-port=2881/tcp --permanent
sudo firewall-cmd --zone=public --add-port=2882/tcp --permanent
sudo firewall-cmd --zone=public --add-port=2883/tcp --permanent
sudo firewall-cmd --zone=public --add-port=3881/tcp --permanent
sudo firewall-cmd --zone=public --add-port=3882/tcp --permanent
sudo firewall-cmd --zone=public --add-port=3883/tcp --permanent

# 重启防火墙
sudo firewall-cmd --reload

# 查看开放端口列表
sudo firewall-cmd --zone=public --list-ports

查看端口开放列表,可以看见已经以上端口开放成功: 

java nacos 集群连通性测试_压缩包_19

3.2 进入到3个服务实例对应的 bin目录下,执行启动脚本 zkServer.sh 即可

# 启动 服务实例1 
cd /home/thp/public/zookeeper-cluster/zookeeper-3.6.3-1/bin
./zkServer.sh start
 
# 启动 服务实例2 
cd /home/thp/public/zookeeper-cluster/zookeeper-3.6.3-2/bin
./zkServer.sh start
 
# 启动 服务实例3 
cd /home/thp/public/zookeeper-cluster/zookeeper-3.6.3-3/bin
./zkServer.sh start

java nacos 集群连通性测试_java nacos 集群连通性测试_20

3.3 查看状态 

# 查看 服务实例1 状态
cd /home/thp/public/zookeeper-cluster/zookeeper-3.6.3-1/bin
./zkServer.sh status
 
# 查看 服务实例2 状态
cd /home/thp/public/zookeeper-cluster/zookeeper-3.6.3-2/bin
./zkServer.sh status
 
# 查看 服务实例3 状态
cd /home/thp/public/zookeeper-cluster/zookeeper-3.6.3-3/bin
./zkServer.sh status

 出现如下信息,则表示zookeeper集群搭建完成!!!

java nacos 集群连通性测试_压缩包_21

拓展:

如果在查看服务实例状态时,出现如下报错:

java nacos 集群连通性测试_linux_22

则需要注意以下几点:

1、请保证严格按照本文章的步骤执行,仔细查看各配置是否有误!

2、因为是配置了集群,所以需要把所有服务实例都启动了,再去查看服务状态;如果没有起完所有的服务实例,就查看状态,也会报错,报错原因也可以通过查看logs下的日志 zookeeper-thp-server-NewGIS-GRCTest.out 文件可以查看服务运行日志:

java nacos 集群连通性测试_zookeeper_23

 3、网上会提到说关闭防火墙,但其实不完全正确,因为未必所有的linux服务器都会去关闭防火墙,其实只需要保证,该服务中涉及到的端口号都开放了即可。