1. 程式人生 > >最全資料保護技術和備份知識

最全資料保護技術和備份知識

640?wx_fmt=jpeg

640?wx_fmt=gif&wxfrom=5&wx_lazy=1

所謂資料保護是指對當前時間點上的資料進行備份,如果說一份資料被誤刪除了,可以通過備份資料找回來。從底層來分,資料保護可以分為檔案級保護和塊級保護。


檔案級備份


檔案級備份:將磁碟上所有檔案通過呼叫檔案系統介面備份到另一個介質上。也就是把資料以檔案形式讀出,然後儲存在另一個介質上面此時備份軟體只能感知到檔案這一層。


我們知道一般來說,檔案在原來的介質上,可以是不連續存放的,通過檔案系統來管理和訪問。當備份到新的介質上以後,檔案完全可以連續存放。正因為如此,沒有必要備份元資料,因為利用新介質進行恢復的時候,反正會重構檔案系統。


塊級備份


塊級備份:就是不管塊上是否有資料,不考慮檔案系統的邏輯,備份塊裝置上的每個塊。


這樣好處是不通過呼叫檔案系統介面,速度更快,缺點的是備份的時候會把所有的塊複製一遍,但是實際上很多扇區的資料是不對應真實檔案的,也就是會備份很多殭屍扇區。而且備份之後,原來不連續的檔案一樣是不連續的檔案,有很多的碎片。

640?wx_fmt=other

遠端檔案複製


遠端檔案複製:通過網路傳輸到異地容災點。典型的代表是rsync非同步遠端檔案同步軟體。可以監視檔案系統的動作,將檔案的變化,同步到異地站點。增量複製。


遠端卷映象


這是基於的遠端備份。與遠端檔案複製

不同的地方在於,是把塊資料備份到異地站點。又可以分為同步和非同步複製。


  • 同步複製:必須等資料複製到異地站點以後,才通報上層IO成功訊息

  • 非同步複製:寫入成功即可回覆成功,然後通過網路傳輸到異地。不能保證一致性,但是上層響應快。


基於塊的備份措施,一般都是在底層裝置上進行,不耗費主機資源。

640?wx_fmt=other



快照技術


遠端映象確實是對生產資料一種非常好的保護,但是需要映象卷一直線上,主卷有寫IO,那麼映象卷也需要有寫IO。


如果想對映象卷進行備份,需要將停止主卷的讀寫,然後將兩個卷的映象關係分離。所以當恢復主卷的IO的時候,映象卷不會再被讀寫。然後才可以備份映象卷的資料。


這樣會存在一個問題,主捲上還繼續有IO,將會導致資料與備份的映象不一致。所以主捲上所有的寫IO動作,會以點陣圖BitMap方式記錄下來,BitMap上的每個位表示捲上的一個塊,0表示未寫入,1表示已寫入,所以當拆分映象以後,被寫入了資料,程式將BitMap檔案對應位從0變為1。備份完成以後,再做資料同步即可。


可以看出上述過程比較的繁瑣,而且需要佔用一塊和主卷一樣大小的映象卷。


快照技術就是為了解決這種問題,其基本思想是抓取某一時間點磁碟捲上的所有資料。


640?wx_fmt=other



快照分為:基於檔案系統的快照和基於物理卷的快照,下面介紹一下快照的底層原理。


基於檔案系統的快照


檔案系統管理的精髓:連結串列、B樹、點陣圖,也就是元資料。


檔案系統


  • 將扇區組合成更大的邏輯塊來降低管理規模。NTFS最大塊可以到4KB,也就是8個扇區一組一個簇(Block),這樣可以減少管理成本。

  • 檔案系統會建立所管理儲存空間上所有簇的點陣圖檔案。每個位代表捲上的簇(或者物理扇區)是否被使用,如果被使用,則置1。

  • 檔案系統儲存一份檔案和其對應簇號的對映鏈。因為對映鏈本身和簇點陣圖也是檔案,也有自己的對映鏈,所以針對重要的元資料,有一個固定的入口: root inode


寫入新資料

  • 查詢簇點陣圖,找位值為0的簇號

  • 計算所需空間, 分配簇號給檔案

  • 將資料寫入簇,再去檔案——簇號對映圖更新

  • 將對應的簇對映關係記錄下來,到簇點陣圖將對應位置改為1。


刪除資料

  • 直接在簇號對映鏈中抹掉

  • 簇點陣圖對應簇改為0。


