從盤古開天辟地說起為什么 Flink CP 能實現(xiàn)精確一次?
1.前言
對于很多做離線或者實時數(shù)倉的小伙伴來說,我先問幾個問題,看看小伙伴萌能回答上來嗎?
- ? 你知道狀態(tài)是什么嗎?在離線數(shù)據(jù)開發(fā)的經(jīng)歷中,你碰到過狀態(tài)的概念嗎?
- ? 為什么離線數(shù)倉不需要狀態(tài),實時數(shù)據(jù)開發(fā)中老是提到狀態(tài)的概念?
- ? Flink 中的狀態(tài)、狀態(tài)后端、全局一致性快照(Checkpoint\Savepoint) 的作用都是什么,這三個概念的關(guān)聯(lián)又是什么?
- ? Flink 是通過什么機制來做 Checkpoint 的?為什么這套機制能夠做到精確一次呢?
- ? Flink Checkpoint 是基于 Chandy-Lamport 算法的,但是 Flink 的實現(xiàn)相比 Chandy-Lamport 算法之間又有哪些優(yōu)點、缺點?
- ? Flink Checkpoint 用到了 barrier,為什么用了 barrier 做的快照就能保證全局一致性快照的正確性?barrier 到底起到了什么作用?
小伙伴們思考一下,都能回答上來么,如果對于某些問題你還有疑問,樓主會通過本篇文章幫你解答這些問題,理清這些概念!
由于本文內(nèi)容較多,所以博主將本文分為上,下兩集,本別在兩天發(fā)出。
我們先來看看博主整理的本文介紹思路以及博主希望大家在看完每一小節(jié)之后能夠?qū)W到的內(nèi)容。
? 什么是狀態(tài)?
希望小伙伴萌能夠發(fā)散思維的去思考狀態(tài),狀態(tài)這個概念不僅僅只限于 Flink 的狀態(tài),狀態(tài)是一個無處不在的東西
? 什么是全局一致性快照?其和狀態(tài)的管理?
舉一些狀態(tài)、全局一致性快照的一些生活、工作中應(yīng)用的例子,希望大家大家學(xué)習(xí)到全局一致性快照 = 一個應(yīng)用某一時刻(瞬間)所有事物所處狀態(tài)的合集,兩者是包含關(guān)系
? 為什么需要全局一致性快照?
希望大家學(xué)習(xí)到有了全局一致性快照能幫助我們做故障恢復(fù)、死鎖檢測等很多有利的事情。
? 常見分布式應(yīng)用中的全局一致性快照包含哪些內(nèi)容?
通過一個簡單分布式應(yīng)用介紹一下一個全局一致性快照包含:分布式應(yīng)用每個進(jìn)程的狀態(tài) + 正在網(wǎng)絡(luò)傳輸中的消息(這個消息其實就是狀態(tài))。并且全局一致性快照每時每刻都存在的,時間軸上的每一個時刻都存在一個全局一致性快照(類似無時無刻的在拍照片,每個照片都是一個全局一致性快照)。Flink 做 Checkpoint 其實就是每隔固定的時間(小伙伴萌自己在程序代碼中設(shè)定的 Checkpoint 間隔)從時間軸上的一個點拿出來這個時間點對應(yīng)的一個全局一致性狀態(tài)。
? 分布式應(yīng)用實現(xiàn)全局一致性快照的方案?
2.什么是狀態(tài)?
2.1.首先看看狀態(tài)
的定義當(dāng)前計算流程需要依賴到之前計算的結(jié)果,那么之前計算的結(jié)果就是狀態(tài)。
從上面這個定義出發(fā)。我們就可以意識到,狀態(tài)并不僅僅是在 Flink 中有這個概念,其實這是一個很廣泛的概念。狀態(tài)是一個普遍存在的東西!
2.2.狀態(tài)的常見案例
- ? 生活中的例子:為什么我知道我的面前放著一臺電腦?因為眼睛接收到外界的圖案,然后我的大腦接收到這個眼睛傳輸?shù)膱D案信息后,拿記憶中存儲的圖案進(jìn)行對比,匹配得到這是電腦,所以我才識別除了這是一臺電腦,其中記憶中存儲的圖案就是狀態(tài);比如日久生情,為什么感情會越來越深,因為今天的感情 = 今天積累的感情 + 以前積累的感情,以前積累的感情就是狀態(tài)。其實可以看到生活中無處不在都有狀態(tài)!
- ? web server 應(yīng)用中的狀態(tài):打開 github 頁面,列表展示了我的歸屬倉庫。其流程就是 web client 發(fā)給 web server 去查詢我的歸屬倉庫,web server 接收到請求之后,然后去存儲引擎中進(jìn)行查詢匹配返回。那么存儲引擎中存儲的內(nèi)容就是狀態(tài),如下圖所示:
- ? Flink 應(yīng)用中的狀態(tài):計算最常見的 DAU 指標(biāo),那么必然需要做 id 去重,涉及到去重時,就要存儲歷史所有來過的的 id,如下圖所示,案例非常之多:
3.什么是全局一致性快照?
? 生活中的例子:拍一個照片,如下圖,那么照片的內(nèi)容就是當(dāng)時的一個全局一致性快照(其中每一個人都有一個 狀態(tài),這些 狀態(tài) 在同一時刻的組合就是一個 全局一致性快照)。所以其實 全局一致性快照 是由所有 狀態(tài) 的一個時刻的快照組成。
? 分布式應(yīng)用的例子:我們有一個分布式應(yīng)用,其有多個進(jìn)程分布在多個物理機上,在每個進(jìn)程內(nèi)部都有自己的處理邏輯和狀態(tài),并且每個進(jìn)程之間可以互相通信。那么這個分布式應(yīng)用某一時刻的全局狀態(tài),也叫做 全局一致性快照。
在了解了狀態(tài)以及全局一致性快照之后,我們來看看我們?yōu)槭裁葱枰忠恢滦钥煺?
4.為什么需要全局一致性快照?
- ? 可以用來故障恢復(fù):我們以 Flink 計算 DAU 為例,如果沒有全局一致性快照(即沒有狀態(tài)),也就是我們沒有使用到 MapState 去重,而只用一個存在內(nèi)存中的 HashMap 做去重的話,當(dāng) Flink 任務(wù)發(fā)生故障時,重新拉起之后,HashMap 的數(shù)據(jù)就清空了,那么我們就需要從歷史最開始的起點開始重跑所有的數(shù)據(jù),才能得到正確的數(shù)據(jù)。但是:
- ? 流式應(yīng)用的上游存儲介質(zhì)一般都不支持存儲歷史所有數(shù)據(jù)(比如上游為 kafka,kafka 不可能存儲歷史所有數(shù)據(jù))
- ? 重跑時效性不能滿足時效性要求(回溯歷史數(shù)據(jù)的情況下,一定會產(chǎn)生延遲,時效性是達(dá)不到要求的)
- ? 而當(dāng)有了全局一致性快照之后,我們就不必要從【歷史最開始的起點】開始重跑所有的數(shù)據(jù)(其實這就是我們需要全局一致性快照的目的!!!),數(shù)據(jù)可以從近處回溯,并且由于回溯數(shù)據(jù)范圍小,時效性也可以被滿足
- ? 可以做任務(wù)的死鎖檢測:快照其實就相當(dāng)于某一個時刻的抓拍,當(dāng)我們抓拍到了一個任務(wù)某一時刻的運行情況時,我們就可以分析在任務(wù)是不是有死鎖。
回到 Flink 來說,F(xiàn)link 的 Checkpoint 和Savepoint 實際上就是全局一致性快照這個概念在工業(yè)應(yīng)用上的一個具體實現(xiàn)。
5.常見分布式應(yīng)用中的全局一致性快照包含哪些內(nèi)容?
如下面第一張圖所示,就是一個分布式應(yīng)用,我們可以看到,分布式應(yīng)用的一個全局一致性快照包含:分布式應(yīng)用每個進(jìn)程的狀態(tài) + 正在網(wǎng)絡(luò)傳輸中的消息(這個消息其實就是狀態(tài)),也就是以上帝視角去抓拍這個分布式應(yīng)用時,這個分布式應(yīng)用的全局快照會包含 Process 的狀態(tài) + 網(wǎng)絡(luò) Channel 中的狀態(tài)。
以這個前提出發(fā),我們連看下面四張圖:
上面四張圖對應(yīng)到這個分布式應(yīng)用四個時刻的四個快照,其實應(yīng)用的每一個時刻都存在一個全局一致性快照,遠(yuǎn)遠(yuǎn)不止四個。
6.分布式應(yīng)用實現(xiàn)全局一致性快照的方案?
實現(xiàn)方式主要分為同步實現(xiàn)方式和異步實現(xiàn)方式兩類。
6.1.同步實現(xiàn)方式
- ? NTP[1]: NTP服務(wù)器[Network Time Protocol(NTP)]是用來使計算機時間同步化的一種協(xié)議,它可以使計算機對其服務(wù)器或時鐘源(如石英鐘,GPS等等)做同步化,它可以提供高精準(zhǔn)度的時間校正(LAN上與標(biāo)準(zhǔn)間差小于1毫秒,WAN上幾十毫秒)結(jié)論:在分布式應(yīng)用中,不同機器上面的進(jìn)行無法實現(xiàn)時鐘的完全對齊,所以分布式應(yīng)用也就沒法用時鐘同步的方式做出全局一致性快照。
- ? Stop-The-World[2]結(jié)論:使用此種方式做快照,分布式應(yīng)用所有進(jìn)程會停下來做快照,不滿足時效等需求,在實時分布式應(yīng)用中無法采用。
上述兩種同步方式都不行,那如果同步實現(xiàn)方式不滿足需求,能使用異步方式做到同步相同的快照也是可以滿足需求的。
參考資料
[1]什么是 NTP: https://baike.baidu.com/item/NTP%E6%9C%8D%E5%8A%A1%E5%99%A8/8633994?fr=aladdin。
[2]Stop-The-World 說明: https://www.jianshu.com/p/b210f9db19a3。
[3]Chandy-Lamport 論文鏈接: https://www.microsoft.com/en-us/research/uploads/prod/2016/12/Determining-Global-States-of-a-Distributed-System.pdf?ranMID=24542&ranEAID=J84DHJLQkR4&ranSiteID=J84DHJLQkR4-mVoVymFnAblBx3zwyf98Pw&epi=J84DHJLQkR4-mVoVymFnAblBx3zwyf98Pw&irgwc=1&OCID=AID2000142_aff_7593_1243925&tduid=%28ir__1hs2uuow6wkfq3oxkk0sohzzwm2xpc33lxd0o6g200%29%287593%29%281243925%29%28J84DHJLQkR4-mVoVymFnAblBx3zwyf98Pw%29%28%29&irclickid=_1hs2uuow6wkfq3oxkk0sohzzwm2xpc33lxd0o6g200。