jraft

jraft源码阅读6一snapshot快照

2019-04-13  本文已影响0人  黄云斌huangyunbin

随着时间越长,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处理快照和第二点的处理主动加载快照是一致的了。

上一篇下一篇

猜你喜欢

热点阅读