## 资料
[Raft 算法介绍 - 谭新宇的博客 (tanxinyu.work)](https://tanxinyu.work/raft/)
## 过程
[Raft](1%20一切皆项目/搁置中/Q2:做CS的经典lab%201/Q2:做CS的经典lab/Raft.md)
这个实验是关于实现一个单机版的键值存储服务器。以下是这个实验的主要内容和运行方法:
1. 实验目标:
- 实现一个键值存储服务器,支持 Put、Append 和 Get 操作。
- 确保每个操作只执行一次,即使在网络故障的情况下。
- 实现线性化(linearizable)操作。
2. 准备工作:
- 确保你在 ~/6.5840 目录下。
- 使用 git pull 获取最新的实验代码。
3. 运行测试:
`cd ~/6.5840 git pull cd src/kvsrv go test`
4. 实现步骤:
- 修改 client.go 中的 Clerk Put/Append/Get 方法,添加 RPC 发送代码。
- 在 server.go 中实现 Put、Append 和 Get 的 RPC 处理程序。
- 修改代码以处理网络故障(丢包)情况。
- 实现重试机制和重复请求过滤。
5. 测试通过标准:
- 你的实现应该通过所有测试,包括单客户端、多客户端、不可靠网络等情况。
- 使用 go test -race 确保代码没有竞态条件。
6. 关键实现点:
- 确保每个操作只执行一次,即使在重试的情况下。
- 实现唯一标识客户端操作的机制。
- 考虑服务器需要维护哪些状态来处理重复请求。
- 设计一个能快速释放服务器内存的重复检测方案。
这个实验主要挑战在于处理网络不可靠性的同时保证操作的正确性和一致性。你需要仔细考虑如何在客户端和服务器端实现重试和去重机制。