在本地执行真实机制,把保存的基线与自己的新运行分开。
Python 3.11+,模型测试需要 Node.js 18+;系统支持 macOS/Linux 的 arm64/amd64。运行器固定 etcd 3.6.6(Git SHA d2809cf,上游 Go 1.24.10)。这是明确的教学基线,不声称它是最新版本,也不构成生产版本建议。不需要 Docker、API Key、付费服务或安装 Python 第三方包。
三个真实 etcd 进程共用一台主机,各有独立数据目录,动态选择回环端口。每个进程设置 GOMAXPROCS=2、作为 GC 软目标的 GOMEMLIMIT=128MiB,以及 64MiB 后端配额。GOMEMLIMIT 不限制整台机器内存。实验串行执行,三次重复通常预计约一分钟;这是估计,不是已测量的服务目标。
可移植源码 ZIP · 公开配套仓库。配套项目能独立运行,供修改故障调度与调试代码,只包含本 Lab 原创课程、合成证据与运行器。个人主页源码继续保持私有。
unzip distributed-systems-lab.zip
cd distributed-systems-lab
python3 scripts/install_etcd.py
python3 scripts/run_all.py --repeats 3 --out build/my-results
python3 scripts/run_network.py --repeats 3 --out build/my-network.json
node tests/demo-models.test.mjs
node tests/checker.test.mjs
python3 -m unittest discover -s tests -v
python3 scripts/build_site.py
python3 scripts/check_site.py
python3 -m http.server 18915 --directory build/site打开 http://127.0.0.1:18915/distributed-systems-lab/zh/。构建读取提交的 results/,因此单独写到 --out build/my-results 不覆盖基线。若有意替换自己的课程证据,用 --out results 运行,再构建并查看差异。Linux CI 在 build/ci-results 新跑一次,不改提交的 macOS 记录。
install_etcd.py 从上游公开存储下载官方发布包,并对照发布附件摘要检查 SHA-256。只提取 etcd、etcdctl、etcdutl 三个可执行文件。二进制、上游压缩包与 WAL 文件不会进入下载包或公开导出。参见固定版本发布页及安装器中四个平台的准确摘要。
运行器通过原子 mkdir 取得高资源锁。在共享编写工作区使用已有 ops 锁;独立下载与 CI 使用 build 下的本地锁。若被占用就停止,不删除他人锁。仅向自己创建的子进程发送信号,并在清理时关闭句柄。不会修改宿主防火墙或路由,不要求 root,不清理容器,不杀其他任务进程。
原始节点日志、WAL 与 SQLite 下游状态保留在忽略的 build/runs/ 中。导出器只构造指定合成字段,不复制日志,也不扫描宿主。若运行被中断,清理自己产物前先核对 owner 与所属进程。不要按年龄删除另一个任务的锁。
lab/runtime.py:回环节点、信号、JSON gateway 与清理。lab/services.py:计数/去重原子事务与 SQLite fence。lab/worker.py:恢复后执行迟到写的独立进程。scripts/run_all.py:调度、断言、重复与报告结构。web/checker.mjs:有界搜索;tests/checker.test.mjs:独立全排列基准。扩大故障范围前先读源码。断言失败是要调查的证据,不是削弱不变量的理由。保留失败原始运行,对照版本、拓扑和条件。
数据包级非对称分区、多主机时钟不确定性、磁盘损坏、灾难还原、成员变更、拜占庭故障、跨外部系统恰好一次协议都不在本版范围。代码提供小而明确的学习面,不是生产客户端库。
七个交互场景让概念可以操作;真实 Peer 代理练习保持节点存活,仅切断连接;可检索的 MIT 6.5840 地图把七个单元对应到具体官方材料及原创可运行练习。Linux CI 同时执行原有机制与新增网络对照。