软件篇-kafka(四)-集群-zookeeper集群
Zookeeper
1.简介
zookeeper
是 一个分布式的协调者,从名字可以看出来,zookeeper
是动物管理员的意思。
从其官网的介绍可以知道 它是一个用于维护,命名,提供分布式同步和提供服务的一个集中式组件。
很多组件在做分布式时,例如:kafka
,都会面临一些问题:
-
当组件搭建集群时,无法通过自己去抉择出主和从
一旦主节点挂掉,那么无法自动选择其节点成为主节点,从而导致整个集群挂掉。
-
集群元数据信息无法存储
基于上述原因出现了zookeeper
,因此要搞懂分布式还是要先搞懂zookeeper
组件
注意:有一些组件在集群时不需要依赖于
zookeeper
,因为组件本身就具备了集群机制例如:
ElasticSearch
注意:
zookeeper
不仅仅可以是协调者,还可以充当dubbo
或者springcloud
的注册中心
2.安装(普通)
2.1 准备
先准备三台虚拟机来搭建zookeeper
集群,这里我选择的操作系统为centos
,同时三台机器IP如下:
- 192.168.80.130
- 192.168.80.131
- 192.168.80.132
装
zookeeper
之前需要先在三台机器安装java
,这里就不细说了
同时在三台机器上创建kafka
用户,方便后期进行管理。当然不安装也可以,把所有的软件安装在同一个用户下也是可以的
个人建议还是创建用户,不同的软件安装不同的用户下,方便管理
创建组和用户命令如下
groupadd kafka
useradd -g kafka -s /bin/bash -d /home/kafka -m kafka
创建目录用来存放zookeeper存放
mkdir -p /var/data/zookeeper
修改文件该目录的组和拥有者
chown -R kafka:kafka /var/data/zookeeper
注意:三台机器都要操作
2.2 下载
从zookeeper
官网下载安装包,目前我下载的是3.7.0
版本
2.3 开始
2.3.1 解压
有了上面的准备之后,接下来就可以正式安装zookeeper
了,先将在三台机器上分别解压下载好的安装包,命令如下:
tar -zxvf /home/apache-zookeeper-3.7.0-bin/zookeeper.tar.gz -C /opt
mv /opt/apache-zookeeper-3.7.0-bin /opt/zookeeper
修改安装目录的拥有者和组
chown -R kafka:kafka /opt/zookeeper
注意:三台机器都要操作且同时机器安装好
java
环境
2.3.2 安装
进入到zookeeper
的conf
目录下,将zoo_sample.cfg
文件复制为zoo.cfg
cd /opt/zookeeper/conf
cp zoo_sample.cfg zoo.cfg
修改zoo.cfg
文件,具体修改内容如下:
#客户端与服务器之间维持心跳的间隔,每隔2000毫秒就会客户端就会像服务器发送一个心跳
tickTime=2000
# 允许从节点连接并同步到主节点的初始化连接时间
# 这个值是tickTime的倍数,所以initlimit是10* 2OOOms,也就是20s
initLimit=10
# 表示允许从节点与主节点处于不同步状态的时间上限,如果从节点在于主节点在这个时间内,没有完成同步,那么这个从节点就会被舍弃
# 这个值也是tickTime的倍数,所以syncLimit是 5 * 2000ms 也就是10s
syncLimit=5
# 存储内存中数据快照的位置
dataDir=/var/data/zookeeper
# 客户的端连接的端口
clientPort=2181
# 服务器编号
# 2888 zookeeper之间通信端口
# 3888 选择leader端口
# ip为zookeeper服务器ip
server.0=192.168.80.130:2888:3888
server.1=192.168.80.131:2888:3888
server.2=192.168.80.132:2888:3888
注意:三台机器都要改
在上述指定的目录中/var/data/zookeeper
,创建myid
文件,并且文件的内容与上述的内容一致。
例如,在192.168.80.131
机器上创建myid
文件,而131
这台机器对应的server
配置是server.1
因此myid
文件的内容就为1
,同理,其他的机器也要配置成对应的内容
2.3.3 环境
上述步骤完成后,就可以去启动zookeeper
注意 启动时需要关闭防火墙 或者把 2181
端口加入到防火墙
# 关闭防火墙
systemctl stop firewalld
# 加入端口
firewall-cmd --add-port 2181/tcp --permanent
firewall-cmd --add-port 2888/tcp --permanent
firewall-cmd --add-port 3888/tcp --permanent
firewall-cmd --reload
启动zookeeper
/opt/zookeeper/bin/zkServer.sh start
发现以后每次去启动,都要到指定目录下去通过zkServer.sh
启动,为了方便的启动zookeeper
,可以配置环境变量,命令如下
vi /etc/profie
在文件末尾追加内容如下:
export ZK_HOME=/opt/zookeeper
export PATH=$PATH:$ZK_HOME/bin
image-20210511205357702
输入以下指令让配置文件生效
source /etc/profile
注意:三台机器都要改
2.3.4 启动
输入以下指令:
-
启动
zookeeper
zkServer.sh start
-
停止
zookeeper
zkServer.sh stop
-
查看集群状态
zkServer.sh status
例如查看集群状态:
image-20210505231000906这样一个zookeeper
集群搭建完毕
2.4 服务
虽然上述步骤中,通过配置变量让启动zookeeper
启动更加优雅,但是还是有点不太方便
更好是把启动交给systemd
去管理,因此就需要把zookeeper
做成一个服务,操作如下:
2.4.1 配置
在/etc/systemd/system
目录下创建一个zookeeper.service
文件,其内容如下:
[Unit]
# 服务描述
Description=zookeeper.service
#
# 在网络服务启动后运行
After=network.target
#
[Service]
# 指定以什么用户去启动
User=kafka
# 指定用户组
Group=kafka
# Type 必须为 forking 否则无法启动,
Type=forking
# 指定要依赖的环境
Environment=JAVA_HOME=/opt/jdk
#
# 启动命令
ExecStart=/opt/zookeeper/bin/zkServer.sh start
#
# 停止命令
ExecStop=/opt/zookeeper/bin/zkServer.sh stop
#
# 重启命令
ExecReload=/opt/zookeeper/bin/zkServer.sh restart
# 启动失败后重启
Restart=on-failure
# 每次尝试重启间隔60秒
StartLimitInterval=60
# 最终尝试重启3000次
StartLimitBurst=3000
#
[Install]
WantedBy=multi-user.target
注意:三台机器都要配置,同时需要修改文件权限
chmod o+x,u+x,g+x /etc/systemd/system/zookeeper.service
由于之前的操作是在root
用户下操作,所以之前启动zookeeper
在ZK_HOME
下产生了logs
目录
而现在systemd
是以kafka
用户去启动,而这个用户是没有权限去访问logs
目录,因此需要修改
chown -R kafka:kafka /opt/zookeeper
三台机器都要操作
2.4.2 操作
让配置生效
systemctl daemon-reload
启动zookeeper
systemctl start zookeeper
查看zookeeper
运行状态
systemctl status zookeeper
关闭zookeeper
systemctl stop zookeeper
重启zookeeper
systemctl restart zookeeper
开机自启动
systemctl enable zookeeper
3.安装(docker)
3.1 镜像
docker pull zookeeper
注意三台机器均要拉去zookeeper镜像
3.2 容器
在三台机器中分别创建zookeeper
容器,命令如下:
在
192.168.80.132
上执行以下命令
docker run -di --name=zookeeper --net=host \
-v /opt/zookeeper/logs:/opt/zookeeper/logs \
-v /opt/zookeeper/data:/data \
-v /opt/zookeeper/datalog:/datalog \
-e "ZOO_MY_ID=1" \
-e "ZOO_SERVERS=server.1=0.0.0.0:2888:3888;2181 server.2=192.168.80.131:2888:3888;2181 server.3=192.168.80.132:2888:3888;2181" --restart=always zookeeper
在
192.168.80.133
上执行以下命令
docker run -di --name=zookeeper --net=host \
-v /opt/zookeeper/logs:/opt/zookeeper/logs \
-v /opt/zookeeper/data:/data \
-v /opt/zookeeper/datalog:/datalog \
-e "ZOO_MY_ID=2" \
-e "ZOO_SERVERS=server.1=192.168.80.130:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=192.168.80.132:2888:3888;2181" --restart=always zookeeper
在
192.168.80.134
上执行以下命令
docker run -di --name=zookeeper --net=host \
-v /opt/zookeeper/logs:/opt/zookeeper/logs \
-v /opt/zookeeper/data:/data \
-v /opt/zookeeper/datalog:/datalog \
-e "ZOO_MY_ID=3" \
-e "ZOO_SERVERS=server.1=192.168.80.130:2888:3888;2181 server.2=192.168.80.131:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181" --restart=always zookeeper
自此zookeeper集群搭建成功。
当然我个人不推荐直接上手docker
搭建,原生搭建方式虽然复杂一点,但是掌握了这种方式,再用docker
就更加熟悉其原理了