MIT 6.824: lab3 Fault-Tolerant Key/Value Service Implementation

August 6, 2016
Distributed System MIT 6.824

[TOC]

lab3 是基于 lab2 实现的 Raft Consensus Algorithm 之上实现 KV Service。主要分为两部分:

  1. Part A:Key/value service without log compaction,即实现基本的分布式存储服务。
  2. Part B: Key/value service with log compaction,即在 Part A 基础上实现 log compaction。

代码分别可以 pass 各个 test case,但所有一起跑时有时会卡在 TestPersistPartition() 这里,初步猜测是 raft 的实现还有点 bug。

Code Link

Part A:Key/value service

  1. KV Database Client API

key/value database 的 client API 必须满足以下要求:

此外,API 应当一直尝试向 key/value server 发起 RPC 直到收到 positive reply;并且记住 leader id,从而尽可能避免失败次数。

  1. Raft Handler

Raft Server Handler 需要满足以下要求:

Part B: log compaction

随着运行时间的增加,raft server 的 log table 会越来越大,不仅会占用越多空间,而且一旦出现宕机则 replay 也需要越长时间。比如不加以管理,则势必影响服务的可用性。为了令其维持合理长度不至于无限增加,必须在适当的时候抛弃旧的 log entries。

这部分主要有以下实现点:

  1. Take snapshots independently

这里各个 raft server 各自独立进行 snapshot,而这并不会影响 raft 的一致性。因为数据始终从 leader 流向 follower,各个 raft server 只是将数据重新组织而已。

这部分主要解决的问题是:

需要增加和修改的地方如下:

  1. InstallSnapshot RPC

当一个 follower 远远落后于 leader(即无法在 log table 中找到匹配的 entry),则应该发送 InstallSnapshot RPC。我们参考 raft-extended paper Figure 13 设置数据结构,但有所简化:由于 lab 里的 Snapshot 不大,因此没有设置 chunk,也就是不需要对 snapshot 进行切分。

最后

写 lab3 的时候,对 lab2 的代码调整很大,发现了不少 bug 和逻辑不合理的地方,整体上对 raft 的理解更加深入了。

分布式事务

March 21, 2017
Distributed System

MIT 6.824: Lab 4 Sharded KeyValue Service Implementation

September 9, 2016
Distributed System MIT 6.824

MIT 6.824: lab2 Raft Consensus Algorithm Implementation

June 10, 2016
Distributed System MIT 6.824
comments powered by Disqus