Linux 網(wǎng)絡(luò )文件系統的數據備份及恢復機制實(shí)現
把原目錄中的結構復制到新目錄;
在原目錄中找到所有的子目錄,重復 2、3 步;
把新的子目錄對應的 inode 號替換上一層目錄中的老 inode 號;
重復上述過(guò)程,及到目錄樹(shù)中的所有目錄得到復制為止。
在上述策略中,新版本并沒(méi)有復制所有的文件,只是在復制的目錄結構中記錄下了該文件的 inode 號(即復制了目錄的結構,而不是把文件都進(jìn)行復制,從而節省了存儲和計算資源),因此,當有 NFS 請求需要對文件進(jìn)行版本生成后的第一次修改時(shí),需要復制該文件,生成新的版本。該實(shí)現過(guò)程參見(jiàn)如下流程圖:
圖 3 寫(xiě)時(shí)復制算法示意圖

這種文件復制策略其實(shí)是一種惰性算法,也即我們常說(shuō)的寫(xiě)時(shí)復制的方法,這個(gè)方法在 Linux 操作系統的子進(jìn)程對父進(jìn)程資源的繼承中有所體現。這個(gè)策略一方面可以最大限度減少復制文件的數量,另一方面則可以避免瞬間過(guò)大的文件復制工作量,影響文件服務(wù)的性能。該算法的過(guò)程如下:當文件操作為寫(xiě)操作時(shí),判斷該文件是否版本生成后的第一次寫(xiě)操作;若是則利用文件系統提供的底層函數生成一個(gè)新的文件,復制源文件的數據到新生成的文件,同時(shí)把該文件當前版本的 inode 節點(diǎn)中的版本號置為當前版本號,這樣新文件就成為該文件的最新版本。
雖然我們采用的算法可以有較好的性能,存儲開(kāi)銷(xiāo)也是最優(yōu),但是,每次版本生成肯定會(huì )造成服務(wù)性能的下降和空間的占用,而這些代價(jià)在一個(gè)比較安全可靠的環(huán)境中是可以適當降低的,即當系統比較安全的時(shí)候,可以選擇讓系統以更低的頻率進(jìn)行版本生成,相反,當系統安全狀況比較糟糕的時(shí)候,可以通過(guò)提高版本生成頻率適當降低服務(wù)性能來(lái)獲得更高的數據安全性能,當系統處于緊急狀態(tài)時(shí),甚至可以要求立即進(jìn)行版本生成。
基于這些考慮,我們采用了自適應的備份策略,災情評估系統可以動(dòng)態(tài)評估系統的災情程度,然后可以立即修改版本生成策略,以適應當時(shí)的安全要求。
NFS 數據恢復技術(shù)
企業(yè)應用 NFS 的一個(gè)重要目標就是要保證系統的高可用性,即使在出現嚴重災難、故障、攻擊等情況下能具有較好的生存能力。因此,當一個(gè)系統出現故障時(shí),如何快速地恢復系統,迅速投入到服務(wù)備份中去是相當重要的,所以,對于文件系統數據的恢復而言,也需要專(zhuān)門(mén)的考慮和設計。
本方案被配置成多個(gè)站點(diǎn)互為備份的情況,即平時(shí)只有一個(gè)主站點(diǎn)在服務(wù),其他站點(diǎn)處于同步備份狀態(tài),當某個(gè)站點(diǎn)出現故障或災難時(shí),或者是被非法入侵者攻破時(shí),系統可以立即分配新的主站點(diǎn)把被破壞的站點(diǎn)替換下來(lái),進(jìn)入恢復狀態(tài),其他正常的站點(diǎn)仍可提供正常的服務(wù)。
當然,也存在所有站點(diǎn)均出現故障的情況,但是由于我們采用了多種措施,如動(dòng)態(tài)隨機遷移、災情評估與響應策略等,再配合傳統的防火墻、IDS 等安全系統,可以極大限度地減少這種幾率。因此,我們的數據恢復問(wèn)題主要考慮上述這種情形,即個(gè)別服務(wù)器出現故障退出服務(wù)而其他系統依然正常的情況。
首先,我們來(lái)分析一下系統退出后數據的情形,主要涉及到退出的服務(wù)器和正常的主服務(wù)器與備份服務(wù)器,如圖 4 所示:
圖 4 一個(gè)系統退出后數據狀態(tài)示意圖