可以看出刪除資料實際上不會抹掉實際的資料。所以,最重要的不是資料,而是檔案——簇號對映鏈和點陣圖等元資料。


640?wx_fmt=other


也就是說我們要做備份,只需要把某時刻的檔案系統中的對映圖表儲存下來。但是必須保證卷上的資料不被IO寫入了,同時又要不應用還不能中斷。既然原來的空間不能再寫了,我們可以寫到其他的空閒區域。


  • 思路一:Copy on First Write (CoFW),在覆蓋資料塊之前,需要將被覆蓋的資料塊內容複製出來,放到空閒的空間。

  • 系統中將有兩套元資料鏈,原來的元資料指向當前,快照的元資料鏈指向歷史。原來的儲存空間永遠是最新的資料,歷史資料會逐漸搬出到空閒空間裡面。


640?wx_fmt=other


  • 思路二:Redirect on First Write (RoFW)。先複製元資料,然後將針對原始檔的更改都重定向到空餘空間,同時更新元資料

  • CoFW不同的是,原來的資料塊不會被覆蓋。同樣的,系統也有兩套元資料,一套是快照儲存下來的,永遠不更新,一套是原始檔系統的,不斷的更新。


其實只有首次覆蓋的時候,才重定向,因為重定向以後的資料塊,哪怕被覆蓋了,也不影響之前快照儲存的資料了。


到這一步,看上去挺完美,實際上存在一個問題: 如果元資料特別大怎麼辦?對於海量龐大的檔案系統,元資料量可能到GB級別。如果複製的話,時間上仍然太多。


我們可以回頭想想,實際上元資料可以看做指標,指向具體儲存的位置。我們複製到元資料,相當於複製了一堆指標。現在元資料太多了,我們能不能把這個元資料鏈的指標給複製了?當然可以,元資料有個根入口塊,或者稱為Super Block,這個塊是固定不變的,裡面存放有指向下一級元資料鏈塊的指標。


那麼作業系統每次載入元資料的時候,都需要從這個地址讀入Super Block,從而一層一層的遍歷。


基於物理卷的快照


基於物理卷的快照比檔案系統快照要簡單得多。因為LUN一般在底層磁碟上是恆定的,不像檔案系統一樣可以隨機細粒度的分佈。所以可以認為LUN的元資料就是在底層磁碟的起始和結束地址。這樣在快照的時候,需要複製的元資料就更少了,但是完成了以後,需要按照一定粒度來做CoFW或者RoFW,還需要記錄更多資料對映指標,就比較難受了。


對於實現了塊級虛擬化的系統如NetApp、XIV、3PAR等,它們的LUN在底層位置是不固定的,LUN就相當於一個檔案,存在元資料鏈來進行對映管理的維護,所以這些系統實現快照的原理與檔案系統快照類似。


基於物理卷的快照,相當於給物理卷增加了“卷扇區對映管理系統”。在底層卷實現快照,可以減輕檔案系統的負擔。


卷扇區方都是用LBA來編號的,實現快照的時候,程式首先保留一張初始LBA表,每當有新的寫入請求的時候,重定向到另一個地方,並在初始的LBA表中做好記錄,比如:


原始LBA:卷A的10000號,對映到LBA:卷B的100號。


值得說明的是,檔案系統無法感知重定向,檔案系統在它的對映圖裡面還是記錄了原始的LBA地址此時如果來了新的寫IO,有兩種方式一種是Write Redirect,另外一種是Copy on Write


所謂Write Redirect就是將檔案系統的讀寫請求,重定向到卷B,這樣每次IO其實都會查詢快照對映表,降低了效能。所以引入了Copy on Write。


所謂Copy on write,就是當寫請求來的時候,先把原來的扇區的資料複製一份到空閒卷,然後將新資料寫入原卷。不過這種複製操作只發生在原卷某個或者快照之後從未更新過的塊上面,若是某個塊在快照之後更新過了,說明之前的資料已經轉移走了,可以放心的覆蓋。


所以Copy on Write實際上是讓舊資料先佔著位置,等新資料來了以後先把原來的資料複製走,再更新,而且一旦更新了一次,可以直接覆蓋。


帶來的好處是 ,原捲上的資料隨時是最新的狀態,每個IO可以直接訪問原卷的地址,而不需要遍歷對映表。


640?wx_fmt=other


