6.824做完了,代码写的乱糟糟,想着重写一遍,整理下思路,后来发现了tinykv,相比于6.824还多了个事务,就准备把tinykv也做一下。
文档翻译
在本项目中,实现一个单机的、支持Column Family的KV存储服务。Column Family表示Key的命名空间,不同Column Family间可以有相同的Key存在。
服务提供Put/Delete/Get/Scan四种基本操作。
本项目可以拆解为两步去实现:
- 实现单机的存储引擎。
- 实现原生的服务接口。
tinykvpb.proto和kvrpcpb.proto定义了rpc接口和请求响应消息,kv/main.go中注册了RPC服务。
proto文件由protocol-buffer生成,不需要修改。
Server底层由Storage抽象类支持,需要为StandAloneStorage实现Storage的所有接口。
type Storage interface {
// Other stuffs
Write(ctx *kvrpcpb.Context, batch []Modify) error
Reader(ctx *kvrpcpb.Context) (StorageReader, error)
}
复制代码
Storage底层由badger(类似LevelDB或RocksDB的存储引擎)支持,StandAloneStorage即badger的简单封装。
目前不需要考虑kvrpcpb.Context的涵义。
一些提示。
- 使用badger.Txn来实现Reader()函数,即badger提供的事务支持。
- badger不支持Column Familyÿ