项目在架构上使用了基于 mit6.824 的 raft 协议实现,使用 raft 协议来实现项目的共识,使用了 lsm tree 来实现数据储存服务。
项目的 raft 模块使用了基于 mit 6.824 lab2 的 raft 实现思路,具体的实现参照 raft-extended 论文实现; 实现了 raft 协议中的 leader 选举,日志复制、日志对齐、日志压缩快照等功能,实现了基本的共识协商;
不足之处: 这里没有实现对于集群中成员变更的情况下的共识的实现 统一使用的是粒度比较大的 mutex,可以考虑使用粒度更小的 atomic
基于 lab3 实现了一个基本的 kv 客户端和服务端的交互, 实现了基本的 client 端和 server 端之间的交互,同时保证了命令的顺序一致性和强一致性;
不足之处: 为了方便地实现顺序一致性,让读请求也只能通过 leader 来实现,这样效率有点低,可以划分事务请求的方式,让非写请求在所有节点都可以访问,而写请求只能在 leader 节点访问,这样效率会更高;
基于 lsm Tree 的思想为系统实现了数据存储功能,实现了内存表的读写,预写日志防止内存表丢失,内存表向磁盘 sstable 转移,以及 sstable 在磁盘中的分层管理;
后面这里用了跳表来优化,(没有选择红黑树是因为实现太复杂了,性能收益不大),从benchmark来看,从读取的性能能优化25%左右:
基于BST的:
基于跳表的:
不足之处: 跳表的锁粒度太大了(这里还是使用的读写锁),可以换成左边界锁来优化
ps:
1.系统为了实现多种极端情况下的测试,暂定没有实现 RPC,任然使用的 labrpc,这样可以更方便的测试,如果要实现部署使用,可以使用 gRPC 等成熟的 RPC 解决方案实现;
2.暂时只支持 string:string 的储存.
项目已经通过所有 mit 测试,代码覆盖率都在 90%以上