ZooKeeper安装部署
1. ZooKeeper简介
https://zookeeper.apache.org/
ZooKeeper 是一个开源的分布式协调服务,它的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。
ZooKeeper 为我们提供了高可用、高性能、稳定的分布式数据一致性解决方案,通常被用于实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。
另外,ZooKeeper 将数据保存在内存中,性能是非常棒的。 在“读”多于“写”的应用程序中尤其地高性能,因为“写”会导致所有的服务器间同步状态。(“读”多于“写”是协调服务的典型场景)。
下面选 3 个典型的应用场景来专门说说:
- 分布式锁 : 通过创建唯一节点获得分布式锁,当获得锁的一方执行完相关代码或者是挂掉之后就释放锁。
- 命名服务 :可以通过 ZooKeeper 的顺序节点生成全局唯一 ID
- 数据发布/订阅 :通过 Watcher 机制 可以很方便地实现数据发布/订阅。当你将数据发布到 ZooKeeper 被监听的节点上,其他机器可通过监听 ZooKeeper 上节点的变化来实现配置的动态更新。
实际上,这些功能的实现基本都得益于 ZooKeeper 可以保存数据的功能,但是 ZooKeeper 不适合保存大量数据,这一点需要注意
Kafka : ZooKeeper 主要为 Kafka 提供 Broker 和 Topic 的注册以及多个 Partition 的负载均衡等功能。
ZooKeeper 主要是用来协调服务的,而不是用来存储业务数据的,所以不要放比较大的数据在 znode 上,ZooKeeper 给出的上限是每个结点的数据大小最大是 1M。
最典型集群模式: Master/Slave 模式(主备模式)。在这种模式中,通常 Master 服务器作为主服务器提供写服务,其他的 Slave 服务器从服务器通过异步复制的方式获取 Master 服务器最新的数据提供读服务。
但是,在 ZooKeeper 中没有选择传统的 Master/Slave 概念,而是引入了 Leader、Follower 和 Observer 三种角色。如下图所示
如下图所示
ZooKeeper 集群中的所有机器通过一个 Leader 选举过程 来选定一台称为 “Leader” 的机器,Leader 既可以为客户端提供写服务又能提供读服务。除了 Leader 外,Follower 和 Observer 都只能提供读服务。Follower 和 Observer 唯一的区别在于 Observer 机器不参与 Leader 的选举过程,也不参与写操作的“过半写成功”策略,因此 Observer 机器可以在不影响写性能的情况下提升集群的读性能。
当 Leader 服务器出现网络中断、崩溃退出与重启等异常情况时,就会进入 Leader 选举过程,这个过程会选举产生新的 Leader 服务器。
2. ZooKeeper 分布式集群部署
ZooKeeper 分布式集群部署指的是 ZooKeeper 分布式模式安装。ZooKeeper 集群搭建通常是由 2n+1 台服务器组成,这是为了保证 Leader 选举(基于 Paxos 算法的实现)能够通过半数以上台服务器选举支持,因此,ZooKeeper 集群的数量一般为奇数台。
主机信息如下:
| 主机名 | node1 | node2 | node3 |
|---|---|---|---|
IP地址 |
10.90.100.101 | 10.90.100.102 | 10.90.100.103 |
2.1 ZooKeeper安装包的下载安装
由于 ZooKeeper 集群的运行需要 Java 环境支持,所以需要提前安装JDK。本节讲解的是Leader+Follower 模式的 ZooKeeper 集群。这里我们选择 ZooKeeper 的版本是 3.7.1。具体下载安装步骤如下。
(1)下载ZooKeeper 安装包
下载apache-zookeeper-3.7.1-bin.tar.gz ,下载地址:
https://archive.apache.org/dist/zookeeper/
(2)上传ZooKeeper安装包到Linux
这里以上传至/home/hadoop/目录为例
(3)解压ZooKeeper安装包
首先,进入上传安装包的目录,具体命令如下
[hadoop@node1 ~]$ cd
[hadoop@node1 ~]$ ls
apache-zookeeper-3.7.1-bin.tar.gz
其次,解压安装包apache-zookeeper-3.7.1-bin.tar.gz 至/opt/software目录,具体命令如下
[hadoop@node1 ~]$ tar -xzvf apache-zookeeper-3.7.1-bin.tar.gz -C /opt/software/
切换到/opt/software目录下就可以看到解压后的目录文件
[hadoop@node1 ~]$ cd /opt/software/
[hadoop@node1 software]$ ls
apache-zookeeper-3.7.1-bin hadoop hadoop-3.3.4 jdk jdk-17.0.13
[hadoop@node1 software]$
为了后续操作方便,创建zookeeper的软链接
[hadoop@node1 software]$ ln -s /opt/software/apache-zookeeper-3.7.1-bin zookeeper
[hadoop@node1 software]$ ll
lrwxrwxrwx. 1 hadoop hadoop 40 3月11日 17:09 zookeeper -> /opt/software/apache-zookeeper-3.7.1-bin
[hadoop@node1 software]$
当我们把安装包解压完毕,也就是 ZooKeeper 的安装结束。但是,并不意味着 ZooKeeper集群的部署已经结束,我们还需要对其进行配置和启动,若是启动成功,才算是 ZooKeeper集群部署成功。
2.2 ZooKeeper 相关配置
接下来,我们开始配置ZooKeeper 集群
(1)修改ZooKeeper 的配置文件
首先,进入zookeeper下的conf目录
[hadoop@node1 software]$ cd zookeeper/
[hadoop@node1 zookeeper]$ ls
bin conf docs lib LICENSE.txt NOTICE.txt README.md README_packaging.md
[hadoop@node1 zookeeper]$ cd conf/
[hadoop@node1 conf]$ ls
configuration.xsl log4j.properties zoo_sample.cfg
[hadoop@node1 conf]$
复制配置文件zoo_sample.cfg 并重命名为zoo.cfg ,具体命令如下
[hadoop@node1 conf]$ cp zoo_sample.cfg zoo.cfg
[hadoop@node1 conf]$ ls
configuration.xsl log4j.properties zoo.cfg zoo_sample.cfg
[hadoop@node1 conf]$
其次,修改配置文件 zoo.cfg,分别设置dataDir目录和配置服务器编号和主机名映射关系,设置与主机连接的心跳端口和选举端口,具体配置内容如下:
[hadoop@node1 conf]$ vim zoo.cfg
#修改之后的 zoo.cfg内容如下:
[hadoop@node1 conf]$ cat zoo.cfg
# The number of milliseconds of each tick
#设置通信心跳数
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
#设置初始通信时限
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
#设置同步通信时限
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
##设置数据文件目录及数据持久化路径##
dataDir=/opt/software/zookeeper/zkdataDir
# the port at which the clients will connect
#设置客户端连接的端口号
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
##配置ZK集群的服务器编号以及对应的主机名、选举端口号、通信端口号(心跳端口号)##
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
提示:
配置文件
zoo.cfg中的参数server.1=node1:2888:3888,其中,1表示服务器编号;node1表示这个服务器的主机名(已经做好IP映射就可以写主机名,否则要写上IP);2888表示Leader选举的端口号;3888表示ZooKeeper 服务器之间的通信端口号(心跳端口号)
(2) 创建myid文件
首先,根据配置文件zoo.cfg中配置的dataDir目录,创建zkdataDir文件夹,具体命令如下:
[hadoop@node1 conf]$ mkdir -p /opt/software/zookeeper/zkdataDir
其次,在zkdataDir目录下创建myid文件,该文件里面的内容是服务器编号(node1服务器对应编号1,node2服务器对应编号2,node3服务器对应编号3),具体命令如下:
[hadoop@node1 conf]$ cd /opt/software/zookeeper/zkdataDir
[hadoop@node1 zkdataDir]$ echo 1 > /opt/software/zookeeper/zkdataDir/myid
[hadoop@node1 zkdataDir]$ ls
myid
[hadoop@node1 zkdataDir]$ cat myid
1
[hadoop@node1 zkdataDir]$
(3)分发ZooKeeper相关文件值其他节点
首先,将已经在node1主机上已经安装好的ZooKeeper 目录文件拷贝到node2、node3节点上。具体命令如下:
[hadoop@node1 zkdataDir]$ cd /opt/software/
[hadoop@node1 software]$ rsync -avz --exclude 'hadoop' --exclude 'hadoop-3.3.4' --exclude 'jdk-17.0.13' --exclude 'jdk' /opt/software/ node2:/opt/software/
[hadoop@node1 software]$ rsync -avz --exclude 'hadoop' --exclude 'hadoop-3.3.4' --exclude 'jdk-17.0.13' --exclude 'jdk' /opt/software/ node3:/opt/software/
--exclude选项来排除不需要同步的目录。
其次,修改node2、node3 节点的/usr/local/zookeeper/zdata/目录下的myid的值分别改为2和3。执行以下命令:
node2节点:
[hadoop@node2 ~]$ echo 2 > /opt/software/zookeeper/zkdataDir/myid
[hadoop@node2 ~]$ cat /opt/software/zookeeper/zkdataDir/myid
2
node3节点:
[hadoop@node3 ~]$ echo 3 > /opt/software/zookeeper/zkdataDir/myid
[hadoop@node3 ~]$ cat /opt/software/zookeeper/zkdataDir/myid
3
(3)配置环境变量
在使用vim /etc/profile文件的最末尾中添加ZooKeeper 环境变量 【node1、node2、node3三台都要加上ZooKeeper环境变量的配置】
[hadoop@node1 software]$ sudo vim /etc/profile
在文件末尾添加内容过如下:
export ZK_HOME=/opt/software/zookeeper
export PATH=$ZK_HOME/bin:$PATH
(4)环境变量生效
node1、node2、node3三台都要刷新/etc/profile配置文件,使环境变量生效,具体如下命令
source /etc/profile
2.3 ZooKeeper服务的启动和关闭
截止目前,我们已经把ZooKeeper 集群部署完毕,接下来进行启动和关闭ZooKeeper 服务,若ZooKeeper 启动和关闭成功,则表示ZooKeeper 集群部署成功。否则,ZooKeeper 集群部署失败。
(1) 启动ZooKeeper 服务
首先依次在node1、node2、node3三台主机上启动ZooKeeper 服务,具体命令如下:
zkServer.sh start
其次,执行相关命令查看该节点ZooKeeper 的角色,具体命令如下:
zkServer.sh status
可以看到此时node2被选举为leader
#node1
[hadoop@node1 ~]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/software/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
[hadoop@node1 ~]$
#node2
[hadoop@node2 ~]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/software/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader
#node3
[hadoop@node3 ~]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/software/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
[hadoop@node3 ~]$
通过jps查看进程,多出了名称为QuorumPeerMain的进程
[hadoop@node1 ~]$ jps
4761 QuorumPeerMain
4863 Jps
(2)关闭ZooKeeper服务
若想关闭ZooKeeper服务,依次在node1、node2、node3主机上执行相关命令即可,具体命令如下
zkServer.sh stop
如果只关闭leader,会重新选举出新的leader
至此,ZooKeeper就部署完成。
附: ZK集群启动停止脚本
- 在node1的/home/hadoop/bin目录下创建脚本
[hadoop@node1 ~]$ cd /home/hadoop/bin [hadoop@node1 bin]$ vim zk.sh在脚本中编写如下内容:
#!/bin/bash case $1 in "start"){ for i in node1 node2 node3 do echo ---------- zookeeper $i 启动 ------------ ssh $i "source /etc/profile; /opt/software/zookeeper/bin/zkServer.sh start" done };; "stop"){ for i in node1 node2 node3 do echo ---------- zookeeper $i 停止 ------------ ssh $i "source /etc/profile; /opt/software/zookeeper/bin/zkServer.sh stop" done };; "status"){ for i in node1 node2 node3 do echo ---------- zookeeper $i 状态 ------------ ssh $i "source /etc/profile; /opt/software/zookeeper/bin/zkServer.sh status" done };; esac
- 增加脚本执行权限
[hadoop@node1 bin]$ chmod 777 zk.sh常用的操作命令:
zk.sh startZookeeper集群启动zk.sh stopZookeeper集群关闭zk.sh statusZookeeper集群状态
更多推荐


所有评论(0)