实验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报告。教师依据报告中的实际结果、源码、截图和个人记录评分。