1.前言
對(duì)于很多做離線或者實(shí)時(shí)數(shù)倉(cāng)的小伙伴來(lái)說(shuō)间唉,我先問(wèn)幾個(gè)問(wèn)題绞灼,看看小伙伴萌能回答上來(lái)嗎?
? 你知道狀態(tài)是什么嗎呈野?在離線數(shù)據(jù)開(kāi)發(fā)的經(jīng)歷中低矮,你碰到過(guò)狀態(tài)的概念嗎?
? 為什么離線數(shù)倉(cāng)不需要狀態(tài)被冒,實(shí)時(shí)數(shù)據(jù)開(kāi)發(fā)中老是提到狀態(tài)的概念军掂?
? Flink 中的狀態(tài)轮蜕、狀態(tài)后端、全局一致性快照(Checkpoint\Savepoint) 的作用都是什么蝗锥,這三個(gè)概念的關(guān)聯(lián)又是什么跃洛?
? Flink 是通過(guò)什么機(jī)制來(lái)做 Checkpoint 的?為什么這套機(jī)制能夠做到精確一次呢终议?
? Flink Checkpoint 是基于 Chandy-Lamport 算法的汇竭,但是 Flink 的實(shí)現(xiàn)相比 Chandy-Lamport 算法之間又有哪些優(yōu)點(diǎn)、缺點(diǎn)穴张?
? Flink Checkpoint 用到了 barrier细燎,為什么用了 barrier 做的快照就能保證全局一致性快照的正確性?barrier 到底起到了什么作用陆馁?
小伙伴們思考一下找颓,都能回答上來(lái)么,如果對(duì)于某些問(wèn)題你還有疑問(wèn)叮贩,樓主會(huì)通過(guò)本篇文章幫你解答這些問(wèn)題击狮,理清這些概念!
由于本文內(nèi)容較多益老,所以博主將本文分為上彪蓬,下兩集,本別在兩天發(fā)出捺萌。
我們先來(lái)看看博主整理的本文介紹思路以及博主希望大家在看完每一小節(jié)之后能夠?qū)W到的內(nèi)容档冬。
? 什么是狀態(tài)?
希望小伙伴萌能夠發(fā)散思維的去思考狀態(tài)桃纯,狀態(tài)這個(gè)概念不僅僅只限于 Flink 的狀態(tài)酷誓,狀態(tài)是一個(gè)無(wú)處不在的東西
? 什么是全局一致性快照?其和狀態(tài)的管理态坦?
舉一些狀態(tài)盐数、全局一致性快照的一些生活、工作中應(yīng)用的例子伞梯,希望大家大家學(xué)習(xí)到全局一致性快照 = 一個(gè)應(yīng)用某一時(shí)刻(瞬間)所有事物所處狀態(tài)的合集玫氢,兩者是包含關(guān)系
? 為什么需要全局一致性快照?
希望大家學(xué)習(xí)到有了全局一致性快照能幫助我們做故障恢復(fù)谜诫、死鎖檢測(cè)等很多有利的事情漾峡。
? 常見(jiàn)分布式應(yīng)用中的全局一致性快照包含哪些內(nèi)容?
通過(guò)一個(gè)簡(jiǎn)單分布式應(yīng)用介紹一下一個(gè)全局一致性快照包含:分布式應(yīng)用每個(gè)進(jìn)程的狀態(tài) + 正在網(wǎng)絡(luò)傳輸中的消息(這個(gè)消息其實(shí)就是狀態(tài))喻旷。并且全局一致性快照每時(shí)每刻都存在的生逸,時(shí)間軸上的每一個(gè)時(shí)刻都存在一個(gè)全局一致性快照(類似無(wú)時(shí)無(wú)刻的在拍照片,每個(gè)照片都是一個(gè)全局一致性快照)。Flink 做 Checkpoint 其實(shí)就是每隔固定的時(shí)間(小伙伴萌自己在程序代碼中設(shè)定的 Checkpoint 間隔)從時(shí)間軸上的一個(gè)點(diǎn)拿出來(lái)這個(gè)時(shí)間點(diǎn)對(duì)應(yīng)的一個(gè)全局一致性狀態(tài)槽袄。
? 分布式應(yīng)用實(shí)現(xiàn)全局一致性快照的方案伟阔?
2.什么是狀態(tài)?
2.1.首先看看狀態(tài)的定義
當(dāng)前計(jì)算流程需要依賴到之前計(jì)算的結(jié)果掰伸,那么之前計(jì)算的結(jié)果就是狀態(tài)。
從上面這個(gè)定義出發(fā)怀估。我們就可以意識(shí)到狮鸭,狀態(tài)并不僅僅是在 Flink 中有這個(gè)概念,其實(shí)這是一個(gè)很廣泛的概念多搀。狀態(tài)是一個(gè)普遍存在的東西歧蕉!
2.2.狀態(tài)的常見(jiàn)案例
??生活中的例子:為什么我知道我的面前放著一臺(tái)電腦?因?yàn)檠劬邮盏酵饨绲膱D案康铭,然后我的大腦接收到這個(gè)眼睛傳輸?shù)膱D案信息后惯退,拿記憶中存儲(chǔ)的圖案進(jìn)行對(duì)比,匹配得到這是電腦从藤,所以我才識(shí)別除了這是一臺(tái)電腦催跪,其中記憶中存儲(chǔ)的圖案就是狀態(tài);比如日久生情夷野,為什么感情會(huì)越來(lái)越深懊蒸,因?yàn)榻裉斓母星?= 今天積累的感情 + 以前積累的感情,以前積累的感情就是狀態(tài)悯搔。其實(shí)可以看到生活中無(wú)處不在都有狀態(tài)骑丸!
??web server 應(yīng)用中的狀態(tài):打開(kāi) github 頁(yè)面,列表展示了我的歸屬倉(cāng)庫(kù)妒貌。其流程就是 web client 發(fā)給 web server 去查詢我的歸屬倉(cāng)庫(kù)通危,web server 接收到請(qǐng)求之后,然后去存儲(chǔ)引擎中進(jìn)行查詢匹配返回灌曙。那么存儲(chǔ)引擎中存儲(chǔ)的內(nèi)容就是狀態(tài)菊碟,如下圖所示:
1
??Flink 應(yīng)用中的狀態(tài):計(jì)算最常見(jiàn)的 DAU 指標(biāo),那么必然需要做 id 去重平匈,涉及到去重時(shí)框沟,就要存儲(chǔ)歷史所有來(lái)過(guò)的的 id,如下圖所示增炭,案例非常之多:
2
3.什么是全局一致性快照忍燥?
??生活中的例子:拍一個(gè)照片,如下圖隙姿,那么照片的內(nèi)容就是當(dāng)時(shí)的一個(gè)全局一致性快照(其中每一個(gè)人都有一個(gè)?狀態(tài)梅垄,這些?狀態(tài)?在同一時(shí)刻的組合就是一個(gè)?全局一致性快照)。所以其實(shí)?全局一致性快照?是由所有?狀態(tài)?的一個(gè)時(shí)刻的快照組成。
3
??分布式應(yīng)用的例子:我們有一個(gè)分布式應(yīng)用队丝,其有多個(gè)進(jìn)程分布在多個(gè)物理機(jī)上靡馁,在每個(gè)進(jìn)程內(nèi)部都有自己的處理邏輯和狀態(tài),并且每個(gè)進(jìn)程之間可以互相通信机久。那么這個(gè)分布式應(yīng)用某一時(shí)刻的全局狀態(tài)臭墨,也叫做?全局一致性快照。
在了解了狀態(tài)以及全局一致性快照之后膘盖,我們來(lái)看看我們?yōu)槭裁葱枰忠恢滦钥煺眨?/p>
4.為什么需要全局一致性快照胧弛?
??可以用來(lái)故障恢復(fù):我們以 Flink 計(jì)算 DAU 為例,如果沒(méi)有全局一致性快照(即沒(méi)有狀態(tài))侠畔,也就是我們沒(méi)有使用到 MapState 去重结缚,而只用一個(gè)存在內(nèi)存中的 HashMap 做去重的話,當(dāng) Flink 任務(wù)發(fā)生故障時(shí)软棺,重新拉起之后红竭,HashMap 的數(shù)據(jù)就清空了,那么我們就需要從歷史最開(kāi)始的起點(diǎn)開(kāi)始重跑所有的數(shù)據(jù)喘落,才能得到正確的數(shù)據(jù)茵宪。但是:
? 流式應(yīng)用的上游存儲(chǔ)介質(zhì)一般都不支持存儲(chǔ)歷史所有數(shù)據(jù)(比如上游為 kafka,kafka 不可能存儲(chǔ)歷史所有數(shù)據(jù))
? 重跑時(shí)效性不能滿足時(shí)效性要求(回溯歷史數(shù)據(jù)的情況下瘦棋,一定會(huì)產(chǎn)生延遲眉厨,時(shí)效性是達(dá)不到要求的)
??而當(dāng)有了全局一致性快照之后,我們就不必要從【歷史最開(kāi)始的起點(diǎn)】開(kāi)始重跑所有的數(shù)據(jù)(其實(shí)這就是我們需要全局一致性快照的目的J尴痢:豆伞!)箕慧,數(shù)據(jù)可以從近處回溯服球,并且由于回溯數(shù)據(jù)范圍小,時(shí)效性也可以被滿足
??可以做任務(wù)的死鎖檢測(cè):快照其實(shí)就相當(dāng)于某一個(gè)時(shí)刻的抓拍颠焦,當(dāng)我們抓拍到了一個(gè)任務(wù)某一時(shí)刻的運(yùn)行情況時(shí)斩熊,我們就可以分析在任務(wù)是不是有死鎖。
回到 Flink 來(lái)說(shuō)伐庭,F(xiàn)link 的?Checkpoint?和?Savepoint?實(shí)際上就是全局一致性快照這個(gè)概念在工業(yè)應(yīng)用上的一個(gè)具體實(shí)現(xiàn)粉渠。
5.常見(jiàn)分布式應(yīng)用中的全局一致性快照包含哪些內(nèi)容?
如下面第一張圖所示圾另,就是一個(gè)分布式應(yīng)用霸株,我們可以看到,分布式應(yīng)用的一個(gè)全局一致性快照包含:分布式應(yīng)用每個(gè)進(jìn)程的狀態(tài) + 正在網(wǎng)絡(luò)傳輸中的消息(這個(gè)消息其實(shí)就是狀態(tài))集乔,也就是以上帝視角去抓拍這個(gè)分布式應(yīng)用時(shí)去件,這個(gè)分布式應(yīng)用的全局快照會(huì)包含 Process 的狀態(tài) + 網(wǎng)絡(luò) Channel 中的狀態(tài)。
以這個(gè)前提出發(fā),我們連看下面四張圖:
上面四張圖對(duì)應(yīng)到這個(gè)分布式應(yīng)用四個(gè)時(shí)刻的四個(gè)快照尤溜,其實(shí)應(yīng)用的每一個(gè)時(shí)刻都存在一個(gè)全局一致性快照倔叼,遠(yuǎn)遠(yuǎn)不止四個(gè)。
11
6.分布式應(yīng)用實(shí)現(xiàn)全局一致性快照的方案宫莱?
實(shí)現(xiàn)方式主要分為同步實(shí)現(xiàn)方式和異步實(shí)現(xiàn)方式兩類丈攒。
6.1.同步實(shí)現(xiàn)方式
14
??NTP[1]: NTP服務(wù)器[Network Time Protocol(NTP)]是用來(lái)使計(jì)算機(jī)時(shí)間同步化的一種協(xié)議,它可以使計(jì)算機(jī)對(duì)其服務(wù)器或時(shí)鐘源(如石英鐘授霸,GPS等等)做同步化肥印,它可以提供高精準(zhǔn)度的時(shí)間校正(LAN上與標(biāo)準(zhǔn)間差小于1毫秒,WAN上幾十毫秒)結(jié)論:在分布式應(yīng)用中绝葡,不同機(jī)器上面的進(jìn)行無(wú)法實(shí)現(xiàn)時(shí)鐘的完全對(duì)齊,所以分布式應(yīng)用也就沒(méi)法用時(shí)鐘同步的方式做出全局一致性快照腹鹉。
??Stop-The-World[2]結(jié)論:使用此種方式做快照藏畅,分布式應(yīng)用所有進(jìn)程會(huì)停下來(lái)做快照,不滿足時(shí)效等需求功咒,在實(shí)時(shí)分布式應(yīng)用中無(wú)法采用愉阎。
上述兩種同步方式都不行,那如果同步實(shí)現(xiàn)方式不滿足需求力奋,能使用異步方式做到同步相同的快照也是可以滿足需求的榜旦。
6.2.異步實(shí)現(xiàn)方式
??Chandy-Lamport[3]
本文下集詳細(xì)接著介紹。敬請(qǐng)期待景殷。