目录
下载地址
本地模式安装
1)安装前准备
2)配置修改
3)操作 Zookeeper
配置参数解读
Zookeeper 集群操作
集群规划
解压安装
配置服务器编号
配置 zoo.cfg 文件
集群操作
Zookeeper 集群启动停止脚本
创建脚本
增加脚本执行权限
Zookeeper 集群启动脚本
Zookeeper 集群停止脚本
Zookeeper 选举机制(面试重点)
首次启动选举
非首次启动选举
关键术语解释
下载地址
官网首页:
Apache ZooKeeper
本地模式安装
1)安装前准备
( 1 )安装 JDK
Linux环境安装 JDKhttps://blog.csdn.net/qq_45115959/article/details/141403400?spm=1001.2014.3001.5502
( 2 )拷贝 apache-zookeeper-3.5.7-bin.tar.gz 安装包到 Linux 系统下
( 3 )解压到指定目录
[lzl@hadoop12 software]$ tar -zxvf apache-zookeeper-3.5.7-
bin.tar.gz -C /opt/module/
( 4 )修改名称
[lzl@hadoop12 module]$ mv apache-zookeeper-3.5.7 -bin/
zookeeper-3.5.7
2)配置修改
( 1 )将 /opt/module/zookeeper-3.5.7/conf 这个路径下的 zoo_sample.cfg 修改为 zoo.cfg ;
[lzl@hadoop12 conf]$ mv zoo_sample.cfg zoo.cfg
( 2 )打开 zoo.cfg 文件,修改 dataDir 路径:
[lzl@hadoop12 zookeeper-3.5.7]$ vim zoo.cfg修改如下内容:
dataDir=/opt/module/zookeeper-3.5.7/zkData
( 3 )在 /opt/module/zookeeper-3.5.7/ 这个目录上创建 zkData 文件夹
[lzl@hadoop12 zookeeper-3.5.7]$ mkdir zkData
3)操作 Zookeeper
( 1 )启动 Zookeeper
[lzl@hadoop12 zookeeper-3.5.7]$ bin/zkServer.sh start
( 2 )查看进程是否启动
[lzl@hadoop12 zookeeper-3.5.7]$ jps
4020 Jps
4001 QuorumPeerMain
( 3 )查看状态
[lzl@hadoop12 zookeeper-3.5.7]$ bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.5.7/bin/../conf/zoo.cfg
Mode: standalone
( 4 )启动客户端
[lzl@hadoop12 zookeeper-3.5.7]$ bin/zkCli.sh
( 5 )退出客户端:
[zk: localhost:2181(CONNECTED) 0] quit
( 6 )停止 Zookeeper
[lzl@hadoop12 zookeeper-3.5.7]$ bin/zkServer.sh stop
配置参数解读
Zookeeper 中的配置文件 zoo.cfg 中参数含义解读如下:
1 ) tickTime = 2000 :通信心跳时间, Zookeeper 服务器与客户端心跳时间,单位毫秒
2 ) initLimit = 10 : LF 初始通信时限
Leader 和 Follower 初始连接 时能容忍的最多心跳数( tickTime 的数量)
3 ) syncLimit = 5 : LF 同步通信时限
Leader 和 Follower 之间通信时间如果超过 syncLimit * tickTime , Leader 认为 Follwer 死
掉,从服务器列表中删除 Follwer 。
4 ) dataDir : 保存 Zookeeper 中的数据
注意:默认的 tmp 目录,容易被 Linux 系统定期删除,所以一般不用默认的 tmp 目录。
5 ) clientPort = 2181 :客户端连接端口,通常不做修改。
Zookeeper 集群操作
-
集群规划
- 在 hadoop12、hadoop13 和 hadoop14 三个节点上部署 Zookeeper。
- 思考:如果是 10 台服务器,建议部署奇数台 Zookeeper,如 3 或 5 台,以确保选举机制的有效性。
-
解压安装
- 在 hadoop12 解压 Zookeeper 安装包至
/opt/module/
目录。
[lzl@hadoop12 software]$ tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /opt/module/
- 修改
apache-zookeeper-3.5.7-bin
目录名为zookeeper-3.5.7
。
[lzl@hadoop12 module]$ mv apache-zookeeper-3.5.7-bin/ zookeeper-3.5.7
- 在 hadoop12 解压 Zookeeper 安装包至
-
配置服务器编号
- 在
/opt/module/zookeeper-3.5.7/
创建zkData
目录。
[lzl@hadoop12 zookeeper-3.5.7]$ mkdir zkData
- 在
/opt/module/zookeeper-3.5.7/zkData
目录下创建myid
文件。
[lzl@hadoop12 zkData]$ vi myid
- 在文件中添加与 server 对应的编号(注意不要有多余的空白字符)。
2
- 拷贝配置好的 Zookeeper 到其他机器上,并在 hadoop13、hadoop14 上修改
myid
文件的内容为 3、4。
[lzl@hadoop12 module ]$ xsync zookeeper-3.5.7
- 在
-
配置 zoo.cfg 文件
- 重命名
/opt/module/zookeeper-3.5.7/conf/
目录下的zoo_sample.cfg
为zoo.cfg
。
[lzl@hadoop12 conf]$ mv zoo_sample.cfg zoo.cfg
- 打开
zoo.cfg
文件并配置数据存储路径及集群信息。
[lzl@hadoop12 conf]$ vim zoo.cfg
- 修改数据存储路径配置。
dataDir=/opt/module/zookeeper-3.5.7/zkData
- 增加集群配置。
server.2=hadoop12:2888:3888 server.3=hadoop13:2888:3888 server.4=hadoop14:2888:3888
- 同步
zoo.cfg
配置文件至其他节点。
[lzl@hadoop12 conf]$ xsync zoo.cfg
- 重命名
-
集群操作
- 分别启动 Zookeeper。
[lzl@hadoop12 zookeeper-3.5.7]$ bin/zkServer.sh start [lzl@hadoop13 zookeeper-3.5.7]$ bin/zkServer.sh start [lzl@hadoop14 zookeeper-3.5.7]$ bin/zkServer.sh start
- 查看状态。
[lzl@hadoop12 zookeeper-3.5.7]# bin/zkServer.sh status JMX enabled by default Using config: /opt/module/zookeeper-3.5.7/bin/../conf/zoo.cfg Mode: follower [lzl@hadoop13 zookeeper-3.5.7]# bin/zkServer.sh status JMX enabled by default Using config: /opt/module/zookeeper-3.5.7/bin/../conf/zoo.cfg Mode: leader [lzl@hadoop14 zookeeper-3.5.7]# bin/zkServer.sh status JMX enabled by default Using config: /opt/module/zookeeper-3.5.7/bin/../conf/zoo.cfg Mode: follower
Zookeeper 集群启动停止脚本
-
创建脚本
- 在 hadoop12 的
/home/lzl/bin
目录下创建脚本。[lzl@hadoop12 bin]$ vim zk.sh
- 编写脚本内容。
#!/bin/bash case $1 in "start"){for i in hadoop12 hadoop13 hadoop14doecho "---------- zookeeper $i 启动 ------------"ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh start"done};; "stop"){for i in hadoop12 hadoop13 hadoop14doecho "---------- zookeeper $i 停止 ------------"ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh stop"done};; "status"){for i in hadoop12 hadoop13 hadoop14doecho "---------- zookeeper $i 状态 ------------"ssh $i "/opt/module/zookeeper-3.5.7/bin/zkServer.sh status"done};; esac
- 在 hadoop12 的
-
增加脚本执行权限
[lzl@hadoop12 bin]$ chmod u+x zk.sh
-
Zookeeper 集群启动脚本
[lzl@hadoop12 module]$ zk.sh start
-
Zookeeper 集群停止脚本
[lzl@hadoop12 module]$ zk.sh stop
Zookeeper 选举机制(面试重点)
Zookeeper 的选举机制是为了确保集群中始终有一个 Leader 存在,以便进行数据更新和协调工作。下面是 Zookeeper 的选举机制详解,分为首次启动选举和非首次启动选举两种情况。
首次启动选举
-
服务器1启动:
- 发起一次选举。服务器1投自己一票。此时服务器1票数为1票,由于不足半数以上(3票),选举无法完成,服务器1状态保持为 LOOKING。
-
服务器2启动:
- 再发起一次选举。服务器1和2分别投自己一票并交换选票信息。
- 此时服务器1发现服务器2的 myid 比自己目前投票推举的(服务器1)大,更改选票为推举服务器2。
- 此时服务器1票数为0票,服务器2票数为2票,没有半数以上结果,选举无法完成,服务器1,2状态保持 LOOKING。
-
服务器3启动:
- 发起一次选举。此时服务器1和2都会更改选票为服务器3。
- 此次投票结果:服务器1为0票,服务器2为0票,服务器3为3票。
- 此时服务器3的票数已经超过半数,服务器3当选 Leader。服务器1,2更改状态为 FOLLOWING,服务器3更改状态为 LEADING。
-
服务器4启动:
- 发起一次选举。此时服务器1,2,3已经不是 LOOKING 状态,不会更改选票信息。
- 交换选票信息结果:服务器3为3票,服务器4为1票。
- 此时服务器4服从多数,更改选票信息为服务器3,并更改状态为 FOLLOWING。
-
服务器5启动:
- 同服务器4一样,成为 FOLLOWER。
非首次启动选举
-
触发条件:
- 服务器初始化启动。
- 服务器运行期间无法和 Leader 保持连接。
-
现有 Leader 场景:
- 如果集群中本来就存在一个 Leader,则新加入的服务器会直接和当前 Leader 进行连接,并同步状态,然后成为 FOLLOWER。
-
无 Leader 场景:
- 假设 Zookeeper 由5台服务器组成,SID 分别为 1、2、3、4、5,ZXID 分别为 8、8、8、7、7,并且此时 SID 为 3 的服务器是 Leader。某一时刻,3 和 5 服务器出现故障,因此开始进行 Leader 选举。
- (EPOCH,ZXID,SID )
- SID 为 1、2、4 的机器投票情况:(1,8,1)、(1,8,2)、(1,7,4)
- 选举 Leader 规则:
- EPOCH 大的直接胜出
- EPOCH 相同,事务 ID 大的胜出
- 事务 ID 相同,服务器 ID 大的胜出
关键术语解释
- SID (Server ID):用来唯一标识一台 ZooKeeper 集群中的机器,每台机器不能重复,与 myid 一致。
- ZXID (Zxid):是一个事务 ID,用来标识一次服务器状态的变更。在某一时刻,集群中的每台机器的 ZXID 值不一定完全一致,这和 ZooKeeper 服务器对于客户端“更新请求”的处理逻辑有关。
- EPOCH:每个 Leader 任期的代号。没有 Leader 时同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加。