在上圖中,退出服務(wù)器最后生成的版本號為 i,系統退出后,一方面主文件服務(wù)器會(huì )察覺(jué)到同步數據無(wú)法從退出服務(wù)器返回結果,這樣的話(huà)它就會(huì )重發(fā)同步請求,經(jīng)過(guò) 3 次重發(fā)后,如果依然沒(méi)有返回信息,則認為該服務(wù)器退出服務(wù),因此會(huì )把同步數據備份到磁盤(pán)文件中,并記錄下該服務(wù)器在同步數據文件中的起始位置,這當由多個(gè)文件服務(wù)器退出時(shí)可以分別識別出來(lái)。由于退出系統無(wú)法繼續保持同步,因此其狀態(tài)會(huì )與工作的文件服務(wù)器不一致,具體表現在以下幾個(gè)方面:
當退出時(shí)間很短時(shí),數據不一致僅存在于緩沖區中,這時(shí)如果退出服務(wù)器能立即重新投入使用,則不需要進(jìn)行額外的數據恢復,數據同步可以通過(guò)主服務(wù)器同步請求的重試來(lái)達到。
當主服務(wù)器確認退出服務(wù)器退出后,會(huì )把未同步的數據寫(xiě)入特定的同步數據文件中,這時(shí)的不一致性包括了緩沖區中的數據和同步數據文件中的數據,這時(shí)的數據恢復需要做兩方面的工作:
把同步數據文件中的正確數據一次性發(fā)送給退出服務(wù)器,退出服務(wù)器把它寫(xiě)入本地的同步數據文件;
建立本地的緩沖區,建立起同步機制,接收同步數據,同時(shí)啟動(dòng)數據同步進(jìn)程,先同步數據文件中的數據,當緩沖區數據因沒(méi)有處理而達到一定程度時(shí),會(huì )自動(dòng)把部分數據追加到同步數據文件的后面,這時(shí),退出服務(wù)器已經(jīng)恢復了正常工作,實(shí)際上也不需要過(guò)多的數據恢復工作。
由于主文件服務(wù)器一般需要處理文件的讀寫(xiě)請求,寫(xiě)請求僅占一部分,需要同步而執行的操作造成的負載要小于主服務(wù)器,因此可能在較短的時(shí)間內完成同步。當需要退出服務(wù)器(此時(shí)已經(jīng)進(jìn)入同步階段)成為主服務(wù)器時(shí),則必須等所有同步數據同步完成后才能開(kāi)始服務(wù)。
如果退出服務(wù)器是因為較嚴重的故障或災難而退出的,則可能需要較長(cháng)時(shí)間的處理,如更換硬件、系統重啟、甚至重裝系統等,這時(shí)就可能出現一些困難的情況,一種是如上圖所示的,工作正常的系統已經(jīng)生成了新的版本,如服務(wù)器退出時(shí)的最新版本是 i,經(jīng)過(guò)一段時(shí)間后,正常系統生成了新的版本,這時(shí)主系統會(huì )清空同步數據文件,重新從版本生成后進(jìn)行記錄。對于這種情況,可以有兩種處理辦法:
基于本地版本的快速恢復:當退出文件服務(wù)器本地至少存在一個(gè)版本與其他正常機器上的版本相同時(shí),可以采用這種恢復策略。具體而言,先確定一個(gè)最新的正確版本,用本地版本恢復,這一過(guò)程非常簡(jiǎn)單快捷,僅涉及到兩次 inode 的修改;然后選擇一臺正常服務(wù)器,請求它生成一個(gè)正常系統上最新版本與恢復版本的增量升級數據,這樣的數據量不會(huì )很大,而且不需要象基于操作的同步那樣逐步進(jìn)行,同步效率非常高,因此可以大大提高恢復速度。同步到正常系統的最新版本后,然后就按照上述第 2 條的情況進(jìn)行同步數據文件的同步。
評論