💡
原文中文,约6600字,阅读约需16分钟。
📝
内容提要
本文讨论了使用raft snapshot构建分布式KV存储的方法,包括状态机、日志、客户端和服务端的设计。用户需要实现自己的SnapshotLoader和SnapshotSaver接口,并介绍了三种快照方案。
🎯
关键要点
- 使用raft和单机KV引擎构建分布式KV存储是一种常见方式。
- raft是一个共识算法,主要用于实现高可用的业务逻辑,称为状态机。
- 状态机的每个操作经过共识算法处理形成日志,并应用到业务状态机上。
- raft snapshot用于压缩日志,避免日志无限增长。
- 用户需要实现SnapshotLoader和SnapshotSaver接口,raft框架负责调用时机和数据流的持久化。
- 快照的保存时机可以是定时任务或日志累计到一定数目后触发。
- 快照的加载时机包括raft节点启动时和follower节点与leader节点日志差异过大时。
- snapshot_save的调用是串行的,必须快速返回以避免阻塞后续操作。
- 方案A适用于无法快速获取快照的内存状态机,但可能导致内存阻塞和OOM。
- 方案B使用支持MVCC快照读的本地存储数据库,可以在不阻塞后续日志的情况下生成快照。
- 方案C直接将本地KV数据库作为快照,消灭空间放大和写放大,但需要确保FSM log是幂等的。
- 对于一般元数据系统,方案B较为方便易懂;对于海量数据节点,方案C更能减少空间和写放大。
- 实现raft KV系统还有其他有趣的事项可探讨,如读一致性和节点管理接口等。
❓
延伸问答
raft snapshot的主要作用是什么?
raft snapshot用于压缩日志,避免日志无限增长,从而重建状态机。
用户在实现raft框架时需要注意哪些接口?
用户需要实现SnapshotLoader和SnapshotSaver接口,以便raft框架调用和持久化数据流。
快照的保存时机有哪些?
快照的保存时机可以是定时任务触发或日志累计到一定数目后触发。
方案B与方案C的主要区别是什么?
方案B使用支持MVCC快照读的数据库生成快照,而方案C直接将本地KV数据库作为快照,消灭空间和写放大。
在raft框架中,snapshot_save的调用有什么特点?
snapshot_save的调用是串行的,必须快速返回以避免阻塞后续操作。
对于海量数据节点,推荐使用哪个快照方案?
对于海量数据节点,推荐使用方案C以减少空间和写放大。
➡️