美文网首页jraft
jraft源码阅读6一snapshot快照

jraft源码阅读6一snapshot快照

作者: 黄云斌huangyunbin | 来源:发表于2019-04-13 09:40 被阅读0次

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

    相关文章

      网友评论

        本文标题:jraft源码阅读6一snapshot快照

        本文链接:https://www.haomeiwen.com/subject/xigziqtx.html