隨著時間越長核偿,raft的log就越多,占用磁盤多顽染,對后面加入的follower跟上leader也是個災(zāi)難漾岳。所以就有個快照機(jī)制,合并一條記錄的多次操作家乘,壓縮數(shù)據(jù)量蝗羊。
1 寫快照
快照的執(zhí)行有兩種,一種是主動發(fā)指令生成快照仁锯,另外一種就是定時任務(wù)了
image.png
image.png
默認(rèn)是一個小時生成一次快照
// Default: 3600 (1 hour)
private int snapshotIntervalSecs = 3600;
SnapshotExecutorImpl類的doSnapshot方法
image.png
FSMCallerImpl#onSnapshotSave,這里提交異步任務(wù)
到FSMCallerImpl#ApplyTaskHandler翔悠,再到runApplyTask方法
image.png
image.png
onSnapshotSave业崖,其實(shí)最終的操作是由用戶的狀態(tài)機(jī)自己決定怎么做的,比如count例子這個蓄愁,就是把當(dāng)前值保存到文件
image.png
image.png
2 加載快照
加載快照的時機(jī)有兩個双炕,一個是啟動初始化的時候,一個是主動請求加載快照
image.png
系統(tǒng)初始化 NodeImpl#init ->NodeImpl#initSnapshotStorage -> SnapshotExecutorImpl#init
最終調(diào)用的都是狀態(tài)機(jī)的加載快照:
FSMCallerImpl
image.png
比如count例子的實(shí)現(xiàn):
image.png
3 發(fā)送快照給沒同步過的follower
image.png
這個是發(fā)送快照的條件撮抓,term為0表示的找不到妇斤,就是沒同步過的
image.png
follower處理快照和第二點(diǎn)的處理主動加載快照是一致的了。