软件篇-kafka(四)-集群-zookeeper集群

2021-05-11  本文已影响0人  秃头猿猿

Zookeeper

1.简介

zookeeper是 一个分布式的协调者,从名字可以看出来,zookeeper是动物管理员的意思。

从其官网的介绍可以知道 它是一个用于维护,命名,提供分布式同步和提供服务的一个集中式组件。

很多组件在做分布式时,例如:kafka,都会面临一些问题:

基于上述原因出现了zookeeper,因此要搞懂分布式还是要先搞懂zookeeper组件

注意:有一些组件在集群时不需要依赖于zookeeper,因为组件本身就具备了集群机制

例如:ElasticSearch

注意:zookeeper不仅仅可以是协调者,还可以充当dubbo或者springcloud的注册中心

2.安装(普通)

2.1 准备

先准备三台虚拟机来搭建zookeeper集群,这里我选择的操作系统为centos,同时三台机器IP如下:

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版本

image-20210505220037946

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 安装

进入到zookeeperconf目录下,将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

image-20210511210257129

因此myid文件的内容就为1,同理,其他的机器也要配置成对应的内容

image-20210511210353180

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 启动

输入以下指令:

例如查看集群状态:

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用户下操作,所以之前启动zookeeperZK_HOME下产生了logs目录

image-20210511211009454

而现在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就更加熟悉其原理了

上一篇 下一篇

猜你喜欢

热点阅读