李翔-大数据技术

Big data technology!

第5章 ZooKeeper集群配置

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 zookeeper

2. 创建数据和日志存放目录

(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.cfgzoo.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 拷贝到 slave1slave2

scp -r /opt/apps/zookeeper root@slave1:/opt/apps
scp -r /opt/apps/zookeeper root@slave2:/opt/apps

6. 修改Slave1和Slave2服务器 myid 文件

使用 FinalShell 的内部编辑器来修改Slave1Slave2服务器上的 myid 文件,并通过 FinalShell 编辑器分别设置为 23

# 在 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 文件拷贝到 slave1slave2

scp /etc/profile root@slave1:/etc/
scp /etc/profile root@slave2:/etc/

(4)在 slave1slave2 上使环境变量生效:

source /etc/profile

7. 启动集群

(1)依次在 masterslave1slave2 启动 ZooKeeper 集群,建议按照 myid 从小到大的顺序启动。

zkServer.sh start

(2)查看每个节点的 ZooKeeper 状态:

zkServer.sh status

【如正常启动,会看到下方图示的界面】

master节点:

image-20221001233908336

slave1节点:

image-20221001234018131

slave2节点:

image-20221001234104894

从截图中可以看到,slave1服务器成为了leader主节点,其余为follower从节点。

8. 检查集群状态

(1)使用 zkServer.sh status 查看集群状态,masterslave1slave2 将分别显示为 LeaderFollower

(2)使用 jps 查看进程,确认 ZooKeeper 已成功启动,输出 QuorumPeerMain 表示成功。

jps

使用命令jps查看三台主机的进程:

  • 出现QuorumPeerMain则说明zookeeper启动成功。

image-20221001231430619

QuorumPeerMain 是 ZooKeeper 集群模式的启动程序,用于启动和管理多个 ZooKeeper 服务器节点,实现分布式应用程序的协调工作。

分布式zookeeper集群搭建完毕!

9. 关闭集群

当需要停止 ZooKeeper 时,可以在所有节点上运行以下命令:

zkServer.sh stop

通过这次实验,完成了基于 ZooKeeper 3.5.7 的分布式集群环境搭建,所有节点能够协同工作并进行选举。


五、实验

实验1:通过文件实现 ZooKeeper 通知机制

实验目标:

通过创建和修改 ZooKeeper 节点的数据,学习如何利用 ZooKeeper 的通知机制来监听节点和子节点的变化,模拟文件修改通知的机制。

实验环境:

  • ZooKeeper 已安装并运行。

  • Hadoop 集群有多个节点(masterslave1slave2),并通过 ZooKeeper 进行协调。

  • 通过 ZooKeeper 客户端 zkCli.sh 在各个节点(masterslave1slave2)执行操作。

  • 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 集群有多个节点(masterslave1slave2),并通过 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 已安装并运行。

  • 有三个节点(masterslave1slave2)。

  • 使用 ZooKeeper 命令行客户端 zkCli.sh 来操作。


注意:以下的操作是在ZooKeeper 客户端的命令行下进行操作

实验步骤

步骤 1:创建用于锁的目录

首先,我们需要创建一个专门用来管理“锁”的目录。在这个目录中,所有节点都会争夺锁。

  1. master 节点上运行:

    create /locks 

    这会创建一个叫 /locks 的目录,所有节点将会在这里争夺锁。


步骤 2:节点争夺锁

每个节点想要获得锁时,会在 /locks 目录下创建一个临时且有序的节点。ZooKeeper 会为每个节点分配一个带编号的节点,谁的编号最小,谁就拿到锁。

  1. slave1 上执行:

    create -e -s /locks/lock_  "slave1 requests lock"

    # -e:表示创建的是临时节点,节点会在客户端断开连接时自动删除。
    # -s:表示创建的是有序节点,ZooKeeper 会在节点名称后自动加上递增的序号。
    # 这会创建一个类似于 /locks/lock_0000000000 的节点,用来标识slave1。【这也是命名服务】

    这会创建一个像 /locks/lock_00000001 这样的节点。

  2. slave2 上执行:

    create -e -s /locks/lock_  "slave2 requests lock"

    这会创建一个像 /locks/lock_0000000001 这样的节点。


步骤 3:谁拿到锁?

ZooKeeper 会根据节点编号来决定谁拿到锁,编号最小的节点获胜。

  1. slave1slave2 上运行以下命令来查看锁的状态:

    ls /locks

    假设输出为:

    [lock_0000000000, lock_0000000001]
    • slave1 创建的节点是 lock_0000000000,它的编号最小,因此它获得锁。

    • slave2 必须等待,因为它的节点是 lock_0000000001


步骤 4:slave2 监听锁的释放

slave1 完成任务并释放锁时,slave2 需要监听并等待锁的释放。我们可以让 slave2 监听 slave1 的节点。

  1. slave2 上监听 slave1 的节点(即 lock_0000000000):

    get -w /locks/lock_0000000000


步骤 5:slave1 释放锁

slave1 完成任务后,会删除它的节点,表示它释放了锁。

  1. slave1 上执行:

    delete /locks/lock_0000000000

    这样,slave1 就释放了锁。


步骤 6:slave2 获取锁的通知

slave1 删除节点时,slave2 会收到通知,它现在可以继续执行任务了。

  1. slave2 会显示以下内容,表示它现在可以继续:

    WATCHER::
    WatchedEvent state:SyncConnected type:NodeDeleted path:/locks/lock_00000001

    此时 slave2 获得锁并可以执行任务。


步骤 7:验证锁状态

  1. slave2 上运行:

    ls /locks

    如果输出为:

    [lock_0000000001]

    说明 slave2 已经获得了锁,现在可以执行任务。


总结:

  • 每个节点通过在 /locks 目录下创建有序临时节点争夺锁,编号最小的节点获得锁。

  • 如果没有拿到锁,节点会监听前一个节点的删除事件,直到轮到自己为止。

  • 通过这个实验,学习了如何使用 ZooKeeper 实现简单的


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.3

版权:李翔
备案/许可证编号为:新ICP备2024006115号-1