本页目录
  1. 目标与起点
  2. 1 节点监听与临时节点
  3. 2 两个候选与主节点交接
  4. 3 多数派观察与恢复
  5. 报告提交前核对

实验4:ZooKeeper协调服务(2学时)

在Windows打开学生包starter/reports/lab04-report.docx,另存为学号+班级+姓名+实验4报告.docx。每步按下方列出的Word栏目填写结果、粘贴文本和插入图片,最终提交这一份Word报告。

目标与起点

从L04镜像开始,提供三个ZooKeeper实例及Python/Kazoo脚手架。观察临时节点、变化监听和主节点交接,使用给定Kazoo Election脚手架开展协调实验。

建议90分钟:概念与启动15;节点操作20;选举25;多数派观察15;整理报告15。

labctl stop
labctl start lab04
labctl doctor
cd ~/work/lab04
mkdir -p evidence
/opt/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181

三个实例各有自己的目录和端口2181、2182、2183。采用单机三进程拓扑,观察会话、选举和多数派协议行为。

准备阶段先运行labctl doctor并记录镜像编号;截图、结果与源码按记录与提交方法整理。

1 节点监听与临时节点

在zkCli中逐条执行:

create /lesson hello
get /lesson
get -w /lesson
set /lesson changed
get /lesson

记录watch事件。这里使用的一次性watch触发后需要重新注册;Python ChildrenWatch recipe会帮助重新监听,不应把两者混为一谈。

继续执行 create -e /temporary hello,用第二个zkCli查看 ls /。第一个会话 quit 后,在第二个会话再次查看。节点删除与会话结束有关,异常断线时可能要等会话超时。

本步填写 Word 报告:1 节点监听与临时节点

粘贴和填写

  • 节点操作:粘贴create、get、get -w、set、get的实际命令与输出,保留watch事件原文。
  • 会话前后:填写两会话的端口,粘贴创建临时节点、另一会话查询、创建会话quit、再次查询的输出。

预期结果核对

核对项目 预期结果
普通节点读取 hello→changed
watch 注册后修改触发一次事件
临时节点 创建会话退出后消失

插图位置

  • 图1 一次watch事件(模板标识 01-watch.png):包含监听注册命令、set修改和触发事件。
  • 图2 临时节点退出前(模板标识 01-temporary-before.png):同时包含创建会话与观察会话,能看到/temporary存在。
  • 图3 临时节点退出后(模板标识 01-temporary-after.png):显示创建会话quit,以及观察会话再次查询时节点消失。

2 两个候选与主节点交接

退出zkCli。个人修改:保留命令行名称参数,在lead()中增加一行带args.name的个人标记,例如学号末四位。打开两个SSH终端,在同一目录分别运行下列命令,将1234换成自己的学号末四位:

# 终端A
python -u election.py worker-1234-A 2>&1 | tee evidence/02-worker-A.log

终端A保持运行,在终端B执行:

python -u election.py worker-1234-B 2>&1 | tee evidence/02-worker-B.log

只应有一个进程输出 LEADER。记录谁先成为主节点;在该进程终端按Ctrl+C正常退出,观察另一个候选成为主节点。脚手架已提供协调实现,你要修改候选名称、观察输出并解释过程。

把实际观察填入 evidence.json,例如:

{"before":"worker-A","after":"worker-B"}

自动检查验证记录格式;交接过程的实际名称、日志片段及前后截图填写到Word报告。

本步填写 Word 报告:2 两个候选与主节点交接

粘贴和填写

  • 个人修改:粘贴新增个人标记的代码行,填写实际worker名称;完整election.py放源码区。
  • 双终端日志:粘贴两个候选的启动命令、首次LEADER行、原主节点退出与新LEADER行。
  • 实际记录:粘贴evidence.json全文;before和after填写实际不同名称,说明继任顺序。

预期结果核对

核对项目 预期结果
同时存活候选 当前主节点只有一个
交接 原主节点正常退出 另一候选继任

插图位置

  • 图4 交接前(模板标识 02-before.png):两个终端在同一张图中,显示两个候选和当前唯一LEADER。
  • 图5 交接后(模板标识 02-after.png):显示原主节点Ctrl+C退出,以及另一候选新出现的LEADER行;区分历史日志和当前进程。

3 多数派观察与恢复

停止候选程序,然后依次执行:

labctl zk-stop 3
# 用zkCli连接2181,尝试读取/lesson,之后quit
labctl zk-stop 2
# 此时只剩一个实例;新写入不能获得多数派提交
labctl zk-start 2
labctl zk-start 3

失去多数派时客户端可能等待或重试,等待超时后按Ctrl+C退出,恢复实例再继续。恢复到至少两个实例后重新连接。观察两个实例可用、一个实例不可提交新写入的差别。

多数派验证使用一次具体的新写入:两个实例存活时设置set /lesson two-alive,确认get /lesson可读回;只剩一个时尝试set /lesson one-alive,记录等待或连接状态。恢复两个以上实例后再次写入set /lesson restored并读回。连接2181时用get -s /lesson记录每次操作的状态信息;无法提交时记录实际输出与等待时长。

本步填写 Word 报告:3 多数派观察与恢复

粘贴和填写

  • 多数派操作表:按存活3、2、1、恢复3实例填:停止/启动命令、set命令、读回值、成功响应与等待时长。
  • 恢复验证:粘贴两实例写two-alive、单实例尝试one-alive、恢复写restored及读取的关键输出。
  • 最终检查:粘贴labctl check lab04的实际输出。

预期结果核对

核对项目 预期结果
存活3或2实例 可以提交新写入
存活1实例 无法获得多数派提交
恢复至少2实例 可以再次写入并读回

插图位置

  • 图6 单实例写入等待(模板标识 03-quorum-wait.png):显示仅一实例时新写入等待或重连的实际状态。
  • 图7 恢复写入(模板标识 03-quorum-restored.png):显示恢复实例后的set /lesson restored和get读回结果。

报告提交前核对

对应 Word 的“源码与运行说明”区

  • election.py全文。

按模板粘贴实际运行内容,保留缩进并填写文件在虚拟机中的绝对路径。

逐项检查

  • [ ] 报告“1 节点监听与临时节点”的实际结果及填写栏目完整。
  • [ ] 报告“2 两个候选与主节点交接”的实际结果及填写栏目完整。
  • [ ] 报告“3 多数派观察与恢复”的实际结果及填写栏目完整。
  • [ ] 图1 一次watch事件已插入,符合模板中的截图要求。
  • [ ] 图2 临时节点退出前已插入,符合模板中的截图要求。
  • [ ] 图3 临时节点退出后已插入,符合模板中的截图要求。
  • [ ] 图4 交接前已插入,符合模板中的截图要求。
  • [ ] 图5 交接后已插入,符合模板中的截图要求。
  • [ ] 图6 单实例写入等待已插入,符合模板中的截图要求。
  • [ ] 图7 恢复写入已插入,符合模板中的截图要求。
  • [ ] 姓名、学号、班级等身份信息完整;实训填写全体成员及个人记录。
  • [ ] AI使用情况报告填写简短说明或粘贴一张相关截图;未使用填“未使用”。
  • [ ] 保存后重新用Microsoft Word打开,检查截图和文本可读。

按Word记录与提交方法提交填写完成的一份Word报告。教师依据报告中的实际结果、源码、截图和个人记录评分。