Flink Checkpoint源碼級(jí)拆解
檢查點(diǎn)是 Apache Flink 的主要容錯(cuò)機(jī)制。它的工作原理是定期創(chuàng)建所有分布式應(yīng)用程序狀態(tài)的一致快照,允許 Flink 通過(guò)將應(yīng)用程序狀態(tài)恢復(fù)到最新的檢查點(diǎn)來(lái)從故障中恢復(fù)。

一、Core Components 核心組件
checkpointing 系統(tǒng)由幾個(gè)關(guān)鍵組件組成,這些組件協(xié)同工作以實(shí)現(xiàn)容錯(cuò):

1. CheckpointCoordinator(檢查點(diǎn)協(xié)調(diào)器)
CheckpointCoordinator 是 Flink 檢查點(diǎn)機(jī)制的核心組件。它作為 JobManager 的一部分運(yùn)行,并負(fù)責(zé):
- 定期觸發(fā) checkpoint 創(chuàng)建
- 向源發(fā)送檢查點(diǎn)屏障
- 從任務(wù)中收集確認(rèn)
- 管理待處理和已完成的 checkpoint
- 處理檢查點(diǎn)失敗
- 在恢復(fù)期間協(xié)調(diào)檢查點(diǎn)恢復(fù)
2. PendingCheckpoint 待處理檢查點(diǎn)
PendingCheckpoint 表示已啟動(dòng)但尚未被所有任務(wù)確認(rèn)的 checkpoint。它保存已確認(rèn)任務(wù)的部分狀態(tài),并跟蹤哪些任務(wù)仍需要確認(rèn)。
主要特點(diǎn):
- 觸發(fā) checkpoint 時(shí)創(chuàng)建
- 收集任務(wù)狀態(tài)確認(rèn)
- 當(dāng)所有任務(wù)都確認(rèn)時(shí),變?yōu)?CompletedCheckpoint
- 如果任務(wù)失敗或超時(shí),可以中止
3. CompletedCheckpoint 已完成檢查點(diǎn)
CompletedCheckpoint 表示可用于恢復(fù)的完全確認(rèn)的檢查點(diǎn)。它包含還原應(yīng)用程序狀態(tài)所需的所有狀態(tài)句柄。
主要特點(diǎn):
- 當(dāng)所有任務(wù)都已確認(rèn) PendingCheckpoint 時(shí)創(chuàng)建
- 存儲(chǔ)在 CompletedCheckpointStore 中
- 在恢復(fù)期間用于恢復(fù)應(yīng)用程序狀態(tài)
- 元數(shù)據(jù)持久化到外部存儲(chǔ)
4. CompletedCheckpointStore 已完成檢查點(diǎn)存儲(chǔ)
CompletedCheckpointStore 維護(hù)已完成檢查點(diǎn)的歷史記錄。它負(fù)責(zé):
- 存儲(chǔ)已完成的 checkpoint
- 管理保留的 checkpoint 數(shù)量
- 提供用于恢復(fù)的檢查點(diǎn)
- 在達(dá)到最大限制時(shí)丟棄舊的 checkpoint
二、檢查點(diǎn)流程
下圖說(shuō)明了 Flink 中的完整 checkpoint 過(guò)程:

1. 觸發(fā) Checkpoint
可以通過(guò)三種方式觸發(fā) Checkpoint:
- Periodically:最常用的方法,以固定間隔自動(dòng)觸發(fā)。
- Manually手動(dòng) :通過(guò)臨時(shí)檢查點(diǎn)的 REST API。Savepoints
- Savepoints:用戶請(qǐng)求的持久性檢查點(diǎn),通常用于版本升級(jí)或維護(hù)。
觸發(fā) checkpoint 時(shí),(CheckpointCoordinator)協(xié)調(diào)器進(jìn)行如下操作:
- 從計(jì)數(shù)器獲取新的檢查點(diǎn) ID
- 創(chuàng)建 PendingCheckpoint 以跟蹤進(jìn)度
- 向所有源任務(wù)發(fā)送觸發(fā)器消息
- 設(shè)置 checkpoint 完成的超時(shí)
2. 確認(rèn) Checkpoint
當(dāng)每個(gè)任務(wù)處理一個(gè)檢查點(diǎn)屏障時(shí),它會(huì):
- 拍攝其狀態(tài)的快照
- 通過(guò)配置的 state backend 存儲(chǔ) state
- 向 CheckpointCoordinator 發(fā)送確認(rèn)
確認(rèn)內(nèi)容包括:
- 檢查點(diǎn) ID
- 任務(wù)的狀態(tài)快照引用
- 有關(guān)檢查點(diǎn)的性能指標(biāo)
3. 完成檢查點(diǎn)
當(dāng)所有任務(wù)都確認(rèn)了一個(gè) checkpoint 時(shí),PendingCheckpoint 將通過(guò)以下方式轉(zhuǎn)換為 CompletedCheckpoint:
- 完成檢查點(diǎn)元數(shù)據(jù)
- 將其存儲(chǔ)在 CompletedCheckpointStore 中
- 如果超過(guò)最大計(jì)數(shù),則丟棄最早的 checkpoint
- 通知協(xié)調(diào)器檢查點(diǎn)已完成






























