MIT 6.5840 分布式系统 Lab 2: Key/Value Server

本实验是构建一个单节点的Key/Value服务,该服务确保即使是在网络故障的情况下,每个操作只执行一次,且这些操作是可线性化的。
服务支持三种操作:

  • Get(Key) : 获取与Key对应的Value,如果Key不存在,返回空字符串“”
  • Put(Key, Value) : 如果Key已存在,更新现有的Value;不存在,插入新的Key-Value
  • Append(Key, Value) : 向Key对应的Value追加新的Value,即Put(Key, Get(Key) + Value),返回旧的Value

手册:https://pdos.csail.mit.edu/6.824/labs/lab-kvsrv.html

思路:

  • Server用map存储Key/Value键值对,对map操作时加锁
  • 每个Client分配一个独立的ClientId,随机生成
  • Client的每个操作分配一个序列号Seq,Seq从零开始自增
  • Client的每个操作携带上ClientId和Seq
  • Server保存每个ClientId所对应的最新的Seq和相关数据
  • Server收到Client的操作时,根据ClientId查询Seq,如果Seq一致,则忽略此操作,返回已保存的数据
  • Get操作是幂等的,无需记录,只记录Put和Append

结果

go test
Test: one client ...
  ... Passed -- t  3.5 nrpc 19493 ops 19493
Test: many clients ...
  ... Passed -- t  3.3 nrpc 34525 ops 34525
Test: unreliable net, many clients ...
  ... Passed -- t  3.3 nrpc  1129 ops  922
Test: concurrent append to same key, unreliable ...
  ... Passed -- t  0.2 nrpc    59 ops   52
Test: memory use get ...
  ... Passed -- t  0.4 nrpc     4 ops    0
Test: memory use put ...
  ... Passed -- t  0.3 nrpc     2 ops    0
Test: memory use append ...
  ... Passed -- t  0.6 nrpc     2 ops    0
Test: memory use many puts ...
  ... Passed -- t 19.0 nrpc 100000 ops    0
Test: memory use many gets ...
  ... Passed -- t 20.0 nrpc 100001 ops    0
PASS
ok      6.5840/kvsrv    52.132s

代码:https://github.com/tlxxzj/6.5840-Distributed-Systems/tree/lab2-key-value-server/src/kvsrv


已发布

分类

来自

标签:

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注