MIT6824——lab3(实现一个kv存储)的一些实现,问题,和思考

总结,问题

1 总结

1.1 KV存储服务流程

  • 客户端给kv(leader,如果不是leader会重新找一个kv)发送请求request
  • kv给raft发送请求 Start(),将request添加到日志
  • raft给其他raft节点发送请求 AppendEntires(),让其也将request添加到日志
  • raft收到过半日志复制成功请求时,通知kv执行request applyCh管道
  • kv收到执行request后,根据clientId和messageId判断是否已经执行过,未执行才执行,此时通知 broadcastCh管道 返回结果给客户端。

1.2 KVserver快照流程

  • v重启,需要读取快照,而不是从头开始执行log
  • 当leader kv的state大于阈值时,进行快照,通知leader raft调整log
  • leader raft通知其他raft节点处理快照 InstallSnapshot()
  • 其他raft节点通知kv执行快照 applyMsg管道
  • kv执行完快照,通知raft调整log CondInstallSnapshot()
  • 注意:kv只复制产生快照,raft每次收到kv的快照时,需要将快照也持久化。kv重启恢复,能够直接读取到快照。

2 问题

2.1 如何保证线性一致性?

  • raft作者文中提出的一种方法是,对于重复请求,只会执行一次。具体来说,kvserver需要保存客户端的id和本次请求的id,对于raft返回来要执行的请求,需要判断是否已经执行过,我们认为当 < kvserver的messageID那就是执行过的,不再执行,直接返回客户端。

2. 2 KVserver如何进行快照?

  • 当>阈值时,进行快照。通知leader调整log并对快照做持久化。
  • leader再通知其他raft节点安装快照,其他节点通知kv安装快照,kv再通知raft节点调整log并对快照做持久化。

你可能感兴趣的:(分布式)