存儲之數(shù)據(jù)保護和備份技術
從底層來分,數(shù)據(jù)保護可以分為文件級保護和塊級保護。
文件級備份
文件級備份:將磁盤上所有文件通過調用文件系統(tǒng)接口備份到另一個介質上。也就是把數(shù)據(jù)以文件形式讀出,然后存儲在另一個介質上面。
此時備份軟件只能感知到文件這一層。
我們知道一般來說,文件在原來的介質上,可以是不連續(xù)存放的,通過文件系統(tǒng)來管理和訪問。當備份到新的介質上以后,文件完全可以連續(xù)存放。正因為如此,沒有必要備份元數(shù)據(jù),因為利用新介質進行恢復的時候,反正會重構文件系統(tǒng)。
塊級備份
塊級備份就是不管塊上是否有數(shù)據(jù),不考慮文件系統(tǒng)的邏輯,備份塊設備上的每個塊。
這樣好處是不通過調用文件系統(tǒng)接口,速度更快,缺點的是備份的時候會把所有的塊復制一遍,但是實際上很多扇區(qū)的數(shù)據(jù)是不對應真實文件的,也就是會備份很多僵尸扇區(qū)。而且備份之后,原來不連續(xù)的文件一樣是不連續(xù)的文件,有很多的碎片。
高級數(shù)據(jù)保護
遠程文件復制
遠程文件復制:通過網絡傳輸?shù)?/span>異地容災點。典型的代表是rsync異步遠程文件同步軟件??梢员O(jiān)視文件系統(tǒng)的動作,將文件的變化,同步到異地站點。增量復制。
遠程卷鏡像
這是基于塊的遠程備份。與遠程文件復制不同的地方在于,是把塊數(shù)據(jù)備份到異地站點。又可以分為同步和異步復制。
-
同步復制:必須等數(shù)據(jù)復制到異地站點以后,才通報上層IO成功消息
-
異步復制:寫入成功即可回復成功,然后通過網絡傳輸?shù)疆惖?。不能保證一致性,但是上層響應快。
基于塊的備份措施,一般都是在底層設備上進行,不耗費主機資源。
快照
遠程鏡像確實是對生產數(shù)據(jù)一種非常好的保護,但是需要鏡像卷一直在線,主卷有寫IO,那么鏡像卷也需要有寫IO。
如果想對鏡像卷進行備份,需要將停止主卷的讀寫,然后將兩個卷的鏡像關系分離。所以當恢復主卷的IO的時候,鏡像卷不會再被讀寫。然后才可以備份鏡像卷的數(shù)據(jù)。
這樣會存在一個問題,主卷上還繼續(xù)有IO,將會導致數(shù)據(jù)與備份的鏡像不一致。所以主卷上所有的寫IO動作,會以位圖bitmap方式記錄下來,bitmap上的每個位表示卷上的一個塊,0表示未寫入,1表示已寫入,所以當拆分鏡像以后,被寫入了數(shù)據(jù),程序將bitmap文件對應位從0變?yōu)?。備份完成以后,再做數(shù)據(jù)同步即可。
可以看出上述過程比較的繁瑣,而且需要占用一塊和主卷一樣大小的鏡像卷。
快照技術就是為了解決這種問題,其基本思想是抓取某一時間點磁盤卷上的所有數(shù)據(jù)。
快照分為:基于文件系統(tǒng)的快照和基于物理卷的快照
下面介紹一下快照的底層原理。
基于文件系統(tǒng)的快照
文件系統(tǒng)管理的精髓:鏈表、B樹、位圖,也就是元數(shù)據(jù)
文件系統(tǒng)
- 將扇區(qū)組合成更大的邏輯塊來降低管理規(guī)模。NTFS***塊可以到4KB,也就是8個扇區(qū)一組一個簇(Block),這樣可以減少管理成本。
- 文件系統(tǒng)會創(chuàng)建所管理存儲空間上所有簇的位圖文件。每個位代表卷上的簇(或者物理扇區(qū))是否被使用,如果被使用,則置1。
- 文件系統(tǒng)保存一份文件和其對應簇號的映射鏈。因為映射鏈本身和簇位圖也是文件,也有自己的映射鏈,所以針對重要的元數(shù)據(jù),有一個固定的入口:root inode
寫入新數(shù)據(jù)
- 查找簇位圖,找位值為0的簇號,
- 計算所需空間, 分配簇號給文件
- 將數(shù)據(jù)寫入簇,再去文件——簇號映射圖更新
- 將對應的簇映射關系記錄下來,到簇位圖將對應位置改為1.
刪除數(shù)據(jù)
- 直接在簇號映射鏈中抹掉,
- 簇位圖對應簇改為0
可以看出刪除數(shù)據(jù)實際上不會抹掉實際的數(shù)據(jù)。
** 所以,最重要的不是數(shù)據(jù),而是文件——簇號映射鏈和位圖等元數(shù)據(jù)。**
也就是說我們要做備份,只需要把某時刻的文件系統(tǒng)中的映射圖表保存下來。但是必須保證卷上的數(shù)據(jù)不被IO寫入了,同時又要不應用還不能中斷。既然原來的空間不能再寫了,我們可以寫到其他的空閑區(qū)域。
- 思路一:Copy on First Write (CoFW),
- 在覆蓋數(shù)據(jù)塊之前,需要將被覆蓋的數(shù)據(jù)塊內容復制出來,放到空閑的空間。
- 系統(tǒng)中將有兩套元數(shù)據(jù)鏈,原來的元數(shù)據(jù)指向當前,快照的元數(shù)據(jù)鏈指向歷史。原來的存儲空間永遠是***的數(shù)據(jù),歷史數(shù)據(jù)會逐漸搬出到空閑空間里面。
- 思路二:Redirect on First Write,(RoFW)。
- 先復制元數(shù)據(jù),然后將針對源文件的更改都重定向到空余空間,同時更新元數(shù)據(jù)。
- 與CoFW不同的是,原來的數(shù)據(jù)塊不會被覆蓋。同樣的,系統(tǒng)也有兩套元數(shù)據(jù),一套是快照保存下來的,永遠不更新,一套是源文件系統(tǒng)的,不斷的更新。
- 其實只有***覆蓋的時候,才重定向,因為重定向以后的數(shù)據(jù)塊,哪怕被覆蓋了,也不影響之前快照保存的數(shù)據(jù)了。
下圖為生成兩個快照之后系統(tǒng)處理流程。
到這一步,看上去挺***,實際上存在一個問題:如果元數(shù)據(jù)特別大怎么辦?對于海量龐大的文件系統(tǒng),元數(shù)據(jù)量可能到GB級別。如果復制的話,時間上仍然太多。
我們可以回頭想想,實際上元數(shù)據(jù)可以看做指針,指向具體存儲的位置。我們復制到元數(shù)據(jù),相當于復制了一堆指針?,F(xiàn)在元數(shù)據(jù)太多了,我們能不能把這個元數(shù)據(jù)鏈的指針給復制了?當然可以,元數(shù)據(jù)有個根入口塊,或者稱為Super Block,這個塊是固定不變的,里面存放有指向下一級元數(shù)據(jù)鏈塊的指針。
那么操作系統(tǒng)每次載入元數(shù)據(jù)的時候,都需要從這個地址讀入Super Block,從而一層一層的遍歷。
下圖為只復制Super Block以后的RoFW模式:
基于物理卷的快照
基于物理卷的快照比文件系統(tǒng)快照要簡單得多。因為LUN一般在底層磁盤上是恒定的,不像文件系統(tǒng)一樣可以隨機細粒度的分布。所以可以認為LUN的元數(shù)據(jù)就是在底層磁盤的起始和結束地址
這樣在快照的時候,需要復制的元數(shù)據(jù)就更少了,但是完成了以后,需要按照一定粒度來做CoFW或者RoFW,還需要記錄更多數(shù)據(jù)映射指針,就比較難受了。
對于實現(xiàn)了塊級虛擬化的系統(tǒng)如NetApp,XIV,3PAR等,它們的LUN在底層位置是不固定的,LUN就相當于一個文件,存在元數(shù)據(jù)鏈來進行映射管理的維護,所以這些系統(tǒng)實現(xiàn)快照的原理與文件系統(tǒng)快照類似。
基于物理卷的快照,相當于給物理卷增加了“卷扇區(qū)映射管理系統(tǒng)”。在底層卷實現(xiàn)快照,可以減輕文件系統(tǒng)的負擔。
卷扇區(qū)方都是用LBA來編號的,實現(xiàn)快照的時候,程序首先保留一張初始LBA表,每當有新的寫入請求的時候,重定向到另一個地方,并在初始的LBA表中做好記錄。比如
原始LBA:卷A的10000號,映射到LBA:卷B的100號。
值得說明的是,文件系統(tǒng)無法感知重定向,文件系統(tǒng)在它的映射圖里面還是記錄了原始的LBA地址。
此時如果來了新的寫IO,有兩種方式一種是Write Redirect 一種是Copy on Write
所謂Write Redirect就是將文件系統(tǒng)的讀寫請求,重定向到卷B,這樣每次IO其實都會查找快照映射表,降低了性能。所以引入了Copy on Write
所謂Copy on write,就是當寫請求來的時候,先把原來的扇區(qū)的數(shù)據(jù)復制一份到空閑卷,然后將新數(shù)據(jù)寫入原卷。不過這種復制操作只發(fā)生在原卷某個或者快照之后從未更新過的塊上面,若是某個塊在快照之后更新過了,說明之前的數(shù)據(jù)已經轉移走了,可以放心的覆蓋。
所以Copy on Write實際上是讓舊數(shù)據(jù)先占著位置,等新數(shù)據(jù)來了以后先把原來的數(shù)據(jù)復制走,再更新,而且一旦更新了一次,可以直接覆蓋。
帶來的好處是 ,原卷上的數(shù)據(jù)隨時是***的狀態(tài),每個IO可以直接訪問原卷的地址,而不需要遍歷映射表。
RoFW 方式與CoFW方式比較
不管是RoFW還是CoFW,只要上層向快照后沒有更新過的數(shù)據(jù)塊進行寫,都需要占用一個新的塊。所以如果將所有扇區(qū)塊都更新了,新卷的容量和原來的容量應該一樣大,但是通常不會覆蓋***,所以只要預設原容量的30%即可。
IO資源消耗:
- CoFW方式下,如果要更新一個從未更新的塊,需要復制出來,寫到新卷,然后覆蓋原來的塊,需要:一次讀,2寫。
- RoFW方式下,只需要一次寫即可,也就是直接重定向到新卷上,然后更新映射圖中的指針(在內存中進行)。
所以RoFW相對CoFW方式在IO資源消耗與IO延遲上有優(yōu)勢。
由于只有***覆蓋才會Copy或者Redirect,那么如何區(qū)分是否是***覆蓋呢?可以使用記錄表(文件級快照)或者位圖(卷快照)來記錄每個塊是否被覆蓋過。
對于讀IO,
- CoFW:因為總是更新的源卷,所以源卷總是代表***的狀態(tài),所以任何讀IO都會發(fā)到源來執(zhí)行
- RoFW:需要首先查詢位圖來確定目標地址是否被處理過,如果是,則轉向重定向后的地址。
- RoFW會影響讀性能,因為重定向出去以后,數(shù)據(jù)塊排布都是亂的,如果把快照刪除后,不好清理戰(zhàn)場,嚴重影響后續(xù)的讀寫性能。
綜合來說,RoFW比較吃計算資源,而CoFW比較耗費IO資源。
我們知道其實一般來說讀比寫多,當覆蓋第二次以后
- CoFW不會發(fā)生IO懲罰,讀IO一直沒有懲罰
- 對于RoFW,就算完全被Redirect過了,對于讀或者寫IO,均需要遍歷位圖,永遠無法擺脫對計算資源的消耗。
尤其在LUN卷級快照下,原本卷在底層磁盤分布式是定死的,尋址非常迅速。但是RoFW引入了,LUN的塊隨機定向到其他的空間的,所以需要記錄新的指針鏈,而且被寫出的塊不是連續(xù)排列的。對性能影響非常明顯的。
絕大多數(shù)的廠商使用的還是CoFW,但是一些本來就使用LUN隨機分塊分布模式的存儲系統(tǒng)比如XIV,NetApp等,都使用RoFW,因為原本其LUN的元數(shù)據(jù)鏈就很復雜,而且原來就是隨機分布的,RoFW的后遺癥對它們反而是正常的。
快照的意義
快照所保存下來的卷數(shù)據(jù),相當于一次意外掉電之后卷上的數(shù)據(jù)。怎么理解?
上層應用和文件系統(tǒng)都有緩存,文件系統(tǒng)緩存的是文件系統(tǒng)的元數(shù)據(jù)和文件的實體數(shù)據(jù)。每隔一段時間(Linux一般是30s)批量Flush到磁盤上。而且不是只做一次IO,有可能會對磁盤做多次IO。如果快照生成的時間恰恰在這連續(xù)的IO之間,那么此時卷上的數(shù)據(jù)實際上有可能不一致。
文件系統(tǒng)的機制是先寫入數(shù)據(jù)到磁盤,元數(shù)據(jù)保存在緩存里面,***再寫元數(shù)據(jù)。因為如果先寫元數(shù)據(jù),突然斷電了,那么元數(shù)據(jù)對應的僵尸扇區(qū)的數(shù)據(jù)會被認為是文件的,顯然后果不堪設想。
總之,快照極可能生成不一致的數(shù)據(jù)。
那么為什么還要用快照呢?
- 因為快照可以任意生成,而且占用的空間又不大,更重要的是可以在線恢復,不用停機只需要在內存中做IO重定向,那么上層訪問就變成以前時間點的數(shù)據(jù)了。
但是快照會存在不一致的問題,如何解決?
既然快照無異于一次磁盤掉電,那么利用快照恢復數(shù)據(jù)之后,文件系統(tǒng)可以進行一致性檢查,數(shù)據(jù)庫也會利用日志來使數(shù)據(jù)文件處于一致。
另外,現(xiàn)在主流的快照解決方案是在主機上安裝一個代理,執(zhí)行快照前,先通知文件系統(tǒng)將緩存中的數(shù)據(jù)全部Flush到磁盤,然后立即生成快照。
- 快照還可以預防數(shù)據(jù)邏輯損壞,也就是比如T1時刻,做了快照,T2時刻,因為管理員操作不當,誤刪了一個文件,T3的時候,進行了全備份操作。此時,這個文件看似***丟失了,其實,此時還可以通過快照恢復這個文件。
- 快照還可以降低一致性備份的窗口。如果沒有快照,要對某個卷進行一致性備份,需要暫停寫IO,所以備份窗口比較長,需要等待備份停止以后才能繼續(xù)寫IO。使用快照的話,只需要復制元數(shù)據(jù),然后在后臺進行備份,降低了影響。
- 備份完畢以后,如何能檢測數(shù)據(jù)是否是真一致的?若沒有快照,需要將備份數(shù)據(jù)恢復到獨立的物理空間里面,掛載到另一臺機器上。有了快照,可以將快照直接掛載到另一臺主機,避免了數(shù)據(jù)物理恢復導入的過程。
- 卷Clone
快照類似于某時刻的影子,而克隆則是某時刻的實體。每時刻生成了一份可寫的快照,就叫對卷某時刻的一份Clone。然后這份Clone內容每被修改的部分是與源卷共享的,所以源卷沒了,則Clone就沒了,所以叫虛擬Clone
如果把數(shù)據(jù)復制出來,生成一個獨立的卷,則就叫Split Clone,也就是可以得到實Clone。
卷Clone***的好處在于可以瞬間生成針對某個卷可寫的鏡像,而不管卷的數(shù)據(jù)量有多大。
數(shù)據(jù)備份系統(tǒng)的基本要件
- 備份對象:需要進行備份的備份源。
- 備份目的:磁盤、磁帶等介質
- 備份通路:網絡
- 備份執(zhí)行引擎:備份軟件
- 備份策略
下面重點介紹一下備份目的、備份通路、備份引擎
備份目的
備份到本地磁盤
備份目的地是在本地的磁盤,則只需要將數(shù)據(jù)備份到本地磁盤的另外分區(qū)中或者目錄中。
這樣不需要網絡,缺點是對備份對象自己的性能影響大。還會對其他的IO密集型程序造成影響。
這種方式一般用于不關鍵的應用和非IO密集型應用。比如E-mail,對轉發(fā)實時性要求不高。
備份到SAN上的磁盤
備份到SAN上的磁盤,就是將需要備份的數(shù)據(jù),從本次磁盤讀入內存,再寫入HBA卡緩沖區(qū),然后再通過線纜傳送到磁盤陣列上。
- 優(yōu)點:只耗費SAN公用網絡帶寬,對主體影響小。
- 缺點:對公共網絡資源和出口帶寬有影響。
備份到NAS目錄
備份到NAS目錄就是將數(shù)據(jù)備份到遠程共享目錄中。比如window中常用的文件夾共享。因為數(shù)據(jù)一般是通過以太網進行傳遞的,占用了前端的網絡帶寬,但是相對廉價,不需要部署SAN
備份到磁帶庫
現(xiàn)在出現(xiàn)一種虛擬磁帶庫,即用磁盤來模擬磁帶,對主機來說看到的是一臺磁帶庫,實際上是一臺磁盤陣列,主機照樣使用磁帶庫一樣來使用虛擬磁帶庫。要做到這點,就必須在磁盤陣列的控制器上做虛擬化操作,也就是實現(xiàn)協(xié)議轉換器的作用。
可以帶來了的好處是:
- 速度提升
- 避免機械手這種復雜的機械裝置
- 管理方便。
信息生命周期管理
將使用不頻繁的數(shù)據(jù)移動到低速、低成本的設備上。比如只給視頻應用分配20GB的空間,但是報告有500GB的空間,剩下的空間是在在磁帶庫上。
分級存儲
- 一線磁盤陣列
- 二線虛擬磁帶庫:近期不會被頻繁調度。利用大容量SATA盤,性能適中的控制器。
- 帶庫或者光盤庫。幾年甚至幾十年都不訪問到。
備份通路
本地備份
數(shù)據(jù)流向:本地磁盤——總線——磁盤控制器——總線——內存——總線——磁盤控制器——總線——本地磁盤
也即數(shù)據(jù)從本地磁盤出發(fā),經過本地的總線 和內存,經過CPU少量控制邏輯代碼之后,流回本地磁盤。
通過前端網絡備份
經過前端網絡備份的數(shù)據(jù)流向是:
本地磁盤——總線——磁盤控制器——總線——內存——總線——以太網卡——網線——以太網——網線——目標計算機的網卡——總線——內存——總線——目標計算機的磁盤。
數(shù)據(jù)從本地磁盤出發(fā),流經本地總線和內存,然后流到本地網卡,通過網絡傳送到目標計算機磁盤。
- 前端網絡:服務器接受客戶端連接的網絡,也就是服務網絡,是服務器和客戶端連接的必經之路。
- 后端網絡:對客戶封閉,客戶的連接不用經過這個網絡,用與服務器和存儲、應用服務器、數(shù)據(jù)庫服務器的連接??梢允荢AN,以太網
通過后端網絡備份
通過后端網絡備份的數(shù)據(jù)流向是:
本地磁盤——總線——控制器——總線——內存——總線——后端HBA卡——線纜——后端交換設備——線纜——備份目的的后端網卡——總線——內存——磁盤
LAN Free備份
備份的時候不經過LAN,也就是不流經前端網絡,也叫Frontend Free。這樣的好處是不耗費前端網絡的帶寬,對客戶終端接受服務器的數(shù)據(jù)不影響。。
因為前端網絡一般是是慢速網絡 ,資源非常珍貴。無論是本地、還是網絡,都需要待備份的服務器付出代價,即需要讀取備份源數(shù)據(jù)到自身的內存,然后從內存寫入備份的目的地。對主機CPU、內存都有浪費。
能否不消耗服務器的性能呢?可以,使用Server Free備份。
Server Free備份
Server Free備份:備份的時候,數(shù)據(jù)不用流經服務器的總線和內存,消耗極少,甚至不消耗主機資源。
備份源和備份目標都不會在服務器上,因為如果在服務器上,數(shù)據(jù)從磁盤讀出,要流將總線,然后到內存,這就不是Server Free
那怎么做呢?
- 用SCSI的擴展復制命令,將這些命令發(fā)送給支持Server Free的存儲設備,然后這些設備會提取自身的數(shù)據(jù)寫入備份目的設備,而不是發(fā)送給主機。
- 使用另一臺專門做數(shù)據(jù)移動的新服務器,來代替原來服務器移動備份數(shù)據(jù)。釋放運算壓力很大的生產服務器。
備份策略
備份引擎:決定整個數(shù)據(jù)備份系統(tǒng)應該怎么運作,備份那些內容,什么時候開始備份,備份時間有沒有限制等的策略。
備份服務器
備份引擎以什么形式體現(xiàn)呢?當然是運行在主機上的程序,所以需要一臺計算機來做引擎的執(zhí)行者。
那么備份服務器的備份策略和規(guī)則,怎么傳給整個數(shù)據(jù)備份系統(tǒng)中的服務器?通過以太網,因為以太網擴展性好,適合節(jié)點間通信。相對于以太網,SAN更適合傳送大量的數(shù)據(jù)。所以常用前端網絡來連接待備份的服務器和備份服務器,因為備份策略的數(shù)據(jù)包不多。
備份服務器如何與每個待備份的服務器建立通話?怎么通話?規(guī)則怎么定?需要待備份服務器上運行一個代理程序,專門解釋備份服務器發(fā)來的命令,根據(jù)命令作出動作。
這個運行在待備份服務器上的程序,就叫備份代理,監(jiān)聽端口,接收備份服務器發(fā)來的命令。
介質服務器
若數(shù)據(jù)備份系統(tǒng)中有一臺SCSI磁帶機,且多臺主機想備份到這臺磁帶機上。而SCSI磁帶機只能同時接到一臺主機上。
那么怎么辦呢?可以引入一臺專門的計算機,只能由這臺計算機來操作磁帶機。
需要備份的計算機通過以太網將數(shù)據(jù)發(fā)給這臺掌管磁帶機的計算機,然后寫給磁帶機。
這樣磁帶機成為了公用設備,而在整個系統(tǒng)中,只有一臺計算機能掌管備份目標,它就類似于一個代理,代理其他服務器執(zhí)行備份。我們把它稱為介質服務器
還有一個問題,如果有多臺服務器向介質服務器發(fā)出請求,怎么辦?當然需要一個協(xié)調員,也就是備份服務器,它可以指揮安裝在待備份服務器的代理,讓每臺服務器按照順序有條理的使用介質服務器提供的備份介質進行備份。
三種備份方式
完全備份
不管文件多大,只要要備份,都需要將文件都備份下來。
差量備份
差量備份:只備份從上次完全備份以來發(fā)生變化的數(shù)據(jù)。
差量備份要求必須做一次完全備份,作為差量的基準點
增量備份
只備份從上次備份以來這份文件中變化過的數(shù)據(jù)。** 上次備份**,不管是全備、差備,還是增量備份。
對于數(shù)據(jù)庫的備份,備份軟件想知道每個數(shù)據(jù)文件的變化是不可能的,因為數(shù)據(jù)庫文件內部格式非常復雜,只有自己才能分析和檢測出來。所以數(shù)據(jù)庫管理軟件有自己的備份工具。第三方備份軟件只能調用數(shù)據(jù)庫軟件自身提供的命令。