打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
AppBoxFuture: Raft快照及日志截断回收

  AppBoxFuture的存储引擎依赖Raft一致性协议来保证各个分区副本的一致性,如果不处理Raft日志将不断增长,因此需要特定的机制(定期或每处理一定数量的日志)来回收那些无用的日志数据。通过学习Raft协议内的Log Compaction,并参考TiKV等实现,作者初步实现了分区快照与日志截断回收功能。

一、快照流程:

  每个分区对应一个Raft组,由不同的Raft节点分布在集群的不同机器上,每个RaftNode都在循环处理Ready(如下图所示):

  • 在达到快照创建条件时(上图步骤6),即满足一定周期(如6小时)且期间应用的已递交日志数量达到阈值(如10000条),RaftNode通知对应的状态机创建快照,这里主要是利用RocksDB的Snapshot及SstFileWriter将当前分区所涉及的KV数据写入相应的sst文件内。在状态机创建快照成功后,RaftNode通知对应的RaftStorage截断并回收日志,由于目前Raft日志同样使用RocksDB存储,所以可以利用RocksDB的DeleteRange功能批量删除无用的日志。

  • 如果同一Raft组内的某一节点所在的机器Down机了较长的时间,在此期间此组内的Leader达到快照条件创建了快照并回收了日志。之后Down掉的机器重新启动,Follower与Leader通信后要求追加Down机期间的日志,但Leader快照前的日志已删除,Leader会发送Raft快照给Follower,这里需要注意的是Leader先发送状态机创建的各个sst文件,都发送完了再发送RaftSnapshot消息。

  • Follower在收到快照消息时(上图步骤3),先清理当前分区所涉及的所有旧数据,然后通知对应的状态机恢复快照数据,这里主要是利用RocksDB的IngestExternalFile将各个sst文件快速导入存储内。

创建与接收的快照文件目前存储在运行时snapshot目录内。

二、简单测试:

1. 启动集群并新建测试用实体模型

参考前篇“告别单体架构,迎接分布式时代”启动一个新集群,并且登录至IDE创建新实体。

2. 关闭集群某一节点模拟Down机

直接Control+C关闭某一节点。

3. 新建一个服务插入5000条记录

在IDE内新建服务用于插入5000条记录(用于触发快照条件),调用此服务后可看到控制台输出如下图所示的创建快照日志。

4. 重新启动Down机节点

通过如下命令重启Down机节点,可看到控制台输出如下图所示的恢复快照日志。

sudo ./appbox

5. 验证Down机节点快照恢复

通过tools/dbscan工具查看快照数据是否已恢复。

tools/dbscan --db=data(数据所在目录) --cf=TableCF --take=10000 --prefix=000020017000

dbscan的参数--prefix=十六进制字串, 可以只匹配相同前缀的KV记录

三、本篇小结:

  本篇介绍了Raft快照及日志截断回收的流程及相应的测试,GitHub上的运行时已更新可供测试。作者开发AppBoxFuture到十月一日就整一年了,期间曾多次想放弃,好在顶着巨大的压力总算解决了这最后一个技术难点,到此基本上原型验证是没有大问题了,下一步的重点是完善必要功能、稳定性及性能优化,并且考虑是开源该项目还是商业化运作。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
蚂蚁金服生产级 Raft 算法库 SOFAJRaft 存储模块剖析 | SOFAJRaft 实现原理...
深入剖析一致性算法 Raft
闲聊Redis
ETCD 的组件架构和内部通信
SpringBoot b2b2c 多用户商城系统(十三):注册中心 Consul 使用详解
CAP一致性协议及应用解析
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服