Flink 原理與實現:Savepoint

Savepoint 和 Checkpoint 都是使用 Asynchronous Barrier Snapshotting(簡稱 ABS)算法實現分佈式快照的,都可以確保一致性、容錯、故障恢復。何其相似乃爾,卻又爲何既生瑜,又生亮?是無心之舉,還是有意爲之?且聽下文分解。

1. What are savepoints?

Savepoint 是 Flink 的一個非常獨特的功能,類似於“瑞士軍刀(Swiss Army knife)”的工具,可解決操作流應用程序的許多挑戰。Savepoint 可以讓你在某個指定的時間節點對整個流系統做快照。這個全局一致性快照(Global Consistent Snapshot)包含有關輸入在數據源中所處位置的信息,以及有關源的所有位置和整個應用程序狀態的信息。Savepoint 使用 Chandy-Lamport 算法的變體來獲得整個狀態的一致快照(可參考Flink 原理與實現:Checkpoint),而無需停止應用程序。Savepoint 需要有兩個主要元素:

  1. Savepoint 通常需要一個比較大的文件目錄,用於存放發生在該 Savepoint 的整個流應用的全部 State 的二進制文件。
  2. 一個相對較小的元數據文件,其中包含指向所有文件的指針(即,文件路徑),這些文件是 Savepoint 的一部分,並存儲在指定的分佈式文件系統或數據存儲中。

Global Consistent 表示所有輸入中,全部並行 Operator 的 State 在完全相同的明確位置被 Checkpoint。如果你有一個流系統某些時刻的 Savepoint,那麼你就可以從這些 Savepoint 的位置處重啓該應用程序。這個新的應用程序會用 Savepoint 中 Operator 的 State 進行初始化,同時從 Savepoint 中獲取的輸入源的位置,並從該位置處開始重新處理數據。由於 Flink 的 Savepoint 之間彼此是相互獨立的,一個應用程序可以擁有多個 Savepoint。因此,你也可以用不同的 Savepoint,從多個不同的處理位置重新啓動多個不同版本的應用程序。如下圖:
圖1 從不同 Savepoint 重啓的不同應用程序

2. When to use savepoints?

流式處理應用程序處理的數據是無界的,意味着理論上會永遠運行下去。但是,成也蕭何敗蕭何,正是由於這種特性,也暗示着流式處理應用程序總會有掛掉的一天,因爲網絡超時、磁盤壞道、機器故障等,都需要從某個特定的位置處進行失敗恢復。實際上,很多應用案例是需要應用程序重新處理之前的數據。而 Savepoint 一般會應用於以下場景中:

  1. 部署一個應用程序的更新版本,比如,添加新功能、bugfix、更優的 Machine Learning Model。
  2. 爲應用程序引入 A/B 測試,使用相同的數據流測試程序的不同版本,從相同的時間點開始測試而不會犧牲先前的狀態。
  3. 對於不同資源,使用不同的並行度啓動同一應用程序,然後將應用程序橫向或橫向擴展。
  4. 將應用程序遷移到新版本的 Apache Flink,或者將應用程序升級到其他集羣。
  5. 暫停應用程序,釋放集羣資源給更高優先級的應用程序,稍後再重新啓動,或者在輸入流暫時不繼續生產數據的時候。
  6. 使用 Savepoint 進行版本化並存檔應用程序的狀態。

3. Savepoint vs Checkpoint

SavepointCheckpoint 是 Flink 兩個特有的功能。Savepoint 和 Checkpoint 在實現上是相似的,但是卻存在着三方面的不同:

  1. 目的不同。從概念上講,Flink的 Savepoint 和 Checkpoint 的區別類似於備份與傳統數據庫系統中的恢復日誌的區別。 Checkpoints 的主要目的是作爲 Apache Flink 的恢復機制,以確保容錯處理框架能夠從潛在的作業失敗中恢復。 相反,Savepoints 的主要目的是充當用戶手動備份和恢復活動後重新啓動,繼續或重新開啓已暫停的應用程序的方式。
  2. 實現方式不同。Checkpoint 的設計是輕量級且快速的。它們可能(但不一定必須)利用底層狀態後端的不同特性,並儘可能快地恢復數據。例如,RocksDB 狀態後端增量檢查點使用RocksDB 的內部格式,而不是 Flink 的本機格式。這有利於加速 RocksDB 的 Checkpoint 過程,使它們成爲更輕量級檢查點機制的第一個實例。相反,Savepoint 的設計更多地關注於數據的可移植性,並支持對作業所做的任何更改,這些更改會使生成和恢復工作的成本略微增加。
  3. 生命週期不同。Checkpoint 是自動的和週期性的。它們由 Flink 自動地、定期地擁有、創建和刪除,不需要任何用戶交互,以確保在發生作業失敗時能夠完全恢復。相反,Savepoint 是由用戶手動擁有和管理的(即,它們是有計劃地創建的和刪除的)。
Checkpoint Savepoint
目的 從潛在的作業失敗中恢復的機制 重新啓動應用程序的人工備份
實現 輕量級且儘可能快速的恢復數據 關注於數據的可移植性,生成和恢復工作的成本更高
生命週期 無需任何人爲干預,Flink 自動化管理 人工手動地創建和刪除

4. 總結

SavepointCheckpoint 是 Apache Flink 兩個不同的特性,可以適用於不同的需求,以確保一致性、容錯、故障恢復。Savepoint 可用於 Upgrade,Bugfix、Migration、A/B Test。這兩個特性結合使用效果更好,從而確保應用程序的狀態在不同的場景和環境中保持不變。

掃碼關注公衆號:冰山烈焰的黑板報
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章