你看,我就说吧,________。
MIT 6.5840 构建 Raft 调试工具
工欲善其事,必先利其器。 ——《论语·卫灵公》
目标
本文参考这篇博客,对代码做了一些调整。
在实现 Labs 的过程中,为了弄清楚系统究竟在干什么,以及哪里出了问题,需要找到一种比较方便的方法。在分布式系统中,我们没法像单体应用程序那样可以用gdb或者pdb做调试,传统的print语句也帮不上什么忙,我们需要依赖对日志的分析。
用于调试的日志最重要的是要包含什么角色 在什么时间 做了什么类型 的事情,然后我们就可以设计工具来对日志的输出进行排版上的美化。简单来说,我们会让 Go 代码输出特定格式的日志,然后通过 Python 的 Rich 库解析日志,输出下图这样的结果。
图中包含三个维度的信息,纵轴自上而下代表时间的先后顺序(生产环境上使用需要保证各节点的时间进行同步,本例中都是单机运行无所谓),横轴代表不同的角色(节点),不同的颜色代表不同类型的事件。
Go 日志代码
为了方便 Python 脚本的处理,日志需要用指定的格式生成。我们定义一个单独的包来编写相关代码,方便其他包来调用。
…MIT 6.5840 Lab 3A: Raft - leader election (2025)
前言
今年 Raft lab 的测试新增了一个功能,可以在测试失败时输出下面这样的 HTML 文件,帮助你确认在什么情况下出现了什么问题。

当然,光靠这个并不能帮你 debug 代码中的问题,关于如何实现更好的 debug 工具,请看这篇文章。
题目
Implement Raft leader election and heartbeats (
…AppendEntriesRPCs with no log entries). The goal for Part 3A is for a single leader to be elected, for the leader to remain the leader if there are no failures, and for a new leader to take over if the old leader fails or if packets to/from the old leader are lost. Rungo test -run 3Ato test your 3A code.
MIT 6.5840 Lab 2: Key/Value Server (2025)
前言
Lab 的页面 6.5840 Lab 2: Key/Value Server
2025 版的 Lab2 相比 2024 版做了一些修改,取消了Append操作,增加了一个version字段。每年的 Lab 都可能会做一些修改,所有的历史页面都在这里,上面的 Lab 页面是最新年份的,阅读题目时请确认是不是 2025 年的页面。
注意,题目的要求是先实现稳定连接版本的,后面再实现 RPC 数据可能丢失的,这边直接实现最终版本。
…