💡
原文中文,约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系统还有其他有趣的事项可探讨,如读一致性和节点管理接口等。
➡️