RoFW方式與CoFW方式比較


不管是RoFW還是CoFW,只要上層向快照後沒有更新過的資料塊進行寫,都需要佔用一個新的塊。所以如果將所有扇區塊都更新了,新卷的容量和原來的容量應該一樣大,但是通常不會覆蓋百分之百,所以只要預設原容量的30%即可。


IO資源消耗:


  • CoFW方式下,如果要更新一個從未更新的塊,需要複製出來,寫到新卷,然後覆蓋原來的塊,需要一次讀,2寫

  • RoFW方式下,只需要一次寫即可,也就是直接重定向到新捲上,然後更新對映圖中的指(在記憶體中進行)。


所以RoFW相對CoFW方式在IO資源消耗與IO延遲上有優勢。


由於只有首次覆蓋才會Copy或者Redirect,那麼如何區分是否是首次覆蓋呢?可以使用記錄表(檔案級快照)或者點陣圖(卷快照)來記錄每個塊是否被覆蓋過。


對於讀IO:


  • CoFW:因為總是更新的源卷,所以源卷總是代表最新的狀態,所以任何讀IO都會發到源來執行。

  • RoFW:需要首先查詢點陣圖來確定目標地址是否被處理過,如果是,則轉向重定向後的地址。


RoFW會影響讀效能,因為重定向出去以後,資料塊排布都是亂的,如果把快照刪除後,不好清理戰場,嚴重影響後續的讀寫效能。


綜合來說,RoFW比較吃計算資源,而CoFW比較耗費IO資源。我們知道其實一般來說讀比寫多,當覆蓋第二次以後:


  • CoFW不會發生IO懲罰,讀IO一直沒有懲罰

  • 對於RoFW,就算完全被Redirect過了,對於讀或者寫IO,均需要遍歷點陣圖,永遠無法擺脫對計算資源的消耗。


尤其在LUN卷級快照下,原本卷在底層磁碟分散式是定死的,定址非常迅速。但是RoFW引入了,LUN的塊隨機定向到其他的空間的,所以需要記錄新的指標鏈,而且被寫出的塊不是連續排列的。對效能影響非常明顯的。


絕大多數的廠商使用的還是CoFW,但是一些本來就使用LUN隨機分塊分佈模式的儲存系統比如XIV、NetApp等,都使用RoFW,因為原本其LUN的元資料鏈就很複雜,而且原來就是隨機分佈的,RoFW的後遺症對它們反而是正常的。


640?wx_fmt=other


快照的意義


快照所儲存下來的卷資料,相當於一次意外掉電之後捲上的資料。怎麼理解?


上層應用和檔案系統都有快取,檔案系統快取的是檔案系統的元資料和檔案的實體資料。每隔一段時間(Linux一般是30s)批量Flush到磁碟上。而且不是隻做一次IO,有可能會對磁碟做多次IO。如果快照生成的時間恰恰在這連續的IO之間,那麼此時捲上的資料實際上有可能不一致。


檔案系統的機制是先寫入資料到磁碟,元資料儲存在快取裡面,最後再寫元資料。因為如果先寫元資料,突然斷電了,那麼元資料對應的殭屍扇區的資料會被認為是檔案的,顯然後果不堪設想。


總之,快照極可能生成不一致的資料。


那麼為什麼還要用快照呢?


  • 因為快照可以任意生成,而且佔用的空間又不大,更重要的是可以線上恢復,不用停機只需要在記憶體中做IO重定向,那麼上層訪問就變成以前時間點的資料了。


但是快照會存在不一致的問題,如何解決?既然快照無異於一次磁碟掉電,那麼利用快照恢復資料之後,檔案系統可以進行一致性檢查,資料庫也會利用日誌來使資料檔案處於一致。


另外,現在主流的快照解決方案是在主機上安裝一個代理執行快照前,先通知檔案系統將快取中的資料全部Flush到磁碟,然後立即生成快照。


  • 快照還可以預防資料邏輯損壞,也就是比如T1時刻,做了快照,T2時刻,因為管理員操作不當,誤刪了一個檔案,T3的時候,進行了全備份操作。此時,這個檔案看似永久丟失了,其實,此時還可以通過快照恢復這個檔案。

  • 快照還可以降低一致性備份的視窗。如果沒有快照,要對某個捲進行一致性備份,需要暫停寫IO,所以備份視窗比較長,需要等待備份停止以後才能繼續寫IO。使用快照的話,只需要複製元資料,然後在後臺進行備份,降低了影響。

  • 備份完畢以後,如何能檢測資料是否是真一致的?若沒有快照,需要將備份資料恢復到獨立的物理空間裡面,掛載到另一臺機器上。有了快照,可以將快照直接掛載到另一臺主機,避免了資料物理恢復匯入的過程。


