ZooKeeper 集群配置实验指南
1. 解压安装包
(1)将 apache-zookeeper-3.5.7-bin.tar.gz 复制到 master 主机的 /opt/software 目录下。
(2)在 master 主机上解压 ZooKeeper 安装包并移动到 /opt/apps 目录。
cd /opt/software
tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /opt/apps
cd /opt/apps
mv apache-zookeeper-3.5.7-bin zookeeper2. 创建数据和日志存放目录
(1)进入 ZooKeeper 安装目录并创建 data 目录(用于存放快照数据)和 log 目录(用于存放事务日志)。
cd /opt/apps/zookeeper
mkdir data # 存放快照数据
mkdir log # 存放事务日志3. 修改配置文件
(1)在 ZooKeeper 配置目录中创建 zoo.cfg 文件。
cd /opt/apps/zookeeper/conf
touch zoo.cfg(2)编辑 zoo.cfg 文件。
在master路径/opt/apps/zookeeper/conf下,拷贝zoo_sample.cfg为zoo.cfg
cd /opt/apps/zookeeper/conf
cp -v zoo_sample.cfg zoo.cfg在 FinalShell 的文件浏览器中找到
/opt/apps/zookeeper/conf/zoo.cfg文件,双击打开编辑器。将以下内容配置
zoo.cfg文件:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/apps/zookeeper/data
dataLogDir=/opt/apps/zookeeper/log
clientPort=2181
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888参数解释:
tickTime:ZooKeeper 服务器之间或客户端与服务器之间心跳时间的基本单位(2000毫秒)。
initLimit:Leader 在初始连接时最多等待 10 × 2 = 20 秒 来完成与 Follower 的连接和同步操作。
syncLimit:follower与leader之间发送消息请求和应答之间能容忍的最多心跳数(5个心跳,10秒)。
dataDir:保存Zookeeper数据的路径。
dataLogDir:保存Zookeeper事务日志的路径。
clientPort:客户端连接的端口。
server.A=B:C:D:集群服务器配置,A为服务器编号,B为 IP 地址,C为数据同步端口,D为 Leader 选举端口。
(3)保存并关闭文件。
4. 创建服务器 myid 文件
(1)在 master 主机的 data 目录下创建 myid 文件。
cd /opt/apps/zookeeper/data
touch myid(2)使用 FinalShell 的内部编辑器来编辑 myid 文件,内容设置为 1,对应 server.1。
打开 FinalShell 并连接到
master主机。在 FinalShell 的文件浏览器中找到
/opt/apps/zookeeper/data/myid文件,双击打开myid文件。在编辑器中输入
1,然后保存并关闭文件。
5. 拷贝 ZooKeeper 配置至从节点
(1)将 zookeeper 目录从 master 拷贝到 slave1 和 slave2。
scp -r /opt/apps/zookeeper root@slave1:/opt/apps
scp -r /opt/apps/zookeeper root@slave2:/opt/apps6. 修改Slave1和Slave2服务器 myid 文件
使用 FinalShell 的内部编辑器来修改Slave1和Slave2服务器上的 myid 文件,并通过 FinalShell 编辑器分别设置为 2 和 3。
# 在 slave1 上
cd /opt/apps/zookeeper/data
touch myid
# 使用 FinalShell 编辑器将内容修改为 "2"
# 在 slave2 上
cd /opt/apps/zookeeper/data
touch myid
# 使用 FinalShell 编辑器将内容修改为 "3"7. 添加环境变量
(1)在 master 上修改环境变量:
使用 FinalShell 的内部编辑器编辑 /etc/profile 文件。
在 FinalShell 的文件浏览器中找到
/etc/profile文件,双击打开编辑器。将以下内容添加到文件中:
# ZOOKEEPER
export ZOOKEEPER_HOME=/opt/apps/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin(2)使配置生效:
source /etc/profile
(3)将 profile 文件拷贝到 slave1 和 slave2:
scp /etc/profile root@slave1:/etc/
scp /etc/profile root@slave2:/etc/
(4)在 slave1 和 slave2 上使环境变量生效:
source /etc/profile
7. 启动集群
(1)依次在 master、slave1 和 slave2 启动 ZooKeeper 集群,建议按照 myid 从小到大的顺序启动。
zkServer.sh start
(2)查看每个节点的 ZooKeeper 状态:
zkServer.sh status
【如正常启动,会看到下方图示的界面】
master节点:

slave1节点:

slave2节点:

从截图中可以看到,slave1服务器成为了leader主节点,其余为follower从节点。
8. 检查集群状态
(1)使用 zkServer.sh status 查看集群状态,master、slave1、slave2 将分别显示为 Leader 和 Follower。
(2)使用 jps 查看进程,确认 ZooKeeper 已成功启动,输出 QuorumPeerMain 表示成功。
jps
使用命令jps查看三台主机的进程:
出现
QuorumPeerMain则说明zookeeper启动成功。

