小白学习ZooKeeper集群部署

324 阅读4分钟

一、前言

1、ZooKeeper简介

ZooKeeper是一个开源的分布式应用程序协调服务,是Google的Chubby一个开源的实现。ZooKeeper为分布式应用提供一致性服务,提供的功能包括:分布式同步(Distributed Synchronization)、命名服务(Naming Service)、集群维护(Group Maintenance)、分布式锁(Distributed Lock)等,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。

ZooKeeper本身可以以单机模式安装运行,不过它的长处在于通过分布式ZooKeeper集群(一个Leader,多个Follower),基于一定的策略来保证ZooKeeper集群的稳定性和可用性,从而实现分布式应用的可靠性。

2、ZooKeeper集群角色说明

ZooKeeper主要有领导者(Leader)、跟随者(Follower)和观察者(Observer)三种角色。

角色说明
领导者(Leader)为客户端提供读和写的服务,负责投票的发起和决议,更新系统状态。
跟随者(Follower)为客户端提供读服务,如果是写服务则转发给Leader。在选举过程中参与投票。
观察者(Observer)为客户端提供读服务器,如果是写服务则转发给Leader。不参与选举过程中的投票,也不参与“过半写成功”策略。在不影响写性能的情况下提升集群的读性能。此角色于zookeeper3.3系列新增的角色。

二、准备工作

1、集群节点规划

ZooKeeper在提供分布式锁等服务的时候需要过半数的节点可用。另外高可用的诉求来说节点的个数必须>1,所以ZooKeeper集群需要是>1的奇数节点。例如3、5、7等等。

本次我们规划两个节点,操作系统选用CnetOS 7

节点名IP说明
zk01192.168.174.131ZooKeeper节点
zk02192.168.174.130ZooKeeper节点

2、软件版本说明

说明
Linux ServerCentOS 7
JDK1.8.0_401
ZooKeeperapache-zookeeper-3.7.2-bin

3、部署JDK8

所有节点均需要安装JDK8,参考小白学习CentOS下部署Java8

三、部署ZooKeeper

本次一共要部署三个ZooKeeper节点,所有文中没有指定机器的操作都表示每个节点都要执行该操作

1、下载ZooKeeper&基础准备

  • 下载ZooKeeper
cd /tmp

wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.7.2/apache-zookeeper-3.7.2-bin.tar.gz
  • 创建ZooKeeper相关目录
#创建应用目录 
mkdir /usr/zookeeper 
#创建数据目录
mkdir /usr/zookeeper/data 
mkdir /usr/zookeeper/logs
  • 解压到指定目录
tar -zvxf apache-zookeeper-3.7.2-bin.tar.gz -C /usr/zookeeper
  • 配置环境变量
#修改环境变量文件 
vi /etc/profile 

#增加以下内容 
export ZOOKEEPER_HOME=/usr/zookeeper/apache-zookeeper-3.7.2-bin
export PATH=$ZOOKEEPER_HOME/bin:$PATH

#使环境变量生效 
source /etc/profile 

#查看配置结果 
echo $ZOOKEEPER_HOME

既然已配置环境变量,为了方便访问ZooKeeper目录

后续通过$ZOOKEEPER_HOME代替/usr/zookeeper/apache-zookeeper-3.7.2-bin

2、配置ZooKeeper

  • ZooKeeper基础配置
#进入ZooKeeper配置目录 
cd $ZOOKEEPER_HOME/conf 

#新建配置文件 
vi zoo.cfg 

#写入以下内容并保存 
initLimit=10
syncLimit=5
dataDir=/usr/zookeeper/data
dataLogDir=/usr/zookeeper/logs
clientPort=2181
server.1=192.168.174.131:2888:3888
server.2=192.168.174.130:2888:3888
  • 配置节点标识

创建myid编号,依次在每台Server上执行,注意每台Server的myid要对应正确的编号

zk01:

echo "1" > /usr/zookeeper/data/myid

zk02:

echo "2" > /usr/zookeeper/data/myid
  • 防火墙配置
