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