Flink Checkpoint源碼級拆解
檢查點是 Apache Flink 的主要容錯機制。它的工作原理是定期創(chuàng)建所有分布式應(yīng)用程序狀態(tài)的一致快照,允許 Flink 通過將應(yīng)用程序狀態(tài)恢復(fù)到最新的檢查點來從故障中恢復(fù)。
一、Core Components 核心組件
checkpointing 系統(tǒng)由幾個關(guān)鍵組件組成,這些組件協(xié)同工作以實現(xiàn)容錯:
1. CheckpointCoordinator(檢查點協(xié)調(diào)器)
CheckpointCoordinator 是 Flink 檢查點機制的核心組件。它作為 JobManager 的一部分運行,并負(fù)責(zé):
- 定期觸發(fā) checkpoint 創(chuàng)建
- 向源發(fā)送檢查點屏障
- 從任務(wù)中收集確認(rèn)
- 管理待處理和已完成的 checkpoint
- 處理檢查點失敗
- 在恢復(fù)期間協(xié)調(diào)檢查點恢復(fù)
2. PendingCheckpoint 待處理檢查點
PendingCheckpoint 表示已啟動但尚未被所有任務(wù)確認(rèn)的 checkpoint。它保存已確認(rèn)任務(wù)的部分狀態(tài),并跟蹤哪些任務(wù)仍需要確認(rèn)。
主要特點:
- 觸發(fā) checkpoint 時創(chuàng)建
- 收集任務(wù)狀態(tài)確認(rèn)
- 當(dāng)所有任務(wù)都確認(rèn)時,變?yōu)?CompletedCheckpoint
- 如果任務(wù)失敗或超時,可以中止
3. CompletedCheckpoint 已完成檢查點
CompletedCheckpoint 表示可用于恢復(fù)的完全確認(rèn)的檢查點。它包含還原應(yīng)用程序狀態(tài)所需的所有狀態(tài)句柄。
主要特點:
- 當(dāng)所有任務(wù)都已確認(rèn) PendingCheckpoint 時創(chuàng)建
- 存儲在 CompletedCheckpointStore 中
- 在恢復(fù)期間用于恢復(fù)應(yīng)用程序狀態(tài)
- 元數(shù)據(jù)持久化到外部存儲
4. CompletedCheckpointStore 已完成檢查點存儲
CompletedCheckpointStore 維護已完成檢查點的歷史記錄。它負(fù)責(zé):
- 存儲已完成的 checkpoint
- 管理保留的 checkpoint 數(shù)量
- 提供用于恢復(fù)的檢查點
- 在達(dá)到最大限制時丟棄舊的 checkpoint
二、檢查點流程
下圖說明了 Flink 中的完整 checkpoint 過程:
1. 觸發(fā) Checkpoint
可以通過三種方式觸發(fā) Checkpoint:
- Periodically:最常用的方法,以固定間隔自動觸發(fā)。
- Manually手動 :通過臨時檢查點的 REST API。Savepoints
- Savepoints:用戶請求的持久性檢查點,通常用于版本升級或維護。
觸發(fā) checkpoint 時,(CheckpointCoordinator)協(xié)調(diào)器進行如下操作:
- 從計數(shù)器獲取新的檢查點 ID
- 創(chuàng)建 PendingCheckpoint 以跟蹤進度
- 向所有源任務(wù)發(fā)送觸發(fā)器消息
- 設(shè)置 checkpoint 完成的超時
2. 確認(rèn) Checkpoint
當(dāng)每個任務(wù)處理一個檢查點屏障時,它會:
- 拍攝其狀態(tài)的快照
- 通過配置的 state backend 存儲 state
- 向 CheckpointCoordinator 發(fā)送確認(rèn)
確認(rèn)內(nèi)容包括:
- 檢查點 ID
- 任務(wù)的狀態(tài)快照引用
- 有關(guān)檢查點的性能指標(biāo)
3. 完成檢查點
當(dāng)所有任務(wù)都確認(rèn)了一個 checkpoint 時,PendingCheckpoint 將通過以下方式轉(zhuǎn)換為 CompletedCheckpoint:
- 完成檢查點元數(shù)據(jù)
- 將其存儲在 CompletedCheckpointStore 中
- 如果超過最大計數(shù),則丟棄最早的 checkpoint
- 通知協(xié)調(diào)器檢查點已完成