編者註:備份是為了增強企業關鍵數據可靠性和數據冗餘性,備份的必要性不言而喻。今天我們來探討下備份常用的技術和分類,點擊文章「英方災備產品和方案白皮書」附白皮書下載。
所謂數據保護技術是指對當前時間點上的數據進行備份,如果說原始數據被誤刪除了,可以通過備份數據找回或恢復數據。從底層來分,數據保護可以分為文件級保護和塊級保護。
文件級備份:將磁碟上所有文件通過調用文件系統接口備份到另一個介質上。也就是把數據以文件形式讀出,然後存儲在另一個介質上面。此時備份軟體只能感知到文件這一層。
我們知道一般來說,文件在原來的介質上,可以是不連續存放的,通過文件系統來管理和訪問。當備份到新的介質上以後,文件完全可以連續存放。正因為如此,沒有必要備份元數據,因為利用新介質進行恢復的時候,反正會重構文件系統。
塊級備份:就是不管塊上是否有數據,不考慮文件系統的邏輯,備份塊設備上的每個塊。
這樣好處是不通過調用文件系統接口,速度更快,缺點的是備份的時候會把所有的塊複製一遍,但是實際上很多扇區的數據是不對應真實文件的,也就是會備份很多殭屍扇區。而且備份之後,原來不連續的文件一樣是不連續的文件,有很多的碎片。
遠程文件複製:通過網絡傳輸到異地容災點。典型的代表是rsync異步遠程文件同步軟體。可以監視文件系統的動作,將文件的變化,同步到異地站點。增量複製。
這是基於塊的遠程備份。與遠程文件複製不同的地方在於,是把塊數據備份到異地站點。又可以分為同步和異步複製。
基於塊的備份措施,一般都是在底層設備上進行,不耗費主機資源。
遠程鏡像確實是對生產數據一種非常好的保護,但是需要鏡像卷一直在線,主卷有寫IO,那麼鏡像卷也需要有寫IO。
如果想對鏡像卷進行備份,需要將停止主卷的讀寫,然後將兩個卷的鏡像關係分離。所以當恢復主卷的IO的時候,鏡像卷不會再被讀寫。然後才可以備份鏡像卷的數據。
這樣會存在一個問題,主卷上還繼續有IO,將會導致數據與備份的鏡像不一致。所以主卷上所有的寫IO動作,會以位圖BitMap方式記錄下來,BitMap上的每個位表示卷上的一個塊,0表示未寫入,1表示已寫入,所以當拆分鏡像以後,被寫入了數據,程序將BitMap文件對應位從0變為1。備份完成以後,再做數據同步即可。
可以看出上述過程比較的繁瑣,而且需要佔用一塊和主卷一樣大小的鏡像卷。
快照技術就是為了解決這種問題,其基本思想是抓取某一時間點磁碟卷上的所有數據。
快照分為:基於文件系統的快照和基於物理卷的快照,下面介紹一下快照的底層原理。
文件系統管理的精髓:鍊表、B樹、位圖,也就是元數據。
文件系統
寫入新數據
刪除數據
可以看出刪除數據實際上不會抹掉實際的數據。所以,最重要的不是數據,而是文件——簇號映射鏈和位圖等元數據。
也就是說我們要做備份,只需要把某時刻的文件系統中的映射圖表保存下來。但是必須保證卷上的數據不被IO寫入了,同時又要不應用還不能中斷。既然原來的空間不能再寫了,我們可以寫到其他的空閒區域。
其實只有首次覆蓋的時候,才重定向,因為重定向以後的數據塊,哪怕被覆蓋了,也不影響之前快照保存的數據了。
到這一步,看上去挺完美,實際上存在一個問題: 如果元數據特別大怎麼辦?對於海量龐大的文件系統,元數據量可能到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可以直接訪問原卷的地址,而不需要遍歷映射表。
不管是RoFW還是CoFW,只要上層向快照後沒有更新過的數據塊進行寫,都需要佔用一個新的塊。所以如果將所有扇區塊都更新了,新卷的容量和原來的容量應該一樣大,但是通常不會覆蓋百分之百,所以只要預設原容量的30%即可。
IO資源消耗:
所以RoFW相對CoFW方式在IO資源消耗與IO延遲上有優勢。
由於只有首次覆蓋才會Copy或者Redirect,那麼如何區分是否是首次覆蓋呢?可以使用記錄表(文件級快照)或者位圖(卷快照)來記錄每個塊是否被覆蓋過。
對於讀IO:
RoFW會影響讀性能,因為重定向出去以後,數據塊排布都是亂的,如果把快照刪除後,不好清理戰場,嚴重影響後續的讀寫性能。
綜合來說,RoFW比較吃計算資源,而CoFW比較耗費IO資源。我們知道其實一般來說讀比寫多,當覆蓋第二次以後:
尤其在LUN卷級快照下,原本卷在底層磁碟分布式是定死的,尋址非常迅速。但是RoFW引入了,LUN的塊隨機定向到其他的空間的,所以需要記錄新的指針鏈,而且被寫出的塊不是連續排列的。對性能影響非常明顯的。
絕大多數的廠商使用的還是CoFW,但是一些本來就使用LUN隨機分塊分布模式的存儲系統比如XIV、NetApp等,都使用RoFW,因為原本其LUN的元數據鏈就很複雜,而且原來就是隨機分布的,RoFW的後遺症對它們反而是正常的。
快照所保存下來的卷數據,相當於一次意外掉電之後卷上的數據。怎麼理解?
上層應用和文件系統都有緩存,文件系統緩存的是文件系統的元數據和文件的實體數據。每隔一段時間(Linux一般是30s)批量Flush到磁碟上。而且不是只做一次IO,有可能會對磁碟做多次IO。如果快照生成的時間恰恰在這連續的IO之間,那麼此時卷上的數據實際上有可能不一致。
文件系統的機制是先寫入數據到磁碟,元數據保存在緩存裡面,最後再寫元數據。因為如果先寫元數據,突然斷電了,那么元數據對應的殭屍扇區的數據會被認為是文件的,顯然後果不堪設想。
總之,快照極可能生成不一致的數據。
那麼為什麼還要用快照呢?
但是快照會存在不一致的問題,如何解決?既然快照無異於一次磁碟掉電,那麼利用快照恢復數據之後,文件系統可以進行一致性檢查,資料庫也會利用日誌來使數據文件處於一致。
另外,現在主流的快照解決方案是在主機上安裝一個代理,執行快照前,先通知文件系統將緩存中的數據全部Flush到磁碟,然後立即生成快照。
快照類似於某時刻的影子,而克隆則是某時刻的實體。每時刻生成了一份可寫的快照,就叫對卷某時刻的一份Clone。然後這份Clone內容每被修改的部分是與源卷共享的,所以源卷沒了,則Clone就沒了,所以叫虛擬Clone。如果把數據複製出來,生成一個獨立的卷,則就叫Split Clone,也就是可以得到實Clone。
卷Clone最大的好處在於可以瞬間生成針對某個卷可寫的鏡像,而不管卷的數據量有多大。數據備份系統的基本要件:
下面重點介紹一下備份目的、備份通路、備份引擎等技術細節。
備份目的地
備份目的地是在本地的磁碟,則只需要將數據備份到本地磁碟的另外分區中或者目錄中。這樣不需要網絡,缺點是對備份對象自己的性能影響大。還會對其他的IO密集型程序造成影響。
這種方式一般用於不關鍵的應用和非IO密集型應用。比如E-mail,對轉發實時性要求不高。
備份到SAN上的磁碟,就是將需要備份的數據,從本次磁碟讀入內存,再寫入HBA卡緩衝區,然後再通過線纜傳送到磁碟陣列上。
備份到NAS目錄就是將數據備份到遠程共享目錄中。比如window中常用的文件夾共享。因為數據一般是通過乙太網進行傳遞的,佔用了前端的網絡帶寬,但是相對廉價,不需要部署SAN。
現在出現一種虛擬磁帶庫,即用磁碟來模擬磁帶,對主機來說看到的是一臺磁帶庫,實際上是一臺磁碟陣列,主機照樣使用磁帶庫一樣來使用虛擬磁帶庫。要做到這點,就必須在磁碟陣列的控制器上做虛擬化操作,也就是實現協議轉換器的作用。可以帶來了的好處是:
將使用不頻繁的數據移動到低速、低成本的設備上。比如只給視頻應用分配20GB的空間,但是報告有500GB的空間,剩下的空間是在在磁帶庫上。
數據流向:本地磁碟—>總線—>磁碟控制器—>總線—>內存—>總線—>磁碟控制器—>總線—>本地磁碟。
也即數據從本地磁碟出發,經過本地的總線 和內存,經過CPU少量控制邏輯代碼之後,流回本地磁碟。
經過前端網絡備份的數據流向是:本地磁碟—>總線—>磁碟控制器—>總線—>內存—>總線—>乙太網卡—>網線—>乙太網—>網線—>目標計算機的網卡—>總線—>內存—>總線—>目標計算機的磁碟。
數據從本地磁碟出發,流經本地總線和內存,然後流到本地網卡,通過網絡傳送到目標計算機磁碟。
通過後端網絡備份的數據流向是:本地磁碟—>總線—>控制器—>總線—>內存—>總線—>後端HBA卡—>線纜—>後端交換設備—>線纜—>備份目的的後端網卡—>總線—>內存—>磁碟。
備份的時候不經過LAN,也就是不流經前端網絡,也叫Frontend Free。這樣的好處是不耗費前端網絡的帶寬,對客戶終端接受伺服器的數據不影響。
因為前端網絡一般是是慢速網絡 ,資源非常珍貴。無論是本地、還是網絡,都需要待備份的伺服器付出代價,即需要讀取備份源數據到自身的內存,然後從內存寫入備份的目的地。對主機CPU、內存都有浪費。能否不消耗伺服器的性能呢?可以,使用Server Free備份。
Server Free備份的時候,數據不用流經伺服器的總線和內存,消耗極少,甚至不消耗主機資源。備份源和備份目標都不會在伺服器上,因為如果在伺服器上,數據從磁碟讀出,要流將總線,然後到內存,這就不是Server Free?那怎麼做呢?
備份引擎:決定整個數據備份系統應該怎麼運作,備份那些內容,什麼時候開始備份,備份時間有沒有限制等的策略。
備份引擎以什麼形式體現呢?當然是運行在主機上的程序,所以需要一臺計算機來做引擎的執行者。
那麼備份伺服器的備份策略和規則,怎麼傳給整個數據備份系統中的伺服器?通過乙太網,因為乙太網擴展性好,適合節點間通信。相對於乙太網,SAN更適合傳送大量的數據。所以常用前端網絡來連接待備份的伺服器和備份伺服器,因為備份策略的數據包不多。
備份伺服器如何與每個待備份的伺服器建立通話?怎麼通話?規則怎麼定?需要待備份伺服器上運行一個代理程序,專門解釋備份伺服器發來的命令,根據命令作出動作。
這個運行在待備份伺服器上的程序,就叫備份代理,監聽埠,接收備份伺服器發來的命令。
若數據備份系統中有一臺SCSI磁帶機,且多臺主機想備份到這臺磁帶機上。而SCSI磁帶機只能同時接到一臺主機上。
那麼怎麼辦呢?可以引入一臺專門的計算機,只能由這臺計算機來操作磁帶機。
需要備份的計算機通過乙太網將數據發給這臺掌管磁帶機的計算機,然後寫給磁帶機。
這樣磁帶機成為了公用設備,而在整個系統中,只有一臺計算機能掌管備份目標,它就類似於一個代理,代理其他伺服器執行備份。我們把它稱為介質伺服器。還有一個問題,如果有多臺伺服器向介質伺服器發出請求,怎麼辦?當然需要一個協調員,也就是備份伺服器,它可以指揮安裝在待備份伺服器的代理,讓每臺伺服器按照順序有條理的使用介質伺服器提供的備份介質進行備份。
差量備份:只備份從上次完全備份以來發生變化的數據。差量備份要求必須做一次完全備份,作為差量的基準點
對於資料庫的備份,備份軟體想知道每個數據文件的變化是不可能的,因為資料庫文件內部格式非常複雜,只有自己才能分析和檢測出來。所以資料庫管理軟體有自己的備份工具。第三方備份軟體只能調用資料庫軟體自身提供的命令。