QuorumPeerMain 是 ZooKeeper 集群模式的启动程序,用于启动和管理多个 ZooKeeper 服务器节点,实现分布式应用程序的协调工作。
分布式zookeeper集群搭建完毕!
9. 关闭集群
当需要停止 ZooKeeper 时,可以在所有节点上运行以下命令:
zkServer.sh stop
通过这次实验,完成了基于 ZooKeeper 3.5.7 的分布式集群环境搭建,所有节点能够协同工作并进行选举。
五、实验
实验1:通过文件实现 ZooKeeper 通知机制
实验目标:
通过创建和修改 ZooKeeper 节点的数据,学习如何利用 ZooKeeper 的通知机制来监听节点和子节点的变化,模拟文件修改通知的机制。
实验环境:
ZooKeeper 已安装并运行。
Hadoop 集群有多个节点(
master、slave1、slave2),并通过 ZooKeeper 进行协调。通过 ZooKeeper 客户端
zkCli.sh在各个节点(master、slave1、slave2)执行操作。zkCli.sh是 ZooKeeper 提供的命令行客户端工具,用于与 ZooKeeper 服务器进行交互
实验步骤:
步骤 1:启动 ZooKeeper 客户端
# 分别在master\slave1\slave2上执行操作
zkCli.sh注意:以下的操作是在ZooKeeper 客户端的命令行下进行操作
步骤 2:创建节点
create /cookie "大盘鸡"
# ZooKeeper中的每一个节点都称为znode。这些znodes可以存储数据,也可以作为父节点包含子节点步骤 3:查看节点数据
# 在master/slave1/slave2上分别操作,都可以看到信息
get /cookie步骤 4:修改节点数据
# 在slave1上进行修改节点数据
set /cookie "手抓饭"
# 在master/slave1/slave2上分别操作,都可以看到修改后的信息
get /cookie步骤 5:监听节点变化
# 在 master 节点上执行, 通过 `get -w` 监听 `master` 节点上的 `/cookie` 节点变化。
get -w /cookie 通过 get -w 监听 master 节点上的 /cookie 节点变化。
# 在 slave2 上执行修改节点信息
set /cookie "烤全羊" 观察 master 节点上监听的输出。
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/cookie
# 表示 ZooKeeper 监控到 /cookie 节点的数据发生了变化,并通知客户端当前与服务器连接正常
# (SyncConnected 状态)。步骤 6:创建子节点并监听子节点变化
# 在 master 节点上执行
ls -w /cookie使用 ls -w 监听 master 节点上 / 目录下的子节点变化。
# 在 slave2 上执行
create /cookie/drink "奶茶"观察 master 节点上监听的输出。
步骤 7:删除节点并触发通知
# 在 slave1上执行,依次删除节点
delete /cookie/drink
delete /cookie
# 或者递归删除
deleteall /cookie观察 master 节点上的监听输出。
实验总结:
通过模拟实验,将学习如何使用 ZooKeeper 的命令创建和修改节点,并通过监听机制实时获取节点或子节点的变化通知。这种机制类似于分布式系统中的协调和通知功能,像是在文件系统中对文件变化的监控。
实验2:通过 ZooKeeper 实现集群管理
实验目标:
通过创建和删除 ZooKeeper 节点,模拟分布式集群中的节点管理。实现节点的注册、心跳检测、故障感知等集群管理功能,模拟集群中的节点加入和退出。
实验环境:
ZooKeeper 已安装并启动。
Hadoop 集群有多个节点(
master、slave1、slave2),并通过 ZooKeeper 进行协调。分别在master\slave1\slave2上执行操作
zkCli.sh启动ZooKeeper客户端。
实验步骤:
注意:以下的操作是在ZooKeeper 客户端的命令行下进行操作
步骤 1:模拟节点注册(节点加入集群)
在 ZooKeeper 中,每个节点在启动时,会在 ZooKeeper 上注册一个临时节点,表示该节点已加入集群。我们通过在 /cluster/ 下创建临时节点,模拟集群中的节点注册。
# 在 slave1 上执行,先创建父节点,再注册一个临时节点
create /cluster
create -e /cluster/slave1 "slave1 active"
# -e:表示创建的是临时节点,节点会在客户端断开连接时自动删除。-e参数表示创建临时节点,如果slave1断开连接,ZooKeeper 会自动删除这个节点。
# 在 slave2上执行,先创建父节点,再注册一个临时节点
create /cluster
create -e /cluster/slave2 "slave2 active" 步骤 2:监听节点状态变化(监控节点)
在 master 节点上,通过监听 /cluster 目录下的节点变化,可以实时监控集群中节点的加入或失效。
# 在 master 上执行,监听所有集群节点的状态变化
ls -w /cluster步骤 3:模拟节点故障(节点离开集群)
在分布式系统中,节点可能因为网络故障或宕机而退出集群。当 ZooKeeper 中的临时节点被删除时,表示节点失效。在本实验中,可以通过手动删除节点或关闭连接来模拟节点故障。
# 在 slave1 上执行,删除节点以模拟节点故障
delete /cluster/slave1观察 master 节点上监听的输出,ZooKeeper 会通知 master,节点 /cluster/slave1 已失效。
步骤 4:模拟节点心跳检测(节点自动失效)
ZooKeeper 的临时节点特性可以自动管理节点的连接状态。当某个节点与 ZooKeeper 断开连接时,ZooKeeper 会自动删除该节点的临时节点。你可以通过关闭 zkCli.sh 来模拟这种情况:
# 在 slave2 上断开连接(关闭 zkCli.sh), 或者按下ctrl + C
quit观察 master 上的输出,/cluster/slave2 节点会自动被删除,表示节点已失效。
步骤 5:节点恢复(重新加入集群)
如果一个失效的节点重新连接到集群,它可以再次注册到 ZooKeeper。此时,集群中的其他节点将收到新的节点加入的通知。
# 重新启动 slave2 上的 zkCli.sh 并注册节点
create -e /cluster/slave2 "slave2 active"实验总结:
通过此实验,ZooKeeper 通过临时节点和Watcher 机制实现了集群管理功能,能够监控分布式系统中节点的加入【命名服务】和退出、故障检测、节点恢复等。ZooKeeper 在分布式集群管理中,可以确保集群的高可用性和动态扩展。
实验3:使用 ZooKeeper 实现简单的分布式锁
实验目标:
通过这个实验,你将学会如何使用 ZooKeeper 来模拟分布式系统中的锁机制,让多个节点按顺序访问共享资源。这样可以保证每次只有一个节点能够执行任务,避免冲突。
实验环境:
ZooKeeper 已安装并运行。
有三个节点(
master、slave1、slave2)。使用 ZooKeeper 命令行客户端
zkCli.sh来操作。
注意:以下的操作是在ZooKeeper 客户端的命令行下进行操作
实验步骤:
步骤 1:创建用于锁的目录
首先,我们需要创建一个专门用来管理“锁”的目录。在这个目录中,所有节点都会争夺锁。
在
master节点上运行:create /locks这会创建一个叫
/locks的目录,所有节点将会在这里争夺锁。
步骤 2:节点争夺锁
每个节点想要获得锁时,会在 /locks 目录下创建一个临时且有序的节点。ZooKeeper 会为每个节点分配一个带编号的节点,谁的编号最小,谁就拿到锁。
在
slave1上执行:create -e -s /locks/lock_ "slave1 requests lock"
# -e:表示创建的是临时节点,节点会在客户端断开连接时自动删除。
# -s:表示创建的是有序节点,ZooKeeper 会在节点名称后自动加上递增的序号。
# 这会创建一个类似于 /locks/lock_0000000000 的节点,用来标识slave1。【这也是命名服务】这会创建一个像
/locks/lock_00000001这样的节点。在
slave2上执行:create -e -s /locks/lock_ "slave2 requests lock"这会创建一个像
/locks/lock_0000000001这样的节点。
步骤 3:谁拿到锁?
ZooKeeper 会根据节点编号来决定谁拿到锁,编号最小的节点获胜。
在
slave1和slave2上运行以下命令来查看锁的状态:ls /locks假设输出为:
[lock_0000000000, lock_0000000001]slave1创建的节点是lock_0000000000,它的编号最小,因此它获得锁。slave2必须等待,因为它的节点是lock_0000000001。
步骤 4:slave2 监听锁的释放
当 slave1 完成任务并释放锁时,slave2 需要监听并等待锁的释放。我们可以让 slave2 监听 slave1 的节点。
在
slave2上监听slave1的节点(即lock_0000000000):get -w /locks/lock_0000000000
步骤 5:slave1 释放锁
slave1 完成任务后,会删除它的节点,表示它释放了锁。
在
slave1上执行:delete /locks/lock_0000000000这样,
slave1就释放了锁。
步骤 6:slave2 获取锁的通知
当 slave1 删除节点时,slave2 会收到通知,它现在可以继续执行任务了。
slave2会显示以下内容,表示它现在可以继续:WATCHER::
WatchedEvent state:SyncConnected type:NodeDeleted path:/locks/lock_00000001此时
slave2获得锁并可以执行任务。
步骤 7:验证锁状态
在
slave2上运行:ls /locks如果输出为:
[lock_0000000001]说明
slave2已经获得了锁,现在可以执行任务。
总结:
每个节点通过在
/locks目录下创建有序临时节点争夺锁,编号最小的节点获得锁。如果没有拿到锁,节点会监听前一个节点的删除事件,直到轮到自己为止。
通过这个实验,学习了如何使用 ZooKeeper 实现简单的