CentOS7搭建Zookeeper集群
目录
首先,zookeeper安装依赖jdk环境,可以参考:CentOS7安装jdk1.8-源码安装、openjdk安装、docker安装
一、CenOS7安装Zookeeper单节点
Zookeeper的下载地址为:https://dlcdn.apache.org/zookeeper/,根据自己的需要选择对应的版本,这里将几个版本进行了下载(但是一定下载-bin.tar.gz 的包):
如果可以不连外网,则可以使用上面的安装包先上传到对饮服务器位置;如果可以连外网则,先下载安装包: wget https://dlcdn.apache.org/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz
解压安装包:tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz
跳转到解压包下的config目录下,将sample的配置包复制一份:
cp zoo_sample.cfg zoo.cfg
修改配置的信息:
-
tickTime =2000 zookeeper与客户端的心跳时间;
-
initLimit=10 LF初始通信时限;
-
syncLimit =5 LF同步通信时限;
-
dataDir=/tmp/zookeeper/ 数据文件目录+数据持久化路径;
-
clientPort=2181 客户端连接端口;
原则上不用修改了,配置已经为如下所示:
记得开启CentOS7防火墙端口或关闭防火墙,如果是阿里云、华为云服务器等自行在 安全规则组中添加对应端口
启动zookeeper:./zkServer.sh start
关闭zookeeper:./zkServer.sh stop
二、Zookeeper集群搭建
Zookeeper集群为了防止脑裂,需要将节点树设置为奇数,这里建议设置为3台。
info:脑裂就是为了防止因为网络等问题照成两个集群同时工作照成使用数据错误的问题,这样的结果本身比Zookeeper集群不能对外工作更严重,如果是集群则在Zap协议选举时,需要半数以上的节点投票,则不可能出现脑裂的情况
1、同一台服务器搭建伪Zookeeper集群
类似上面单体服务一样,上传并且解压后得到的目录如下:
此时可以进入下面的conf目录,复制 zoo.cfg配置文件,这样下面再copy节点后都有配置文件了
将解压文件负责三分作为三个节点:
cp -R apache-zookeeper-3.7.0-bin zookeeper-1
cp -R apache-zookeeper-3.7.0-bin zookeeper-2
cp -R apache-zookeeper-3.7.0-bin zookeeper-3
分别在三个节点下创建data数据目录,如下:
mkdir /home/mosty/zookeeper/zookeeper-1/data
mkdir /home/mosty/zookeeper/zookeeper-2/data
mkdir /home/mosty/zookeeper/zookeeper-3/data
然后分别在三个数据节点目录下创建文件 myid, 并且写入对应的值服务id,比如节点3如下:
然后分别修改三个节点下的zoo.cfg文件,添加下面的行:
每个节点都要添加如下配置(这里的localhost可以换成本地服务的ip,可以使用 ifconfig查看):
server.1=localhost:2881:3881
server.2=localhost:2882:3882
server.3=localhost:2883:3883
【节点zookeeper-1】修改启动端口和数据目录:
dataDir=/home/mosty/zookeeper/zookeeper-1/data
clientPort=2181
【节点zookeeper-2】修改启动端口和数据目录:
dataDir=/home/mosty/zookeeper/zookeeper-2/data
clientPort=2182
【节点zookeeper-3】修改启动端口和数据目录:
dataDir=/home/mosty/zookeeper/zookeeper-3/data
clientPort=2183
比如节点一(zookeeper-1)如下图:
最后进入三个节点的bin目录下,执行 ./zkServer.sh start
然后在每个节点执行查看节点状态:./zkServer.sh status
iShot2022-05-07 16.48.43
2、3台服务器搭建Zookeeper集群
安装上面的单节点安装方式处理三个节点,比如我当前的服务ip分别为(这里使用的外网ip,到时候内网也可以对应修改即可):
47.94.140.208、82.156.54.7、39.107.127.88
然后在 zoo.cfg下面三台服务器都修改服务器配置,添加:
server.1=47.94.140.208:2881:3881
server.2=82.156.54.7:2881:3881
server.3=39.107.127.88:2881:3881
如果像我一样当前是使用三台外网ip链接成集群,需要分别在三台的配置文件中添加:quorumListenOnAllIPs=true
并且在单台服务器的zoo.cfg配置中的 dataDir配置的目录下,创建 myid的文件,并且写入对应的id值,与上面的server.1、server.2、server.3进行对应,如下【三台服务都要创建】:
只是需要注意外网的三台都开放一下端口2181、2881、3881,或者三台服务都关闭防火墙,并且如果是阿里云获取华为云等,还需要将安全规则的端口进行开放。
这里直接快速三台都关闭防火墙,都执行命令:systemctl stop firewalld.service 然后再配置安全组规则,如下:
然后分别启动单台服务,如下图:
启动完成后,在三台服务器使用命令:./zkServer.sh status查询主从节点信息,已经是否组成集群集群主节点,显示如下:
集群从节点,显示如下:
iShot2022-05-05 18.11.03
遇到的问题:
ERROR [ListenerHandler-/82.156.54.7:3881:QuorumCnxManager$Listener$ListenerHandler@1094] - Exception while listening java.net.BindException: 无法指定被请求的地址 (Bind failed)
解决:当时是使用的三台外网ip地址进行链接的,需要在三个服务的zoo.cfg中添加配置项quorumListenOnAllIPs=true