惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog RSS Feed
Martin Fowler
Martin Fowler
爱范儿
爱范儿
IT之家
IT之家
Last Week in AI
Last Week in AI
A
About on SuperTechFans
Google DeepMind News
Google DeepMind News
阮一峰的网络日志
阮一峰的网络日志
V
V2EX
aimingoo的专栏
aimingoo的专栏
G
Google Developers Blog
J
Java Code Geeks
Microsoft Azure Blog
Microsoft Azure Blog
美团技术团队
The Cloudflare Blog
MyScale Blog
MyScale Blog
T
The Blog of Author Tim Ferriss
Hugging Face - Blog
Hugging Face - Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
云风的 BLOG
云风的 BLOG
Y
Y Combinator Blog
The GitHub Blog
The GitHub Blog
腾讯CDC
Microsoft Security Blog
Microsoft Security Blog

博客园 - 白菜园

低代码 + AI = 对话方式生成UI AppBox拖拽设计增删改查用户界面 换个方式用C#开发微信小程序 开源高性能结构化日志模块NanoLog AppBox快速开发框架(开源)开发流程介绍 用Roslyn玩转代码之一: 解析与执行字符串表达式 不生成DOM的非主流Blazor UI开源啦! 给我一块画布,我可以造一个全新的跨端UI 拖拽方式生成Vue用户界面 终于可以愉快的撸Java异步代码了! 这么优雅的Java ORM没见过吧! Java“微服务”还能这么玩! AppBoxFuture: Web在线报表设计与PDF生成 AppBoxFuture实战: 如何同步开发与生产环境的模型 一个浏览器搞定前后端开发的低代码框架正式开放源码啦! AppBoxFuture实战: 如何实现一对多表单的增删改查 AppBoxFuture: Sql存储的ORM查询示例 AppBoxFuture: 集成第三方Sql数据库 AppBoxFuture: 服务模型的在线调试与性能监测
AppBoxFuture: Raft快照及日志截断回收
白菜园 · 2019-09-29 · via 博客园 - 白菜园

  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到十月一日就整一年了,期间曾多次想放弃,好在顶着巨大的压力总算解决了这最后一个技术难点,到此基本上原型验证是没有大问题了,下一步的重点是完善必要功能、稳定性及性能优化,并且考虑是开源该项目还是商业化运作。