在存儲(chǔ)系統(tǒng)內(nèi)保護(hù)數(shù)據(jù)的安全---克隆技術(shù)
快照實(shí)現(xiàn)了數(shù)據(jù)的邏輯保護(hù),如果底層硬件層面的故障導(dǎo)致的數(shù)據(jù)丟失則無法通過快照恢復(fù)。另外,由于快照和原始卷共享數(shù)據(jù),可能會(huì)由于存儲(chǔ)軟件內(nèi)部的Bug引起數(shù)據(jù)的丟失(鏈接關(guān)系的損壞)。
有別于快照與原始卷共享數(shù)據(jù),克隆(Clone)是對(duì)原始卷的完整拷貝。克隆的實(shí)現(xiàn)原理與快照類似,通常也是采用RoW和CoW兩種技術(shù)。采用上述兩種技術(shù)可以保證即刻創(chuàng)建一個(gè)克隆。但是克隆技術(shù)與快照不同的是,其后臺(tái)有任務(wù)實(shí)現(xiàn)數(shù)據(jù)的剝離,最終保證克隆卷的數(shù)據(jù)與原始卷的數(shù)據(jù)完全隔離。如下圖所示,最終克隆的數(shù)據(jù)甚至可以在另外一個(gè)存儲(chǔ)池中,實(shí)現(xiàn)與原始卷數(shù)據(jù)的完全隔離。這樣,即使原始卷所在的存儲(chǔ)池出現(xiàn)故障,我們依然可以通過克隆恢復(fù)原始數(shù)據(jù)。
圖片
存儲(chǔ)行業(yè)其實(shí)并沒有對(duì)克隆的實(shí)現(xiàn)做嚴(yán)格的限制,各個(gè)存儲(chǔ)廠商的實(shí)現(xiàn)也有差異。其中如華為的HyperClone實(shí)現(xiàn)的克隆是對(duì)原始卷的全拷貝,而Dell PowerStore的ThinClone則并非全拷貝,而只是支持寫數(shù)據(jù)的功能。
以華為的HyperClone為例,其是一個(gè)全拷貝的克隆,但是在創(chuàng)建之初并不能馬上保證克隆卷是原始卷數(shù)據(jù)的完全拷貝,而只能保證從訪問角度完全一致。在創(chuàng)建之初,會(huì)創(chuàng)建一個(gè)同步位圖,同步位圖記錄了哪些數(shù)據(jù)已經(jīng)從原始卷同步到了克隆卷。如下圖是華為HyperClone創(chuàng)建后的狀態(tài)視圖,可以看到同步的進(jìn)度。
圖片
克隆創(chuàng)建后,克隆卷本身也是一個(gè)邏輯卷,此時(shí)會(huì)建立原始卷和克隆卷的配對(duì)關(guān)系,并創(chuàng)建同步位圖。位圖用于標(biāo)記克隆卷與原始卷之間數(shù)據(jù)的同步進(jìn)展,另外,對(duì)于克隆卷的訪問也是依賴位圖的。這里位圖的功能與前面介紹的RAID1的位圖的功能有些類似的地方,大家可以類比理解一下。
圖片
通常在存儲(chǔ)引擎中會(huì)有一個(gè)后臺(tái)線程進(jìn)行原始卷到克隆卷數(shù)據(jù)的同步。當(dāng)完成一個(gè)數(shù)據(jù)塊的同步后,克隆卷的指針和位圖都會(huì)做相應(yīng)的更新。如上圖上半部分是克隆卷剛創(chuàng)建成功后的數(shù)據(jù)引用關(guān)系和位圖的狀態(tài),下半部分則是完成第1個(gè)數(shù)據(jù)塊的同步后的數(shù)據(jù)引用關(guān)系和位圖的狀態(tài)。
由于克隆卷是創(chuàng)建后即可使用的,因此在數(shù)據(jù)的同步過程中原始卷和克隆卷都有可能有新的IO。對(duì)于讀IO來說就無所謂了,克隆卷根據(jù)引用關(guān)系讀取數(shù)據(jù)就行了;但對(duì)于寫IO則不同,無論是原始卷的寫IO還是克隆卷的寫IO都需要進(jìn)行特殊的處理。如上圖所示,如果寫IO位于第1個(gè)數(shù)據(jù)塊,由于此數(shù)據(jù)已經(jīng)分離,所以可以直接寫。如果寫IO位于2個(gè)數(shù)據(jù)塊(不算空洞),則需要做處理,對(duì)于來自克隆卷的IO不能按照原來的引用關(guān)系寫入數(shù)據(jù),而是寫入新的位置,并更新指針和位圖信息,如下圖上半部分所示;對(duì)于來自原始卷的IO則需要先將數(shù)據(jù)搬移到克隆卷所在的存儲(chǔ)池,更新克隆卷的指針,最后才能寫入數(shù)據(jù)并更新位圖信息,如下圖下半部分所示。
在實(shí)際的產(chǎn)品中還要復(fù)雜一些,因?yàn)樯鲜霾僮魃婕岸鄠€(gè)數(shù)據(jù)塊數(shù)據(jù)的更新,任何兩步中間都有可能出現(xiàn)問題導(dǎo)致數(shù)據(jù)不一致。為了解決上述問題,通常將上述操作封裝為一個(gè)事務(wù),以事務(wù)的方式提交所有數(shù)據(jù)的更改。
圖片
上文我們只是介紹了一種可能的實(shí)現(xiàn)方案,但每個(gè)廠商的實(shí)現(xiàn)差異起始還是挺大的。比如NetApp的FlexClone,其聲稱為基于快照的克隆。當(dāng)基于原始卷創(chuàng)建克隆時(shí),存儲(chǔ)引擎在底層會(huì)創(chuàng)建一個(gè)快照,并建立克隆卷與快照的關(guān)聯(lián),大體如下圖所示。由于快照基于原始卷創(chuàng)建,因此快照具備了原始卷這個(gè)時(shí)間點(diǎn)的所有數(shù)據(jù)。而克隆建立了與該快照的關(guān)聯(lián),當(dāng)訪問克隆卷的時(shí)候就可以根據(jù)快照找到真實(shí)的數(shù)據(jù)。
圖片
快照的特性我們?cè)谇拔囊呀?jīng)詳細(xì)介紹過,原始卷更改的時(shí)候快照數(shù)據(jù)不會(huì)變化。因此,快照的存在隔離克隆卷與原始卷寫數(shù)據(jù)時(shí)的相互影響。具體而言,如果原始卷寫入了一塊新數(shù)據(jù),由于快照的隔離作用,在克隆卷中并不會(huì)感知到這個(gè)變化。如果在克隆卷寫入新的數(shù)據(jù)也是如此,因?yàn)榭寺【砀季硎峭耆綦x的空間,自然不會(huì)影響原始卷的數(shù)據(jù)。
繼續(xù)深入克隆卷的細(xì)節(jié),我們知道邏輯卷通過指針的方式引用數(shù)據(jù),在創(chuàng)建之初,克隆卷的所有指針為空。此時(shí)如果讀數(shù)據(jù),直接從其配對(duì)的快照相同的偏移地址讀取數(shù)據(jù)即可,如果指針有有效值,直接根據(jù)指針的位置讀取數(shù)據(jù)即可。如果寫數(shù)據(jù),直接在克隆卷的物理空間寫數(shù)據(jù),完成寫數(shù)據(jù)后更新指針即可。
圖片
本節(jié)我們介紹了克隆的原理,并結(jié)合主流存儲(chǔ)產(chǎn)品介紹了更多的細(xì)節(jié)。由于廠商開放的資源有限,很多細(xì)節(jié)也是作者猜測(cè)的,并不一定就是作者所描述的那樣。不過大體原理不會(huì)有大的出入,大家可以舉一反三。