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