你看,我就说吧,________。

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 文件,帮助你确认在什么情况下出现了什么问题。 以HTML格式输出针对raft代码的测试结果

当然,光靠这个并不能帮你 debug 代码中的问题,关于如何实现更好的 debug 工具,请看这篇文章

题目

Implement Raft leader election and heartbeats (AppendEntries RPCs 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. Run go test -run 3A to 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 数据可能丢失的,这边直接实现最终版本。

阅读全文 ⟶