640?wx_fmt=other


卷Clone技術


快照類似於某時刻的影子,而克隆則是某時刻的實體。每時刻生成了一份可寫的快照,就叫對卷某時刻的一份Clone。然後這份Clone內容每被修改的部分是與源卷共享的,所以源卷沒了,則Clone就沒了,所以叫虛擬Clone。如果把資料複製出來,生成一個獨立的卷,則就叫Split Clone,也就是可以得到實Clone


卷Clone最大的好處在於可以瞬間生成針對某個卷可寫的映象,而不管卷的資料量有多大。資料備份系統的基本要件:


  • 備份物件:需要進行備份的備份源。

  • 備份目的:磁碟、磁帶等介質

  • 備份通路:網路

  • 備份執行引擎:備份軟體

  • 備份策略


下面重點介紹一下備份目的、備份通路、備份引擎等技術細節。


備份目的


備份到本地磁碟


備份目的地是在本地的磁碟,則只需要將資料備份到本地磁碟的另外分割槽中或者目錄中。這樣不需要網路,缺點是對備份物件自己的效能影響大。還會對其他的IO密集型程式造成影響。


這種方式一般用於不關鍵的應用和非IO密集型應用。比如E-mail,對轉發實時性要求不高。


備份到SAN上的磁碟


備份到SAN上的磁碟,就是將需要備份的資料,從本次磁碟讀入記憶體,再寫入HBA卡緩衝區,然後再通過線纜傳送到磁碟陣列上。


  • 優點:只耗費SAN公用網路頻寬,對主體影響小。

  • 缺點:對公共網路資源和出口頻寬有影響。


備份到NAS目錄


備份到NAS目錄就是將資料備份到遠端共享目錄中。比如window中常用的資料夾共享。因為資料一般是通過乙太網進行傳遞的,佔用了前端的網路頻寬,但是相對廉價,不需要部署SAN。


備份到磁帶庫


現在出現一種虛擬磁帶庫,即用磁碟來模擬磁帶,對主機來說看到的是一臺磁帶庫,實際上是一臺磁碟陣列,主機照樣使用磁帶庫一樣來使用虛擬磁帶庫。要做到這點,就必須在磁碟陣列的控制器上做虛擬化操作,也就是實現協議轉換器的作用。可以帶來了的好處是:


  • 速度提升

  • 避免機械手這種複雜的機械裝置

  • 管理方便


資訊生命週期管理


將使用不頻繁的資料移動到低速、低成本的裝置上。比如只給視訊應用分配20GB的空間,但是報告有500GB的空間,剩下的空間是在在磁帶庫上。


分級儲存


  1. 一線磁碟陣列

  2. 二線虛擬磁帶庫:近期不會被頻繁排程。利用大容量SATA盤,效能適中的控制器。

  3. 帶庫或者光碟庫:幾年甚至幾十年都不訪問到。

640?wx_fmt=other



備份通路


本地備份


資料流向:本地磁碟——匯流排——磁碟控制器——匯流排——記憶體——匯流排——磁碟控制器——匯流排——本地磁碟。


也即資料從本地磁碟出發,經過本地的匯流排 和記憶體,經過CPU少量控制邏輯程式碼之後,流回本地磁碟。


通過前端網路備份


經過前端網路備份的資料流向是:本地磁碟——匯流排——磁碟控制器——匯流排——記憶體——匯流排——乙太網卡——網線——乙太網——網線——目標計算機的網絡卡——匯流排——記憶體——匯流排——目標計算機的磁碟。


資料從本地磁碟出發,流經本地匯流排和記憶體,然後流到本地網絡卡,通過網路傳送到目標計算機磁碟。


  • 前端網路:伺服器接受客戶端連線的網路,也就是服務網路,是伺服器和客戶端連線的必經之路。

  • 後端網路:對客戶封閉,客戶的連線不用經過這個網路,用與伺服器和儲存、應用伺服器、資料庫伺服器的連線。可以是SAN,乙太網


通過後端網路備份


