當前位置:
首頁 > 科技 > 快照是什麼?揭秘存儲快照的實現

快照是什麼?揭秘存儲快照的實現

前言

存儲網路行業協會SNIA(StorageNetworking Industry Association)快照的定義:關於指定數據集合的一個完全可用拷貝,該拷貝包括相應數據在某個時間點(拷貝開始的時間點)的映像。快照可以是其所表示的數據的一個副本,也可以是數據的一個複製品。

需要注意的是:快照是完全可用的拷貝,但不是一份完整的拷貝,至於為什麼,後面會詳細講。


存儲快照的使用場景

場景一:

存儲快照,是一種數據保護措施,可以對源數據進行一定程度的保護,通俗地講,可以理解為----後悔葯。

如上圖,假設在t0時刻,有一份完整的源數據,我們在t1時刻,針對這份源數據創建一份快照。

t2時刻,若因為各種原因(誤操作、系統錯誤等)導致源數據損毀,那麼,我們可以通過回滾(rollback)快照,將源數據恢復至快照創建時的狀態(即t1時刻),這樣,可以盡量降低數據損失(損失的數據,是t1到t2之間產生的數據)。

這種功能,常用於銀行、公安戶籍、科研單位等。操作系統、軟體升級或機房設備更替,一般會選擇在夜間或其他無生產業務時,進行高危操作,操作前會對數據進行快照,若操作失敗,則將快照進行rollback,將源數據恢復至操作前的狀態。

場景2:

前言中說過,快照是一份完全可用的副本,那麼,它完全可以被上層業務當做源數據。

如上圖,針對源數據,創建快照後,將快照卷映射給其他上層業務,可以用於數據挖掘和開發測試等工作,針對快照的讀操作不影響源卷的數據。

這種功能,常用於直播(視頻&圖片)鑒黃、科研數據模擬開發測試等,比如,視頻直播平台需要將某一段時間的視頻提供給執法機構進行篩查分析,那麼可以通過對特定時間點保存的數據創建快照,將快照映射給執法機構的業務主機去進行挖掘分析。


存儲快照的實現原理

目前,快照的實現方式均由各個廠商自行決定,但主要技術分為2類,一種是寫時拷貝COW(Copy On Write),另一種,是寫重定向ROW(Redirect On Write)。


寫時拷貝COW

COW(Copy-On-Write),寫時拷貝,也稱為寫前拷貝。

創建快照以後,如果源卷的數據發生了變化,那麼快照系統會首先將原始數據拷貝到快照卷上對應的數據塊中,然後再對源卷進行改寫。

寫操作:

如上圖簡要示例,快照創建以後,若上層業務對源卷寫數據X,X在緩存中排隊,快照系統將X即將寫入的位置(邏輯地址)上的數據Y,拷貝到快照卷中對應的位置(邏輯地址)上,同時,生成一張映射表,表中一列記錄源卷上數據變化的邏輯地址,另一列記錄快照卷上數據變化的邏輯地址。我們可以看到,上層業務每下發一個數據塊,存儲上,發生了兩次寫操作:一次是源卷將數據寫入快照卷(即圖中Y),一次是上層業務將數據寫入源卷(即圖中X)。

讀操作:

如上圖,快照卷若映射給上層業務進行數據分析等用途時,針對快照進行讀操作時,首先由快照系統判斷,上層業務需要讀取的數據是否在快照卷中,若在,直接從快照卷讀取,若不在,則查詢映射表,去對應源卷的邏輯地中讀取(這個查表並去源卷讀的操作,也叫讀重定向)。這一點,恰好就解釋了為什麼快照是一份完全可用的副本,它沒有對源卷進行100%的拷貝,但對上層業務來說,卻可以將快照看做是和源卷「一模一樣」的副本。

針對源卷進行讀操作時,與快照卷沒有數據交互。

我們可以看到,快照對源卷的數據具有很好的保護措施,快照可以單獨作為一份可以讀取的副本,但並沒有像簡單的鏡像那樣,一開始就佔用了和源卷一樣的空間,而是根據創建快照後上層業務產生的數據,來實時佔用必需的存儲空間。

快照回滾(rollback):

