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