通過後端網路備份的資料流向是:本地磁碟——匯流排——控制器——匯流排——記憶體——匯流排——後端HBA卡——線纜——後端交換裝置——線纜——備份目的的後端網絡卡——匯流排——記憶體——磁碟。


LAN Free備份


備份的時候不經過LAN,也就是不流經前端網路,也叫Frontend Free。這樣的好處是不耗費前端網路的頻寬,對客戶終端接受伺服器的資料不影響。


因為前端網路一般是是慢速網路 ,資源非常珍貴。無論是本地、還是網路,都需要待備份的伺服器付出代價,即需要讀取備份源資料到自身的記憶體,然後從記憶體寫入備份的目的地。對主機CPU、記憶體都有浪費。能否不消耗伺服器的效能呢?可以,使用Server Free備份。


Server Free備份


Server Free備份的時候,資料不用流經伺服器的匯流排和記憶體,消耗極少,甚至不消耗主機資源。備份源和備份目標都不會在伺服器上,因為如果在伺服器上,資料從磁碟讀出,要流將匯流排,然後到記憶體,這就不是Server Free?那怎麼做呢?


  • SCSI的擴充套件複製命令,將這些命令傳送給支援Server Free的儲存裝置,然後這些裝置會提取自身的資料寫入備份目的裝置,而不是傳送給主機。

  • 使用另一臺專門做資料移動的新伺服器,來代替原來伺服器移動備份資料。釋放運算壓力很大的生產伺服器。


備份策略


備份引擎:決定整個資料備份系統應該怎麼運作,備份那些內容,什麼時候開始備份,備份時間有沒有限制等的策略。


備份伺服器


備份引擎以什麼形式體現呢?當然是執行在主機上的程式,所以需要一臺計算機來做引擎的執行者。


那麼備份伺服器的備份策略和規則,怎麼傳給整個資料備份系統中的伺服器?通過乙太網,因為乙太網擴充套件性好,適合節點間通訊。相對於乙太網,SAN更適合傳送大量的資料。所以常用前端網路來連線待備份的伺服器和備份伺服器,因為備份策略的資料包不多。


備份伺服器如何與每個待備份的伺服器建立通話?怎麼通話?規則怎麼定?需要待備份伺服器上執行一個代理程式,專門解釋備份伺服器發來的命令,根據命令作出動作。


這個執行在待備份伺服器上的程式,就叫備份代理,監聽埠,接收備份伺服器發來的命令。


介質伺服器


若資料備份系統中有一臺SCSI磁帶機,且多臺主機想備份到這臺磁帶機上。而SCSI磁帶機只能同時接到一臺主機上。


那麼怎麼辦呢?可以引入一臺專門的計算機,只能由這臺計算機來操作磁帶機。


需要備份的計算機通過乙太網將資料發給這臺掌管磁帶機的計算機,然後寫給磁帶機。


這樣磁帶機成為了公用裝置,而在整個系統中,只有一臺計算機能掌管備份目標,它就類似於一個代理,代理其他伺服器執行備份。我們把它稱為介質伺服器。還有一個問題,如果有多臺伺服器向介質伺服器發出請求,怎麼辦?當然需要一個協調員,也就是備份伺服器,它可以指揮安裝在待備份伺服器的代理,讓每臺伺服器按照順序有條理的使用介質伺服器提供的備份介質進行備份。


三種備份方式


完全備份:不管檔案多大,只要要備份,都需要將檔案都備份下來。


差量備份:只備份從上次完全備份以來發生變化的資料。差量備份要求必須做一次完全備份,作為差量的基準點


增量備份:只備份從上次備份以來這份檔案中變化過的資料。不管是全備、差備,還是增量備份。


對於資料庫的備份,備份軟體想知道每個資料檔案的變化是不可能的,因為資料庫檔案內部格式非常複雜,只有自己才能分析和檢測出來。所以資料庫管理軟體有自己的備份工具。第三方備份軟體只能呼叫資料庫軟體自身提供的命令。


640?wx_fmt=other


連結:https://www.jianshu.com/p/b14ece444676

來源:簡書

編譯:架構師技術聯盟

版權由原作者所有,轉載請註明來源和出處


推薦閱讀:



溫馨提示:

請識別二維碼關注公眾號,點選原文連結獲取電子書技術資料和文章

640?wx_fmt=jpeg

640?wx_fmt=gif&wxfrom=5&wx_lazy=1