Linux 網(wǎng)絡文件系統(tǒng)的數(shù)據(jù)備份及恢復機制實現(xiàn)
為了保證引入多版本特性后文件系統(tǒng)仍具有較好的性能,以及保證較高的空間利用率,我們開發(fā)了一種高效的惰性版本生成算法。主要思想是:生成版本時不進行文件的復制,僅復制目錄結構,在新版本生成后到下一版本生成前,如果有文件需要修改,則第一次修改時對該文件進行復制,從而保證該文件狀態(tài)與對應的版本保持一致。
在一般情況下,目錄結構的數(shù)據(jù)量遠遠小于文件的數(shù)據(jù)量,因而這種方法可以大大降低版本生成時需要復制的數(shù)據(jù)量,因而具有較高的性能。同時,這種把單個文件版本生成的實際操作推后到非做不可的時候,并且任意文件在兩次版本之間最多生成一次版本,因此這種惰性策略可以使需要實際生成版本的文件數(shù)量達到最少,同時還可以把多個文件版本生成操作分散到具體的文件操作中,從而避免了集中的一次性版本生成方法可能造成的服務暫時停頓的問題。
版本生成后的結構如圖 2 所示。
圖 2 多版本生成示意圖
具體算法包括兩個部分,即版本生成算法和文件第一次修改處理算法,版本生成算法主要完成版本生成工作,主要過程如下:
找到需要形成版本的最高層目錄作為原目錄;
利用文件系統(tǒng)提供的函數(shù),生成新的目錄節(jié)點,稱為新目錄;
把原目錄中的結構復制到新目錄;
在原目錄中找到所有的子目錄,重復 2、3 步;
把新的子目錄對應的 inode 號替換上一層目錄中的老 inode 號;
重復上述過程,及到目錄樹中的所有目錄得到復制為止。
在上述策略中,新版本并沒有復制所有的文件,只是在復制的目錄結構中記錄下了該文件的 inode 號(即復制了目錄的結構,而不是把文件都進行復制,從而節(jié)省了存儲和計算資源),因此,當有 NFS 請求需要對文件進行版本生成后的第一次修改時,需要復制該文件,生成新的版本。該實現(xiàn)過程參見如下流程圖:
圖 3 寫時復制算法示意圖
這種文件復制策略其實是一種惰性算法,也即我們常說的寫時復制的方法,這個方法在 Linux 操作系統(tǒng)的子進程對父進程資源的繼承中有所體現(xiàn)。這個策略一方面可以最大限度減少復制文件的數(shù)量,另一方面則可以避免瞬間過大的文件復制工作量,影響文件服務的性能。該算法的過程如下:當文件操作為寫操作時,判斷該文件是否版本生成后的第一次寫操作;若是則利用文件系統(tǒng)提供的底層函數(shù)生成一個新的文件,復制源文件的數(shù)據(jù)到新生成的文件,同時把該文件當前版本的 inode 節(jié)點中的版本號置為當前版本號,這樣新文件就成為該文件的最新版本。
雖然我們采用的算法可以有較好的性能,存儲開銷也是最優(yōu),但是,每次版本生成肯定會造成服務性能的下降和空間的占用,而這些代價在一個比較安全可靠的環(huán)境中是可以適當降低的,即當系統(tǒng)比較安全的時候,可以選擇讓系統(tǒng)以更低的頻率進行版本生成,相反,當系統(tǒng)安全狀況比較糟糕的時候,可以通過提高版本生成頻率適當降低服務性能來獲得更高的數(shù)據(jù)安全性能,當系統(tǒng)處于緊急狀態(tài)時,甚至可以要求立即進行版本生成。
基于這些考慮,我們采用了自適應的備份策略,災情評估系統(tǒng)可以動態(tài)評估系統(tǒng)的災情程度,然后可以立即修改版本生成策略,以適應當時的安全要求。
NFS 數(shù)據(jù)恢復技術
企業(yè)應用 NFS 的一個重要目標就是要保證系統(tǒng)的高可用性,即使在出現(xiàn)嚴重災難、故障、攻擊等情況下能具有較好的生存能力。因此,當一個系統(tǒng)出現(xiàn)故障時,如何快速地恢復系統(tǒng),迅速投入到服務備份中去是相當重要的,所以,對于文件系統(tǒng)數(shù)據(jù)的恢復而言,也需要專門的考慮和設計。
本方案被配置成多個站點互為備份的情況,即平時只有一個主站點在服務,其他站點處于同步備份狀態(tài),當某個站點出現(xiàn)故障或災難時,或者是被非法入侵者攻破時,系統(tǒng)可以立即分配新的主站點把被破壞的站點替換下來,進入恢復狀態(tài),其他正常的站點仍可提供正常的服務。
當然,也存在所有站點均出現(xiàn)故障的情況,但是由于我們采用了多種措施,如動態(tài)隨機遷移、災情評估與響應策略等,再配合傳統(tǒng)的防火墻、IDS 等安全系統(tǒng),可以極大限度地減少這種幾率。因此,我們的數(shù)據(jù)恢復問題主要考慮上述這種情形,即個別服務器出現(xiàn)故障退出服務而其他系統(tǒng)依然正常的情況。
首先,我們來分析一下系統(tǒng)退出后數(shù)據(jù)的情形,主要涉及到退出的服務器和正常的主服務器與備份服務器,如圖 4 所示:
圖 4 一個系統(tǒng)退出后數(shù)據(jù)狀態(tài)示意圖
在上圖中,退出服務器最后生成的版本號為 i,系統(tǒng)退出后,一方面主文件服務器會察覺到同步數(shù)據(jù)無法從退出服務器返回結果,這樣的話它就會重發(fā)同步請求,經(jīng)過 3 次重發(fā)后,如果依然沒有返回信息,則認為該服務器退出服務,因此會把同步數(shù)據(jù)備份到磁盤文件中,并記錄下該服務器在同步數(shù)據(jù)文件中的起始位置,這當由多個文件服務器退出時可以分別識別出來。由于退出系統(tǒng)無法繼續(xù)保持同步,因此其狀態(tài)會與工作的文件服務器不一致,具體表現(xiàn)在以下幾個方面:
當退出時間很短時,數(shù)據(jù)不一致僅存在于緩沖區(qū)中,這時如果退出服務器能立即重新投入使用,則不需要進行額外的數(shù)據(jù)恢復,數(shù)據(jù)同步可以通過主服務器同步請求的重試來達到。
當主服務器確認退出服務器退出后,會把未同步的數(shù)據(jù)寫入特定的同步數(shù)據(jù)文件中,這時的不一致性包括了緩沖區(qū)中的數(shù)據(jù)和同步數(shù)據(jù)文件中的數(shù)據(jù),這時的數(shù)據(jù)恢復需要做兩方面的工作:
把同步數(shù)據(jù)文件中的正確數(shù)據(jù)一次性發(fā)送給退出服務器,退出服務器把它寫入本地的同步數(shù)據(jù)文件;
建立本地的緩沖區(qū),建立起同步機制,接收同步數(shù)據(jù),同時啟動數(shù)據(jù)同步進程,先同步數(shù)據(jù)文件中的數(shù)據(jù),當緩沖區(qū)數(shù)據(jù)因沒有處理而達到一定程度時,會自動把部分數(shù)據(jù)追加到同步數(shù)據(jù)文件的后面,這時,退出服務器已經(jīng)恢復了正常工作,實際上也不需要過多的數(shù)據(jù)恢復工作。
評論