MIT 6.824 Distributed Systems 分布式系统课程系列3 Lab3-Fault-tolerant Key/Value Service

MIT 6.824 Distributed Systems 分布式系统课程系列3 Lab3-Fault-tolerant Key/Value Service


1.介绍


2. kv服务

架构

数据

操作

实现

一些要点

基本流程 TestBasic3A

1.append。key是server id,value是根据循环造的一个值。并记下append后的值。
2.get。用key获取获取value,跟记下的值对比。不一样就是测试失败。

1.对端收不到rpc(不执行)。
2.对端收到rpc,执行以后,回复结果时网络不通。
这两种情况rpc都会失败,得重发,但是2的情况可能造成一条命令重复执行。
想到序列号的方法,给每一个命令做一个唯一的sn,收到命令后每次判断一下sn是否已经执行过,就可能避免重复执行了。也保证了操作的幂等性。怎么做唯一sn?现实中应该也是很有讲究,这里直接用随机数简化。

TestOnePartition3A

以下走进了死路

TestManyPartitionsOneClient3A

| | 1 | 2 | 3 | 4 | 5 | 6|
| — | — | — | — | — | — | — | — | — | — |
|2 Leader1| put’’0 ca | x 0 0 y ca | x 0 1 y ca t1 | x 0 2 y t1|
|1 Leader2 | put’’0 ca | x 0 0 y ca | x 0 1 y t1 | t2|
|3 | …|
|4 | …|
|5 | …|

按这个思路来,感觉问题越来越多,越来越复杂。是不是钻了牛角尖?

| | 1 | 2 | 3 |4 |5 | index|
| — | — | — | — | — | — | — | — | — | — |
| —–>0 Leader | cmd1
| 1 | cmd1|
| 2 | cmd1|
| 3 |
| 4 |

TestPersistOneClient3A

go相关


3. log压缩

论文解读

流程

  1. kvserver每次收到正常apply的命令后需要检测一下raft的log大小,超出一定值就要发起存快照的操作。
    把本地kv数据发给raft,raft删除被快照覆盖的log,再把快照和log持久化。
    重要的原则是保持所有数据不丢,要么在快照里要么在log里,并已经持久化。

  2. 每个节点只保存一份快照。保存快照后,要记录快照最末log的index和term。

  3. leader发AE时如果对端需要的index落在自己的快照里,给对端发自己的快照,即InstallSnapshot RPC。
    否则正常发AE。

  4. raft收到快照后判断有效性,再把快照发给自己的kvserver,kvserver拿到后直接覆盖本地kv数据。log和快照都要做好持久化。

实现

一个错误场景

go相关

上次更新 2021-01-28