Flink status backend是指存儲檢查點數據的容器,可以分為MemoryStateBackend、FsStateBackend和RocksDBStateBackend,狀態可以分為operator狀態和keyed狀態。
Flink狀態保存和恢復主要依靠檢查點機制和保存點機制,兩者的區別如下表所示。
快照的概念來源於照片,指的是發展過程很短的照相館。在計算機領域,快照是數據存儲在某壹時刻的狀態記錄。Flink快照是指作業狀態的全局壹致記錄。壹個完整的快照包括源操作符的狀態(例如kafka分區的偏移量)、狀態操作符的緩存數據和匯操作符的狀態(批量緩存數據、事務數據等)。).
檢查點檢查點可以自動生成用於Flink故障恢復的快照。檢查點是分布式的、異步的和增量的。
保存點保存點由用戶手動觸發,保存全部作業狀態數據。常見的使用場景有作業升級、作業並發伸縮、集群遷移等。
Flink是壹種輕量級的分布式異步快照,通過使用barrier作為檢查點的傳輸信號,像業務數據壹樣無差別的傳遞來實現。目的是將數據流切割成微批,並將檢查點保存為快照。當barrier通過流圖節點時,Flink執行檢查點以保存狀態數據。
如下圖所示,檢查點n包含每個操作員的狀態,指的是檢查點n之前的所有事件,但不包括它之後的所有事件。
Flink提供了三種語義來解決由於用戶作業失敗導致結果丟失或重復的問題:
①至少壹次:數據不會丟失,但可能有重復結果。
②壹次精確:檢查點屏障對齊機制可以保證壹次精確。
①failuratestartstrategy:允許指定時間間隔內的最大失敗次數,也可以設置重啟延遲時間。
② FixedDelayRestartStrategy:允許指定的失敗次數,設置重啟延遲時間。
③ NoRestartStrategy:不需要重啟,即作業直接失敗。
④throwingrestarticle:不需要重啟,拋出異常即可。
可以通過env設置作業重新啟動策略。
上述策略的父接口是RestartStrategy,其關鍵是restart。
① RestartAllStrategy:重啟所有任務,默認策略。
② RestartIndividualStrategy:恢復單個任務。如果任務沒有源,可能會導致數據丟失。
③noopfailoverpstrategy:不恢復任務。
上述策略的父接口是FailoverStrategy,其要點是Factory的create策略和onTaskFailure。
如何生成可靠的全局壹致快照是分布式系統的難點。其傳統方案是使用全局時鐘,但存在單點故障、數據不壹致等可靠性問題。為了解決這個問題,Chandy-Lamport算法使用標記傳播代替全局時鐘。
(1)進程Pi記錄自己的進程狀態,同時產生壹個標識信息標記(不同於正常消息),通過輸出通道發送給系統中的其他進程。
②進程Pi開始記錄輸入通道接收到的所有消息。
進程Pj從輸入通道Ckj接收標記。如果Pj沒有記錄自己的進程狀態,則Pj記錄自己的進程狀態並發送標記;到輸出通道;否則,Pj正在記錄自己的進程狀態(標記前的消息)。
所有進程都接收標記信息,並記錄它們自己的狀態和通道狀態(包括消息)。
Flink的分布式異步快照實現了Chandy Lampport算法,其核心思想是在源碼中插入壹個barrier來代替Chandy Lampport算法中的marker,通過控制barrier的同步來實現快照備份和恰好壹次語義。
檢查點協調器向所有源節點觸發檢查點。
源任務向下遊廣播障礙。
當源任務完成備份它自己的狀態時,它將把備份數據的地址通知檢查點協調器。
映射和接收器任務收集上遊源的障礙n並拍攝本地快照。下面的例子是RocksDB增量檢查點的流程:首先將RocksDB完整保存到磁盤(紅色大三角表示),然後Flink會選擇未上傳的文件進行持久備份(紫色小三角)。
Map和sink任務在完成檢查點後將狀態地址狀態句柄返回給協調器。
當檢查點協調器接收到所有任務的狀態句柄時,它確定檢查點已經完成,並將檢查點元(元數據,包括檢查點狀態數據的備份地址)備份到永久存儲器。