随着时间越长,raft的log就越多,占用磁盘多,对后面加入的follower跟上leader也是个灾难。所以就有个快照机制,合并一条记录的多次操作,压缩数据量。
1 写快照
快照的执行有两种,一种是主动发指令生成快照,另外一种就是定时任务了
image.png image.png
默认是一个小时生成一次快照
// Default: 3600 (1 hour)
private int snapshotIntervalSecs = 3600;
SnapshotExecutorImpl类的doSnapshot方法
image.pngFSMCallerImpl#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处理快照和第二点的处理主动加载快照是一致的了。
网友评论