蚂蚁金服生产级 Raft 算法库存储模块剖析 | SOFAJRaft 实现原理

前言

SOFAJRaft 是一个基于 Raft 一致性算法的生产级高性能 Java 实现,支持 MULTI-RAFT-GROUP,适用于高负载低延迟的场景

SOFAJRaft 存储模块分为:

  1. Log 存储记录 Raft 配置变更和用户提交任务日志;
  2. Meta 存储即元信息存储记录 Raft 实现的内部状态;
  3. Snapshot 存储用于存放用户的状态机 Snapshot 及元信息。

本文将围绕日志存储,元信息存储以及快照存储等方面剖析 SOFAJRaft 存储模块原理,阐述如何解决 Raft 协议存储问题以及存储模块实现:

  • Raft 配置变更和用户提交任务日志如何存储?如何调用管理日志存储?
  • SOFAJRaft Server 节点 Node 是如何存储 Raft 内部配置?
  • Raft 状态机快照 Snapshot 机制如何实现?如何存储安装镜像?

日志存储

Log 存储,记录 Raft 配置变更和用户提交任务的日志,把日志从 Leader 复制到其他节点上面。

  • LogStorage 是日志存储实现,默认实现基于 RocksDB 存储,通过 LogStorage 接口扩展自定义日志存储实现;
  • LogManager 负责调用底层日志存储 LogStorage,针对日志存储调用进行缓存、批量提交、必要的检查和优化。

LogStorage 存储实现

LogStorage 日志存储实现,定义 Raft 分组节点 Node 的 Log 存储模块核心 API 接口包括:

  • 返回日志里的首/末个日志索引;
  • 按照日志索引获取 Log Entry 及其任期;
  • 把单个/批量 Log Entry 添加到日志存储;
  • 从 Log 存储头部/末尾删除日志;
  • 删除所有现有日志,重置下任日志索引。

Log Index 提交到 Raft Group 中的任务序列化为日志存储,每条日志一个编号,在整个 Raft Group 内单调递增并复制到每个 Raft 节点。LogStorage 日志存储实现接口定义入口:

com.alipay.sofa.jraft.storage.LogStorage 

RocksDBLogStorage 基于 RocksDB 实现

Log Structured Merge Tree 简称 LSM ,把一颗大树拆分成 N 棵小树,数据首先写入内存,内存里构建一颗有序小树,随着小树越来越大,内存的小树 Flush 到磁盘,磁盘中的树定期做合并操作合并成一棵大树以优化读性能,通过把磁盘的随机写转化为顺序写提高写性能,RocksDB 就是基于 LSM-Tree 数据结构使用 C++ 编写的嵌入式 KV 存储引擎,其键值均允许使用二进制流。RocksDB 按顺序组织所有数据,通用操作包括 get(key), put(key), delete(Key) 以及 newIterator()。RocksDB 有三种基本的数据结构:memtable,sstfile 以及 logfile。memtable 是一种内存数据结构--所有写入请求都会进入 memtable,然后选择性进入 logfile。logfile 是一种有序写存储结构,当 memtable 被填满的时候被刷到 sstfile 文件并存储起来,然后相关的 logfile 在之后被安全地删除。sstfile 内的数据都是排序好的,以便于根据 key 快速搜索。

LogStorage 默认实现 RocksDBLogStorage 是基于 RocksDB 存储日志,初始化日志存储 StorageFactory 根据 Raft节点日志存储路径和 Raft 内部实现是否调用 fsync 配置默认创建 RocksDBLogStorage 日志存储。基于 RocksDB 存储实现 RocksDBLogStorage 核心操作包括:

  • init():创建 RocksDB 配置选项调用 RocksDB#open() 方法构建 RocksDB 实例,添加 default 默认列族及其配置选项获取列族处理器,通过 newIterator() 生成 RocksDB 迭代器遍历 KeyValue 数据检查 Value 类型加载 Raft 配置变更到配置管理器 ConfigurationManager。RocksDB 引入列族 ColumnFamily 概念,所谓列族是指一系列 KeyValu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值