#开放端口 
firewall-cmd --add-port=2181/tcp --permanent 
firewall-cmd --add-port=2888/tcp --permanent 
firewall-cmd --add-port=3888/tcp --permanent 

#重新加载防火墙配置 
firewall-cmd --reload

3、启动ZooKeeper

#进入ZooKeeper bin目录 
cd $ZOOKEEPER_HOME/bin 

#启动 
sh zkServer.sh start

出现以下字样表示启动成功:

ZooKeeper JMX enabled by default

Using config: /usr/zookeeper/apache-zookeeper-3.7.2-bin/bin/../conf/zoo.cfg

Client port found: 2181. Client address: localhost. Client SSL: false.

Starting zookeeper … STARTED

如果启动失败,去查看/usr/zookeeper/apache-zookeeper-3.7.2-bin/logs/zookeeper-root-server-h2.taosdata.com.out文件中的报错信息

四、集群查看&连接测试

1、查看节点状态

sh $ZOOKEEPER_HOME/bin/zkServer.sh status 

#状态信息 
ZooKeeper JMX enabled by default 
Using config: /usr/zookeeper/apache-zookeeper-3.7.2-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower 

#如果为领导者节点则Mode:leader

2、客户端连接测试

这里随机选其中一个节点作为客户端连接其他节点即可

#指定Server进行连接 
sh $ZOOKEEPER_HOME/bin/zkCli.sh -server 192.168.174.131:2181 

#正常连接后会进入ZooKeeper命令行,显示如下: 
[zk: 192.168.174.131:2181(CONNECTED) 0]

# 使用quit命令退出连接
[zk: 192.168.174.131:2181(CONNECTED) 0] quit

输入命令测试:

#查看ZooKeeper根 
[zk: 192.168.88.13:2181(CONNECTED) 0] ls / 
[admin, brokers, cluster, config, consumers, controller, controller_epoch, feature, isr_change_notification, latest_producer_id_block, log_dir_event_notification, zookeeper]

3. 查看节点

  • 连接到 ZooKeeper: 使用 ZooKeeper 的客户端工具连接到 ZooKeeper 实例。
zkCli.sh -server 192.168.174.131:2181
  • 列出节点: 使用 ls 命令列出 ZooKeeper 中的节点,找到与 Kafka 相关的节点。
ls /brokers/ids
  • 删除节点: 使用 delete 命令删除与 Kafka 节点相关联的节点。
delete /brokers/ids/your_kafka_node_id

五、开机自启动

1、在/etc/systemd/system/文件夹下创建一个启动脚本zookeeper.service

vi /etc/systemd/system/zookeeper.service

内容如下:

[Unit]
Description=Zookeeper
After=network.target

[Service]
Type=forking
User=root
Group=root
Environment=ZOO_LOG_DIR=/opt/apache-zookeeper-3.7.2-bin/logs
Environment=JAVA_HOME=/opt/jdk-11
WorkingDirectory=/opt/apache-zookeeper-3.7.2-bin/bin
ExecStart=/opt/apache-zookeeper-3.7.2-bin/bin/zkServer.sh start
ExecStop=/opt/apache-zookeeper-3.7.2-bin/bin/zkServer.sh stop
Restart=always
RestartSec=10
TimeoutSec=360
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

2、启动 zookeeper

systemctl daemon-reload
systemctl start zookeeper

3、开机启动

systemctl enable zookeeper

4、检查是否已经开机启动

systemctl is-enabled zookeeper

六、备注

配置项名称ken.io 的说明
tickTimeCS通信心跳间隔服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每间隔 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位。
initLimitLF初始通信时限集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数
syncLimitLF同步通信时限集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数
dataDir数据文件目录Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里
dataLogDir日志文件目录Zookeeper保存日志文件的目录
clientPort客户端连接端口客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求
server.N服务器名称与地址从N开始依次为:服务编号、服务地址、LF通信端口、选举端口;例如:server.1=192.168.174.131:2888:3888

参考