jraft源码阅读6一snapshot快照

随着时间越长,raft的log就越多,占用磁盘多,对后面加入的follower跟上leader也是个灾难。所以就有个快照机制,合并一条记录的多次操作,压缩数据量。

1 写快照

快照的执行有两种,一种是主动发指令生成快照,另外一种就是定时任务了


image.png
image.png

默认是一个小时生成一次快照
// Default: 3600 (1 hour)
private int snapshotIntervalSecs = 3600;

SnapshotExecutorImpl类的doSnapshot方法

image.png

FSMCallerImpl#onSnapshotSave,这里提交异步任务

到FSMCallerImpl#ApplyTaskHandler,再到runApplyTask方法


image.png
image.png

onSnapshotSave,其实最终的操作是由用户的状态机自己决定怎么做的,比如count例子这个,就是把当前值保存到文件


image.png
image.png
2 加载快照

加载快照的时机有两个,一个是启动初始化的时候,一个是主动请求加载快照

image.png

系统初始化 NodeImpl#init ->NodeImpl#initSnapshotStorage -> SnapshotExecutorImpl#init

最终调用的都是状态机的加载快照:
FSMCallerImpl


image.png

比如count例子的实现:


image.png
3 发送快照给没同步过的follower
image.png

这个是发送快照的条件,term为0表示的找不到,就是没同步过的


image.png

follower处理快照和第二点的处理主动加载快照是一致的了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,798评论 1 32
  • 这篇文章将会介绍 etcd 的实现原理,其中包括 Raft 协议、存储两大模块,在最后我们也会简单介绍 etcd ...
    小刀爱编程阅读 5,940评论 0 3
  • 包含的重点内容:JAVA基础JVM 知识开源框架知识操作系统多线程TCP 与 HTTP架构设计与分布式算法数据库知...
    消失er阅读 9,831评论 1 10
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 9,333评论 0 5
  • 每次上会话课,都是刀架在脖子上,强迫学习,压力太大,每一次被提问,都要记录平时成绩,实在太苛刻 今天因为...
    一三一三一阅读 1,001评论 0 0