<aside> 📢 暑期实习的 Talent Plan 项目,基于raft算法实现一个键值对分布式存储库TinyKV。
</aside>
raft
算法基本原理badger api
和 tinykv 项目模板提供的 engine_util
包StandAloneStorage
badger.Txn
来实现Raw API
参考文献
- Raft 基本介绍与可视化:Raft Consensus Algorithm
- TinyKv 和 TiKv很像,因此可以参考:三篇文章了解 TiDB 技术内幕 - 说存储 | PingCAP
- badger package
- 网课: https://learn.pingcap.com/learner/course/510001
主要是处理各种情况下的 Message
如何处理 Message ?按优先级参考以下来源:
- 测试函数 (最具体)
- doc.go (大体思路)
- raft 论文 (学习思想、关乎安全性的设计)
对于某些特殊情况可以考虑用 raft 官网上的交互式系统(Raft Visualization)模拟出相应情形加深理解
tick()
时钟步进,step()
处理信号(本地消息直接step,msg中的消息是要发送的消息)Raft
基础上进一步封装,方便上层应用调用(ready,advance)<div class="mermaid"> flowchart LR RaftLog --> Raft --> RawNode </div>
if m.MsgType != pb.MessageType_MsgAppend || len(m.Entries) != 1 || m.Entries[0].Data != nil {
panic("not a message to append noop entry")
} //noop entry 指代 Data 字段为 nil 的 Entry