问题现象:
Linux 系统如何部署 zookeeper集群?
解决方法:
0、环境
环境:
linux 系统、JDK8、zookeeper 压缩包(bin-tar.gz)。
由于zookeeper 是基于 Java 语言的,因此安装 zookeeper 必须先安装好JAVA(JDK),这里我们安装常用的JDK8。
注意:对于 linux 系统上安装 JDK8 感兴趣的小伙伴,可以参考一下文章:
Linux 安装 JAVA(JDK)
1、下载
地址:
版本很多不用担心选择哪个,我们直接点击 stable/ (稳定的)文件夹:
这里要注意如果你选择的版本(这里我下载的是 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
2.2 上传zookeeper
压缩包到服务器
上传zookeeper
压缩包到zookeeper-cluster
文件夹下:
# 进入zookeeper-cluster目录路径
cd /home/thp/public/zookeeper-cluster
2.3 解压
# 解压 zookeeper压缩包
tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz
2.4 重命名解压后的文件夹
由于要搭建zookeeper集群,所以为了区分,我们对解压后的文件夹进行重命名:
# 重命名为 zookeeper-3.6.3-1
mv apache-zookeeper-3.6.3-bin zookeeper-3.6.3-1
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
2.6 创建 zoo.cfg 配置文件
进入 conf目录后可以看见 zoo_sample.cfg配置文件:
# 进入 conf目录
cd /home/thp/public/zookeeper-cluster/zookeeper-3.6.3-1/conf
将 zoo_sample.cfg 复制一份并命名为 zoo.cfg。
# 复制一份并命名为 zoo.cfg
cp zoo_sample.cfg zoo.cfg
拓展:
这里说一下为什么要命名为 zoo.cfg。
是因为 zookeeper 的启动脚本 zkServer.sh 中,使用了 zkEnv.sh 脚本文件:
启动脚本 zkServer.sh:
zkEnv.sh 脚本:
可以看到:
这里是使用到了 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 保存并退出:
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数据文件的内容如下:
至此服务实例1就完成了!!!
拓展:
这里说一下为什么要命名为 myid。因为 zookeeper 的启动脚本 zkServer.sh 中,使用到了名为 myid的数据文件:
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
修改后内容如下:
3、修改 /home/thp/public/zookeeper-cluster/zookeeper-3.6.3-2/data 目录下的 myid文件,修改后内容如下:
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
至此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
查看端口开放列表,可以看见已经以上端口开放成功:
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
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集群搭建完成!!!
拓展:
如果在查看服务实例状态时,出现如下报错:
则需要注意以下几点:
1、请保证严格按照本文章的步骤执行,仔细查看各配置是否有误!
2、因为是配置了集群,所以需要把所有服务实例都启动了,再去查看服务状态;如果没有起完所有的服务实例,就查看状态,也会报错,报错原因也可以通过查看logs下的日志 zookeeper-thp-server-NewGIS-GRCTest.out 文件可以查看服务运行日志:
3、网上会提到说关闭防火墙,但其实不完全正确,因为未必所有的linux服务器都会去关闭防火墙,其实只需要保证,该服务中涉及到的端口号都开放了即可。