如上圖,回滾操作的前提條件是,鎖定源卷(暫停對待回滾的邏輯地址上的IO操作),然後通過查映射表,將快照卷上的對應數據回拷到源卷中。

快照刪除:

採用COW技術的快照,其源卷即保存著完整的實時數據,因此,刪除快照時,直接銷毀了快照卷和映射表,與源卷不存在數據交互。


寫時重定向ROW

ROW(Redirect-on-write ),也稱為寫時重定向。

創建快照以後,快照系統把對數據卷的寫請求重定向給了快照預留的存儲空間,直接將新的數據寫入快照卷。上層業務讀源卷時,創建快照前的數據從源卷讀,創建快照後產生的數據,從快照卷讀。

寫操作:

如上圖簡要示例,快照創建以後,若上層業務對源卷寫數據X,X在緩存中排隊,快照系統判斷X即將寫入源卷的邏輯地址,然後將數據X寫入快照卷中預留的對應邏輯地址中,同時,將源卷和快照卷的邏輯地址寫入映射表,即寫重定向。我們可以看到,上層針對源卷寫入一個數據塊X,存儲上只發生一次寫操作,只是寫之前進行了重定向。

讀操作:

若快照創建以後,上層業務對源卷進行讀,則有兩種情況:1)若讀取的數據,在創建快照前產生,數據是保存在源卷上的,那麼,上層就從源卷進行讀取;2)若需要讀取的數據是創建快照以後才產生的,那麼上層就查詢映射表,從快照卷進行讀取(即讀重定向)。

若快照創建以後,上層業務對快照卷進行讀,同樣也有兩種情況:1)若讀取的數據,在創建快照前產生,數據是保存在源卷上的,那麼上層就查詢映射表,從源卷進行讀取;2)若需要讀取的數據是創建快照以後才產生的,那麼上層就直接從快照卷進行讀取。

我們可以看到,ROW快照也是根據創建快照後上層業務產生的數據,來實時佔用必需的存儲空間。

快照回滾(rollback):

採用ROW技術的快照,其源卷始終保存著快照創建前的完整數據,快照創建後,上層業務產生的數據都寫入了快照中,因此,快照的回滾只是取消了對源卷的讀重定向操作。通俗地說,就是源卷上沒有進行任何數據操作,上層業務對源卷的讀,僅限於讀源卷(即不會去讀取快照卷的數據)。

快照刪除:

採用ROW技術的快照,其源卷始終保存著快照創建前的完整數據,快照創建後,上層業務產生的數據都寫入了快照中。因此,若要刪除快照,必然要先將快照卷中的數據,回拷到源卷中,拷貝完成才能刪除,如上圖。此時我們可以設想,如果,針對一份源數據,在18:00創建了快照,上層業務持續產生大量新的數據,19:00又創建了快照,20:00又創建了快照……那麼,在有多份快照的情況下,如果需要刪除快照,就會出現,多個快照向源卷回拷數據的情況,可能導致回拷量非常大,耗時很長。


兩種技術對比

如上表,COW的寫時拷貝,導致每次寫入都有拷貝操作,大量寫入時,源卷的寫性能會有所下降,而讀源卷是不會受到任何影響的,刪除快照時,只是解除了快照和源卷的關係,同時刪除了快照卷的數據而已。ROW在每次寫入僅做了重定向操作,這個操作耗時是幾乎可以忽略不計的,源卷的寫性能幾乎不會受到影響,但讀源卷時,則需要判斷數據是創建快照前還是創建快照後,導致大量讀時,性能受到一定影響,比較致命的是,若源卷有多個快照,在刪除快照時,所有快照的數據均需要回拷到源卷才可以保證源卷數據的完整性。

結語

上面簡單地介紹了存儲快照的實現原理,實際上,快照特性應用廣泛,其應用對象是很多的:

目前,主流廠商在自研產品上,對上面的ROW和COW技術都有小範圍的改動,也有一些新興的快照技術已經誕生,但這個行業里,沒有最好的快照技術。技術為業務服務,只有針對業務類型做好本地化適配,才能達到最佳效用。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 雲加社區 的精彩文章:

都是工程師,為啥別人那麼優秀?面向未來的跨界開發技術(上)

TAG:雲加社區 |