6.824 KVRaft Lab 3A
实验目的
- 用上次实现的Raft,实现一个Fault-tolerant Key/Value Service
- Lab 3A不用修改任何Raft代码!
- 要实现Clerk和Server两个部分。
- Clerk是提供给用户的library。用户通过它来使用我们的KV服务。它对用户隐藏了多服务器的细节——用户不用知道有几个服务器,哪个是Leader。Clerk会随机找一台服务器调用RPC,如果它不是Leader,Clerk会自动换一台服务器,直到找到Leader。如果命令提交失败,Clerk也会自动重试。
- Server要实现2个RPC函数:Get()和PutAppend,以及一个运行在独立线程的applier loop。
- 因为客户端会重试,所以服务器要实现去重。做法是,客户端每次请求加上一个客户端ID,以及请求的序列号。
RPC handler
- 两个RPC handler:Get和PutAppend,做的事情差不多一样。调用raft的Start()函数,将Op放到log中。Start()会返回一个index。我们在一个map中登记,我们要等待这个Index。然后我们等待applier loop通知。
- 等待通知可以用chan实现。kv结构体中应该有一个
map[int]chan ApplyResult
。让applier可以根据Index来查找chan。 - 等待过程中要时不时检查Raft的term有没有改变。如果变了就说明我们不是Leader了。可以返回WrongLeader = true)
- app