Raft KV 与 Snapshot

Raft KV 与 Snapshot

💡 原文中文,约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以减少空间和写放大。

➡️

继续阅读