檢查點(diǎn)使得 Apache Flink 具有容錯(cuò)能力,并確保了即時(shí)發(fā)生故障也能保證流應(yīng)用程序的語(yǔ)義赡麦。檢查點(diǎn)是以固定的間隔來(lái)觸發(fā)的朴皆,該間隔可以在應(yīng)用中配置。
Apache Flink 中實(shí)現(xiàn)的 Kafka 消費(fèi)者是一個(gè)有狀態(tài)的算子(operator)泛粹,它集成了 Flink 的檢查點(diǎn)機(jī)制遂铡,它的狀態(tài)是所有 Kafka 分區(qū)的讀取偏移量。當(dāng)一個(gè)檢查點(diǎn)被觸發(fā)時(shí)晶姊,每一個(gè)分區(qū)的偏移量都被存到了這個(gè)檢查點(diǎn)中扒接。Flink 的檢查點(diǎn)機(jī)制保證了所有 operator task 的存儲(chǔ)狀態(tài)都是一致的。這里的“一致的”是什么意思呢们衙?意思是它們存儲(chǔ)的狀態(tài)都是基于相同的輸入數(shù)據(jù)钾怔。當(dāng)所有的 operator task 成功存儲(chǔ)了它們的狀態(tài),一個(gè)檢查點(diǎn)才算完成蒙挑。因此宗侦,當(dāng)從潛在的系統(tǒng)故障中恢復(fù)時(shí),系統(tǒng)提供了 excatly-once 的狀態(tài)更新語(yǔ)義忆蚀。
第一步:
如下所示矾利,一個(gè) Kafka topic,有兩個(gè)partition蜓谋,每個(gè)partition都含有 “A”, “B”, “C”, ”D”, “E” 5條消息梦皮。我們將兩個(gè)partition的偏移量(offset)都設(shè)置為0.
第二步:
Kafka comsumer(消費(fèi)者)開(kāi)始從 partition 0 讀取消息。消息“A”正在被處理桃焕,第一個(gè) consumer 的 offset 變成了1剑肯。
第三步
消息“A”到達(dá)了 Flink Map Task。兩個(gè) consumer 都開(kāi)始讀取他們下一條消息(partition 0 讀取“B”观堂,partition 1 讀取“A”)让网。各自將 offset 更新成 2 和 1 呀忧。同時(shí),F(xiàn)link 的 JobMaster 開(kāi)始在 source 觸發(fā)了一個(gè)檢查點(diǎn)溃睹。
第四步
接下來(lái)而账,由于 source 觸發(fā)了檢查點(diǎn),Kafka consumer 創(chuàng)建了它們狀態(tài)的第一個(gè)快照(”offset = 2, 1”)因篇,并將快照存到了 Flink 的 JobMaster 中泞辐。Source 在消息“B”和“A”從partition 0 和 1 發(fā)出后,發(fā)了一個(gè) checkpoint barrier竞滓。Checkopint barrier 用于各個(gè) operator task 之間對(duì)齊檢查點(diǎn)咐吼,保證了整個(gè)檢查點(diǎn)的一致性。消息“A”到達(dá)了 Flink Map Task商佑,而上面的 consumer 繼續(xù)讀取下一條消息(消息“C”)锯茄。
第五步
Flink Map Task 收齊了同一版本的全部 checkpoint barrier 后,那么就會(huì)將它自己的狀態(tài)也存儲(chǔ)到 JobMaster茶没。同時(shí)肌幽,consumer 會(huì)繼續(xù)從 Kafka 讀取消息。
第六步
Flink Map Task 完成了它自己狀態(tài)的快照流程后抓半,會(huì)向 Flink JobMaster 匯報(bào)它已經(jīng)完成了這個(gè) checkpoint喂急。當(dāng)所有的 task 都報(bào)告完成了它們的狀態(tài) checkpoint 后,JobMaster 就會(huì)將這個(gè) checkpoint 標(biāo)記為成功琅关。從此刻開(kāi)始煮岁,這個(gè) checkpoint 就可以用于故障恢復(fù)了。值得一提的是涣易,F(xiàn)link 并不依賴(lài) Kafka offset 從系統(tǒng)故障中恢復(fù)画机。
故障恢復(fù)
在發(fā)生故障時(shí)(比如,某個(gè) worker 掛了)新症,所有的 operator task 會(huì)被重啟步氏,而他們的狀態(tài)會(huì)被重置到最近一次成功的 checkpoint。Kafka source 分別從 offset 2 和 1 重新開(kāi)始讀取消息(因?yàn)檫@是完成的 checkpoint 中存的 offset)徒爹。當(dāng)作業(yè)重啟后荚醒,我們可以期待正常的系統(tǒng)操作,就好像之前沒(méi)有發(fā)生故障一樣隆嗅。如下圖所示: