www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀] Linux 網(wǎng)絡(luò)文件系統(tǒng)簡介網(wǎng)絡(luò)文件系統(tǒng)(NFS)協(xié)議是由 Sun MicroSystem 公司在 20 世紀(jì) 80 年代為了提供對共享文件的遠(yuǎn)程訪問而設(shè)計(jì)和實(shí)現(xiàn)的,它采用了經(jīng)典的客戶機(jī)/服務(wù)器模

 Linux 網(wǎng)絡(luò)文件系統(tǒng)簡介

網(wǎng)絡(luò)文件系統(tǒng)(NFS)協(xié)議是由 Sun MicroSystem 公司在 20 世紀(jì) 80 年代為了提供對共享文件的遠(yuǎn)程訪問而設(shè)計(jì)和實(shí)現(xiàn)的,它采用了經(jīng)典的客戶機(jī)/服務(wù)器模式提供服務(wù)。為了達(dá)到如同 NFS 協(xié)議通過使用 Sun 公司開發(fā)的遠(yuǎn)在本機(jī)上使用本地文件系統(tǒng)一樣便捷的效果,NFS 通過使用遠(yuǎn)程過程調(diào)用協(xié)議(RPC Protocol)來實(shí)現(xiàn)運(yùn)行在一臺計(jì)算機(jī)上的程序來調(diào)用在另一臺遠(yuǎn)程機(jī)器上運(yùn)行的子程序。同時(shí),為了解決不同平臺上的數(shù)據(jù)交互問題,它提供了外部數(shù)據(jù)表示(XDR)來解決這個(gè)問題。為了靈活地提供文件共享服務(wù),該協(xié)議可以在 TCP 協(xié)議或者是 UDP 協(xié)議上運(yùn)行,典型的情況是在 UDP 協(xié)議上運(yùn)行。在此基礎(chǔ)上,NFS 在數(shù)據(jù)的傳送過程中需要 RPC 命令得到確認(rèn),而且在需要的時(shí)候會要重傳,這樣既可以通過 UDP 協(xié)議獲得較高的通信效率,也能通過 RPC 來獲得較高的通信可靠性。

由于 NFS 基于 C/S 模式提供服務(wù),所以它的核心組件主要包括客戶機(jī)和服務(wù)器兩部分。圖 1 詳細(xì)說明了 NFS 的主要組件以及主要的配置文件。在服務(wù)器端,portmap、mountd、nfsd 三個(gè)監(jiān)控程序?qū)⒃诤笈_運(yùn)行。portmap 監(jiān)控程序用來注冊基于 RPC 的服務(wù)。當(dāng)一個(gè) RPC 的監(jiān)控程序啟動的時(shí)候,它告訴 portmap 監(jiān)控程序它在哪一個(gè)端口進(jìn)行偵聽,并且它在進(jìn)行什么樣的 RPC 服務(wù)。當(dāng)一個(gè)客戶機(jī)向服務(wù)器提出一個(gè) RPC 請求,那么它就會和 portmap 監(jiān)控程序取得聯(lián)系以確定 RPC 消息應(yīng)該發(fā)往的端口號。而 Mountd 監(jiān)控程序的功能是來讀取服務(wù)器端的/etc/exportfs 文件并且創(chuàng)建一個(gè)將服務(wù)器的本地文件系統(tǒng)導(dǎo)出的主機(jī)和網(wǎng)絡(luò)列表,因而客戶機(jī)的掛接(mount)請求都被定位到 mountd 監(jiān)控程序(daemon)。當(dāng)驗(yàn)證了服務(wù)器確實(shí)具有掛接所請求的文件系統(tǒng)的權(quán)限以后,mountd 為請求的掛接點(diǎn)返回一個(gè)文件句柄。而 nfsd 監(jiān)控程序則被服務(wù)器用來處理客戶機(jī)端發(fā)送過來的請求。由于服務(wù)器需要同時(shí)處理多個(gè)客戶機(jī)的請求,所以在缺省情況下,操作系統(tǒng)將會自動啟動八個(gè) nfsd 線程。當(dāng)然,如果 NFS 服務(wù)器特別忙的時(shí)候,系統(tǒng)有可能根據(jù)實(shí)際情況啟動更多的線程。

圖 1 網(wǎng)絡(luò)文件系統(tǒng)簡圖

NFS 的客戶機(jī)與服務(wù)器之間通過 RPC 進(jìn)行通信,通信過程如下所示:

用戶將 NFS 服務(wù)器的共享目錄掛載到本地文件系統(tǒng)中。

客戶訪問 NFS 目錄中的文件時(shí),NFS 客戶端向 NFS 服務(wù)器端發(fā)送 RPC 請求。

NFS 服務(wù)端接收客戶端發(fā)來的 RPC 請求,并將這個(gè)請求傳遞給本地文件訪問程序,然后訪問服務(wù)器主機(jī)上的一個(gè)本地的磁盤文件。NFS 服務(wù)器可以同時(shí)接收多個(gè) NFS 客戶端的請求,并對其進(jìn)行并發(fā)控制。

NFS 客戶端向服務(wù)器主機(jī)發(fā)出一個(gè) RPC 調(diào)用,然后等待服務(wù)器的應(yīng)答。NFS 客戶端收到服務(wù)器的應(yīng)答后,把結(jié)果信息展現(xiàn)給用戶或應(yīng)用程序。

NFS 下的數(shù)據(jù)備份、恢復(fù)的主要功能

對數(shù)據(jù)進(jìn)行備份與恢復(fù)是保證數(shù)據(jù)安全和業(yè)務(wù)連續(xù)性的非常成熟的做法。在 Linux 下的本地文件系統(tǒng)(例如 Ext2、Ext3 等)中,數(shù)據(jù)備份和恢復(fù)一般采用常規(guī)的辦法來進(jìn)行操作,例如使用 Tar、Archive 等。而對于 NFS 來說,其數(shù)據(jù)備份需要采用量身定制的方法來進(jìn)行。

為了保證數(shù)據(jù)在災(zāi)難環(huán)境中的可用性和業(yè)務(wù)連續(xù)性,針對它的數(shù)據(jù)備份、恢復(fù)方案應(yīng)具備如下重要功能:

通過對系統(tǒng)重要數(shù)據(jù)的快速備份,切實(shí)保證系統(tǒng)數(shù)據(jù)的安全;

可以根據(jù)指令完成備份系統(tǒng)的實(shí)時(shí)切入,保證服務(wù)不被中斷,保持系統(tǒng)持續(xù)運(yùn)行的能力;

通過實(shí)時(shí)記錄所有文件的操作日志,系統(tǒng)管理員能夠在發(fā)生災(zāi)難的情況下對日志進(jìn)行分析和取證,從而發(fā)現(xiàn)入侵者的蛛絲馬跡。

NFS 多版本備份技術(shù)

為了保證服務(wù)器出現(xiàn)故障后能迅速恢復(fù),要求系統(tǒng)數(shù)據(jù)能快速恢復(fù)到一個(gè)最近的正確狀態(tài),所有這些都需要多版本技術(shù)的支持,通過同步記錄文件的在某些時(shí)刻的狀態(tài),在整個(gè)系統(tǒng)范圍內(nèi)建立起類似于數(shù)據(jù)庫系統(tǒng)的”檢查點(diǎn)”,以保證上述目標(biāo)的實(shí)現(xiàn)。

對于多版本系統(tǒng)而言,需要較好地解決兩個(gè)方面的問題:性能和空間利用率。對于前者,最主要的是保證在生成版本的時(shí)候能夠快速完成,同時(shí)恢復(fù)時(shí)也具有較好的性能。此外,系統(tǒng)引入多版本造成的整體開銷也應(yīng)該比較理想。對于第二點(diǎn),主要考慮是節(jié)約磁盤空間,雖然隨著硬件技術(shù)的不斷發(fā)展,磁盤空間越來越大,性價(jià)比也越來越高,但是當(dāng)版本較多而且文件數(shù)量較多、較大時(shí),引入多版本增加的開銷也可能相當(dāng)可觀,同時(shí),較大的空間也意味著版本生成時(shí)可能需要更多的寫操作,這樣也必將影響總體性能。

為了保證引入多版本特性后文件系統(tǒng)仍具有較好的性能,以及保證較高的空間利用率,我們開發(fā)了一種高效的惰性版本生成算法。主要思想是:生成版本時(shí)不進(jìn)行文件的復(fù)制,僅復(fù)制目錄結(jié)構(gòu),在新版本生成后到下一版本生成前,如果有文件需要修改,則第一次修改時(shí)對該文件進(jìn)行復(fù)制,從而保證該文件狀態(tài)與對應(yīng)的版本保持一致。

在一般情況下,目錄結(jié)構(gòu)的數(shù)據(jù)量遠(yuǎn)遠(yuǎn)小于文件的數(shù)據(jù)量,因而這種方法可以大大降低版本生成時(shí)需要復(fù)制的數(shù)據(jù)量,因而具有較高的性能。同時(shí),這種把單個(gè)文件版本生成的實(shí)際操作推后到非做不可的時(shí)候,并且任意文件在兩次版本之間最多生成一次版本,因此這種惰性策略可以使需要實(shí)際生成版本的文件數(shù)量達(dá)到最少,同時(shí)還可以把多個(gè)文件版本生成操作分散到具體的文件操作中,從而避免了集中的一次性版本生成方法可能造成的服務(wù)暫時(shí)停頓的問題。

版本生成后的結(jié)構(gòu)如圖 2 所示。

圖 2 多版本生成示意圖

具體算法包括兩個(gè)部分,即版本生成算法和文件第一次修改處理算法,版本生成算法主要完成版本生成工作,主要過程如下:

找到需要形成版本的最高層目錄作為原目錄;

利用文件系統(tǒng)提供的函數(shù),生成新的目錄節(jié)點(diǎn),稱為新目錄;[!--empirenews.page--]

把原目錄中的結(jié)構(gòu)復(fù)制到新目錄;

在原目錄中找到所有的子目錄,重復(fù) 2、3 步;

把新的子目錄對應(yīng)的 inode 號替換上一層目錄中的老 inode 號;

重復(fù)上述過程,及到目錄樹中的所有目錄得到復(fù)制為止。

在上述策略中,新版本并沒有復(fù)制所有的文件,只是在復(fù)制的目錄結(jié)構(gòu)中記錄下了該文件的 inode 號(即復(fù)制了目錄的結(jié)構(gòu),而不是把文件都進(jìn)行復(fù)制,從而節(jié)省了存儲和計(jì)算資源),因此,當(dāng)有 NFS 請求需要對文件進(jìn)行版本生成后的第一次修改時(shí),需要復(fù)制該文件,生成新的版本。該實(shí)現(xiàn)過程參見如下流程圖:

圖 3 寫時(shí)復(fù)制算法示意圖

這種文件復(fù)制策略其實(shí)是一種惰性算法,也即我們常說的寫時(shí)復(fù)制的方法,這個(gè)方法在 Linux 操作系統(tǒng)的子進(jìn)程對父進(jìn)程資源的繼承中有所體現(xiàn)。這個(gè)策略一方面可以最大限度減少復(fù)制文件的數(shù)量,另一方面則可以避免瞬間過大的文件復(fù)制工作量,影響文件服務(wù)的性能。該算法的過程如下:當(dāng)文件操作為寫操作時(shí),判斷該文件是否版本生成后的第一次寫操作;若是則利用文件系統(tǒng)提供的底層函數(shù)生成一個(gè)新的文件,復(fù)制源文件的數(shù)據(jù)到新生成的文件,同時(shí)把該文件當(dāng)前版本的 inode 節(jié)點(diǎn)中的版本號置為當(dāng)前版本號,這樣新文件就成為該文件的最新版本。

雖然我們采用的算法可以有較好的性能,存儲開銷也是最優(yōu),但是,每次版本生成肯定會造成服務(wù)性能的下降和空間的占用,而這些代價(jià)在一個(gè)比較安全可靠的環(huán)境中是可以適當(dāng)降低的,即當(dāng)系統(tǒng)比較安全的時(shí)候,可以選擇讓系統(tǒng)以更低的頻率進(jìn)行版本生成,相反,當(dāng)系統(tǒng)安全狀況比較糟糕的時(shí)候,可以通過提高版本生成頻率適當(dāng)降低服務(wù)性能來獲得更高的數(shù)據(jù)安全性能,當(dāng)系統(tǒng)處于緊急狀態(tài)時(shí),甚至可以要求立即進(jìn)行版本生成。

基于這些考慮,我們采用了自適應(yīng)的備份策略,災(zāi)情評估系統(tǒng)可以動態(tài)評估系統(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)重要的,所以,對于文件系統(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)替換下來,進(jìn)入恢復(fù)狀態(tài),其他正常的站點(diǎn)仍可提供正常的服務(wù)。

當(dāng)然,也存在所有站點(diǎn)均出現(xiàn)故障的情況,但是由于我們采用了多種措施,如動態(tài)隨機(jī)遷移、災(zāi)情評估與響應(yīng)策略等,再配合傳統(tǒng)的防火墻、IDS 等安全系統(tǒng),可以極大限度地減少這種幾率。因此,我們的數(shù)據(jù)恢復(fù)問題主要考慮上述這種情形,即個(gè)別服務(wù)器出現(xiàn)故障退出服務(wù)而其他系統(tǒng)依然正常的情況。

首先,我們來分析一下系統(tǒng)退出后數(shù)據(jù)的情形,主要涉及到退出的服務(wù)器和正常的主服務(wù)器與備份服務(wù)器,如圖 4 所示:

圖 4 一個(gè)系統(tǒng)退出后數(shù)據(jù)狀態(tài)示意圖

在上圖中,退出服務(wù)器最后生成的版本號為 i,系統(tǒng)退出后,一方面主文件服務(wù)器會察覺到同步數(shù)據(jù)無法從退出服務(wù)器返回結(jié)果,這樣的話它就會重發(fā)同步請求,經(jīng)過 3 次重發(fā)后,如果依然沒有返回信息,則認(rèn)為該服務(wù)器退出服務(wù),因此會把同步數(shù)據(jù)備份到磁盤文件中,并記錄下該服務(wù)器在同步數(shù)據(jù)文件中的起始位置,這當(dāng)由多個(gè)文件服務(wù)器退出時(shí)可以分別識別出來。由于退出系統(tǒng)無法繼續(xù)保持同步,因此其狀態(tài)會與工作的文件服務(wù)器不一致,具體表現(xiàn)在以下幾個(gè)方面:

當(dāng)退出時(shí)間很短時(shí),數(shù)據(jù)不一致僅存在于緩沖區(qū)中,這時(shí)如果退出服務(wù)器能立即重新投入使用,則不需要進(jìn)行額外的數(shù)據(jù)恢復(fù),數(shù)據(jù)同步可以通過主服務(wù)器同步請求的重試來達(dá)到。

當(dāng)主服務(wù)器確認(rèn)退出服務(wù)器退出后,會把未同步的數(shù)據(jù)寫入特定的同步數(shù)據(jù)文件中,這時(shí)的不一致性包括了緩沖區(qū)中的數(shù)據(jù)和同步數(shù)據(jù)文件中的數(shù)據(jù),這時(shí)的數(shù)據(jù)恢復(fù)需要做兩方面的工作:

把同步數(shù)據(jù)文件中的正確數(shù)據(jù)一次性發(fā)送給退出服務(wù)器,退出服務(wù)器把它寫入本地的同步數(shù)據(jù)文件;

建立本地的緩沖區(qū),建立起同步機(jī)制,接收同步數(shù)據(jù),同時(shí)啟動數(shù)據(jù)同步進(jìn)程,先同步數(shù)據(jù)文件中的數(shù)據(jù),當(dāng)緩沖區(qū)數(shù)據(jù)因沒有處理而達(dá)到一定程度時(shí),會自動把部分?jǐn)?shù)據(jù)追加到同步數(shù)據(jù)文件的后面,這時(shí),退出服務(wù)器已經(jīng)恢復(fù)了正常工作,實(shí)際上也不需要過多的數(shù)據(jù)恢復(fù)工作。

由于主文件服務(wù)器一般需要處理文件的讀寫請求,寫請求僅占一部分,需要同步而執(zhí)行的操作造成的負(fù)載要小于主服務(wù)器,因此可能在較短的時(shí)間內(nèi)完成同步。當(dāng)需要退出服務(wù)器(此時(shí)已經(jīng)進(jìn)入同步階段)成為主服務(wù)器時(shí),則必須等所有同步數(shù)據(jù)同步完成后才能開始服務(wù)。

如果退出服務(wù)器是因?yàn)檩^嚴(yán)重的故障或?yàn)?zāi)難而退出的,則可能需要較長時(shí)間的處理,如更換硬件、系統(tǒng)重啟、甚至重裝系統(tǒng)等,這時(shí)就可能出現(xiàn)一些困難的情況,一種是如上圖所示的,工作正常的系統(tǒng)已經(jīng)生成了新的版本,如服務(wù)器退出時(shí)的最新版本是 i,經(jīng)過一段時(shí)間后,正常系統(tǒng)生成了新的版本,這時(shí)主系統(tǒng)會清空同步數(shù)據(jù)文件,重新從版本生成后進(jìn)行記錄。對于這種情況,可以有兩種處理辦法:

基于本地版本的快速恢復(fù):當(dāng)退出文件服務(wù)器本地至少存在一個(gè)版本與其他正常機(jī)器上的版本相同時(shí),可以采用這種恢復(fù)策略。具體而言,先確定一個(gè)最新的正確版本,用本地版本恢復(fù),這一過程非常簡單快捷,僅涉及到兩次 inode 的修改;然后選擇一臺正常服務(wù)器,請求它生成一個(gè)正常系統(tǒng)上最新版本與恢復(fù)版本的增量升級數(shù)據(jù),這樣的數(shù)據(jù)量不會很大,而且不需要象基于操作的同步那樣逐步進(jìn)行,同步效率非常高,因此可以大大提高恢復(fù)速度。同步到正常系統(tǒng)的最新版本后,然后就按照上述第 2 條的情況進(jìn)行同步數(shù)據(jù)文件的同步。[!--empirenews.page--]

基于分布版本的快速恢復(fù):當(dāng)停頓時(shí)間太長而不存在一個(gè)相同的版本,或文件服務(wù)器數(shù)據(jù)出現(xiàn)損壞(如磁盤故障造成數(shù)據(jù)損毀)時(shí),需要采用此種方法。具體辦法如下:直接把正常服務(wù)器上的最新版本傳送到退出服務(wù)器,然后按照上述的第 2 種情況進(jìn)行同步數(shù)據(jù)文件的同步。

正如上面所述,全部服務(wù)器均出現(xiàn)問題的概率是很小的,但是,不能簡單的排除這種情況的出現(xiàn),特別是本方案采用數(shù)據(jù)同步機(jī)制,即多個(gè)站點(diǎn)的數(shù)據(jù)是保持快速同步的,這雖然能保證動態(tài)遷移的順利完成,但是也帶來較大的風(fēng)險(xiǎn),就是會出現(xiàn)數(shù)據(jù)”污染”的自動傳播,當(dāng)主文件服務(wù)器中的文件數(shù)據(jù)因?yàn)槟承┰?主要是對文件的非法訪問)造成數(shù)據(jù)非法修改時(shí),會立即傳播到其他備份節(jié)點(diǎn),這樣的話,不管服務(wù)遷移到哪臺機(jī)器均會出現(xiàn)錯(cuò)誤。

針對這種情況,我們采取了以下措施:當(dāng)發(fā)現(xiàn)非法修改造成數(shù)據(jù)污染時(shí),系統(tǒng)可以自動命令各站點(diǎn)恢復(fù)到指定的版本,如前一版本(可以由管理員配置成前一、二、三個(gè)版本);管理員也可以干預(yù)這一過程,強(qiáng)制各站點(diǎn)恢復(fù)到同一指定的版本,從而保證全局文件系統(tǒng)使用同一正確版本。

NFS 文件細(xì)粒度恢復(fù)技術(shù)

在傳統(tǒng)恢復(fù)技術(shù)中,一方面由于數(shù)據(jù)備份不是實(shí)時(shí)進(jìn)行的,當(dāng)出現(xiàn)事故需要恢復(fù)時(shí),最新的備份數(shù)據(jù)與最新數(shù)據(jù)之間存在一個(gè)時(shí)間差,這樣就造成了該時(shí)間段內(nèi)數(shù)據(jù)的丟失(見圖 5);同時(shí),傳統(tǒng)的數(shù)據(jù)備份是一定時(shí)間段后數(shù)據(jù)的增量備份,是一段時(shí)間內(nèi)所有文

Linux 網(wǎng)絡(luò)文件系統(tǒng)簡介

網(wǎng)絡(luò)文件系統(tǒng)(NFS)協(xié)議是由 Sun MicroSystem 公司在 20 世紀(jì) 80 年代為了提供對共享文件的遠(yuǎn)程訪問而設(shè)計(jì)和實(shí)現(xiàn)的,它采用了經(jīng)典的客戶機(jī)/服務(wù)器模式提供服務(wù)。為了達(dá)到如同 NFS 協(xié)議通過使用 Sun 公司開發(fā)的遠(yuǎn)在本機(jī)上使用本地文件系統(tǒng)一樣便捷的效果,NFS 通過使用遠(yuǎn)程過程調(diào)用協(xié)議(RPC Protocol)來實(shí)現(xiàn)運(yùn)行在一臺計(jì)算機(jī)上的程序來調(diào)用在另一臺遠(yuǎn)程機(jī)器上運(yùn)行的子程序。同時(shí),為了解決不同平臺上的數(shù)據(jù)交互問題,它提供了外部數(shù)據(jù)表示(XDR)來解決這個(gè)問題。為了靈活地提供文件共享服務(wù),該協(xié)議可以在 TCP 協(xié)議或者是 UDP 協(xié)議上運(yùn)行,典型的情況是在 UDP 協(xié)議上運(yùn)行。在此基礎(chǔ)上,NFS 在數(shù)據(jù)的傳送過程中需要 RPC 命令得到確認(rèn),而且在需要的時(shí)候會要重傳,這樣既可以通過 UDP 協(xié)議獲得較高的通信效率,也能通過 RPC 來獲得較高的通信可靠性。

由于 NFS 基于 C/S 模式提供服務(wù),所以它的核心組件主要包括客戶機(jī)和服務(wù)器兩部分。圖 1 詳細(xì)說明了 NFS 的主要組件以及主要的配置文件。在服務(wù)器端,portmap、mountd、nfsd 三個(gè)監(jiān)控程序?qū)⒃诤笈_運(yùn)行。portmap 監(jiān)控程序用來注冊基于 RPC 的服務(wù)。當(dāng)一個(gè) RPC 的監(jiān)控程序啟動的時(shí)候,它告訴 portmap 監(jiān)控程序它在哪一個(gè)端口進(jìn)行偵聽,并且它在進(jìn)行什么樣的 RPC 服務(wù)。當(dāng)一個(gè)客戶機(jī)向服務(wù)器提出一個(gè) RPC 請求,那么它就會和 portmap 監(jiān)控程序取得聯(lián)系以確定 RPC 消息應(yīng)該發(fā)往的端口號。而 Mountd 監(jiān)控程序的功能是來讀取服務(wù)器端的/etc/exportfs 文件并且創(chuàng)建一個(gè)將服務(wù)器的本地文件系統(tǒng)導(dǎo)出的主機(jī)和網(wǎng)絡(luò)列表,因而客戶機(jī)的掛接(mount)請求都被定位到 mountd 監(jiān)控程序(daemon)。當(dāng)驗(yàn)證了服務(wù)器確實(shí)具有掛接所請求的文件系統(tǒng)的權(quán)限以后,mountd 為請求的掛接點(diǎn)返回一個(gè)文件句柄。而 nfsd 監(jiān)控程序則被服務(wù)器用來處理客戶機(jī)端發(fā)送過來的請求。由于服務(wù)器需要同時(shí)處理多個(gè)客戶機(jī)的請求,所以在缺省情況下,操作系統(tǒng)將會自動啟動八個(gè) nfsd 線程。當(dāng)然,如果 NFS 服務(wù)器特別忙的時(shí)候,系統(tǒng)有可能根據(jù)實(shí)際情況啟動更多的線程。

圖 1 網(wǎng)絡(luò)文件系統(tǒng)簡圖

NFS 的客戶機(jī)與服務(wù)器之間通過 RPC 進(jìn)行通信,通信過程如下所示:

用戶將 NFS 服務(wù)器的共享目錄掛載到本地文件系統(tǒng)中。

客戶訪問 NFS 目錄中的文件時(shí),NFS 客戶端向 NFS 服務(wù)器端發(fā)送 RPC 請求。

NFS 服務(wù)端接收客戶端發(fā)來的 RPC 請求,并將這個(gè)請求傳遞給本地文件訪問程序,然后訪問服務(wù)器主機(jī)上的一個(gè)本地的磁盤文件。NFS 服務(wù)器可以同時(shí)接收多個(gè) NFS 客戶端的請求,并對其進(jìn)行并發(fā)控制。

NFS 客戶端向服務(wù)器主機(jī)發(fā)出一個(gè) RPC 調(diào)用,然后等待服務(wù)器的應(yīng)答。NFS 客戶端收到服務(wù)器的應(yīng)答后,把結(jié)果信息展現(xiàn)給用戶或應(yīng)用程序。

NFS 下的數(shù)據(jù)備份、恢復(fù)的主要功能

對數(shù)據(jù)進(jìn)行備份與恢復(fù)是保證數(shù)據(jù)安全和業(yè)務(wù)連續(xù)性的非常成熟的做法。在 Linux 下的本地文件系統(tǒng)(例如 Ext2、Ext3 等)中,數(shù)據(jù)備份和恢復(fù)一般采用常規(guī)的辦法來進(jìn)行操作,例如使用 Tar、Archive 等。而對于 NFS 來說,其數(shù)據(jù)備份需要采用量身定制的方法來進(jìn)行。

為了保證數(shù)據(jù)在災(zāi)難環(huán)境中的可用性和業(yè)務(wù)連續(xù)性,針對它的數(shù)據(jù)備份、恢復(fù)方案應(yīng)具備如下重要功能:

通過對系統(tǒng)重要數(shù)據(jù)的快速備份,切實(shí)保證系統(tǒng)數(shù)據(jù)的安全;

可以根據(jù)指令完成備份系統(tǒng)的實(shí)時(shí)切入,保證服務(wù)不被中斷,保持系統(tǒng)持續(xù)運(yùn)行的能力;

通過實(shí)時(shí)記錄所有文件的操作日志,系統(tǒng)管理員能夠在發(fā)生災(zāi)難的情況下對日志進(jìn)行分析和取證,從而發(fā)現(xiàn)入侵者的蛛絲馬跡。

NFS 多版本備份技術(shù)

為了保證服務(wù)器出現(xiàn)故障后能迅速恢復(fù),要求系統(tǒng)數(shù)據(jù)能快速恢復(fù)到一個(gè)最近的正確狀態(tài),所有這些都需要多版本技術(shù)的支持,通過同步記錄文件的在某些時(shí)刻的狀態(tài),在整個(gè)系統(tǒng)范圍內(nèi)建立起類似于數(shù)據(jù)庫系統(tǒng)的”檢查點(diǎn)”,以保證上述目標(biāo)的實(shí)現(xiàn)。

對于多版本系統(tǒng)而言,需要較好地解決兩個(gè)方面的問題:性能和空間利用率。對于前者,最主要的是保證在生成版本的時(shí)候能夠快速完成,同時(shí)恢復(fù)時(shí)也具有較好的性能。此外,系統(tǒng)引入多版本造成的整體開銷也應(yīng)該比較理想。對于第二點(diǎn),主要考慮是節(jié)約磁盤空間,雖然隨著硬件技術(shù)的不斷發(fā)展,磁盤空間越來越大,性價(jià)比也越來越高,但是當(dāng)版本較多而且文件數(shù)量較多、較大時(shí),引入多版本增加的開銷也可能相當(dāng)可觀,同時(shí),較大的空間也意味著版本生成時(shí)可能需要更多的寫操作,這樣也必將影響總體性能。[!--empirenews.page--]

為了保證引入多版本特性后文件系統(tǒng)仍具有較好的性能,以及保證較高的空間利用率,我們開發(fā)了一種高效的惰性版本生成算法。主要思想是:生成版本時(shí)不進(jìn)行文件的復(fù)制,僅復(fù)制目錄結(jié)構(gòu),在新版本生成后到下一版本生成前,如果有文件需要修改,則第一次修改時(shí)對該文件進(jìn)行復(fù)制,從而保證該文件狀態(tài)與對應(yīng)的版本保持一致。

在一般情況下,目錄結(jié)構(gòu)的數(shù)據(jù)量遠(yuǎn)遠(yuǎn)小于文件的數(shù)據(jù)量,因而這種方法可以大大降低版本生成時(shí)需要復(fù)制的數(shù)據(jù)量,因而具有較高的性能。同時(shí),這種把單個(gè)文件版本生成的實(shí)際操作推后到非做不可的時(shí)候,并且任意文件在兩次版本之間最多生成一次版本,因此這種惰性策略可以使需要實(shí)際生成版本的文件數(shù)量達(dá)到最少,同時(shí)還可以把多個(gè)文件版本生成操作分散到具體的文件操作中,從而避免了集中的一次性版本生成方法可能造成的服務(wù)暫時(shí)停頓的問題。

版本生成后的結(jié)構(gòu)如圖 2 所示。

圖 2 多版本生成示意圖

具體算法包括兩個(gè)部分,即版本生成算法和文件第一次修改處理算法,版本生成算法主要完成版本生成工作,主要過程如下:

找到需要形成版本的最高層目錄作為原目錄;

利用文件系統(tǒng)提供的函數(shù),生成新的目錄節(jié)點(diǎn),稱為新目錄;

把原目錄中的結(jié)構(gòu)復(fù)制到新目錄;

在原目錄中找到所有的子目錄,重復(fù) 2、3 步;

把新的子目錄對應(yīng)的 inode 號替換上一層目錄中的老 inode 號;

重復(fù)上述過程,及到目錄樹中的所有目錄得到復(fù)制為止。

在上述策略中,新版本并沒有復(fù)制所有的文件,只是在復(fù)制的目錄結(jié)構(gòu)中記錄下了該文件的 inode 號(即復(fù)制了目錄的結(jié)構(gòu),而不是把文件都進(jìn)行復(fù)制,從而節(jié)省了存儲和計(jì)算資源),因此,當(dāng)有 NFS 請求需要對文件進(jìn)行版本生成后的第一次修改時(shí),需要復(fù)制該文件,生成新的版本。該實(shí)現(xiàn)過程參見如下流程圖:

圖 3 寫時(shí)復(fù)制算法示意圖

這種文件復(fù)制策略其實(shí)是一種惰性算法,也即我們常說的寫時(shí)復(fù)制的方法,這個(gè)方法在 Linux 操作系統(tǒng)的子進(jìn)程對父進(jìn)程資源的繼承中有所體現(xiàn)。這個(gè)策略一方面可以最大限度減少復(fù)制文件的數(shù)量,另一方面則可以避免瞬間過大的文件復(fù)制工作量,影響文件服務(wù)的性能。該算法的過程如下:當(dāng)文件操作為寫操作時(shí),判斷該文件是否版本生成后的第一次寫操作;若是則利用文件系統(tǒng)提供的底層函數(shù)生成一個(gè)新的文件,復(fù)制源文件的數(shù)據(jù)到新生成的文件,同時(shí)把該文件當(dāng)前版本的 inode 節(jié)點(diǎn)中的版本號置為當(dāng)前版本號,這樣新文件就成為該文件的最新版本。

雖然我們采用的算法可以有較好的性能,存儲開銷也是最優(yōu),但是,每次版本生成肯定會造成服務(wù)性能的下降和空間的占用,而這些代價(jià)在一個(gè)比較安全可靠的環(huán)境中是可以適當(dāng)降低的,即當(dāng)系統(tǒng)比較安全的時(shí)候,可以選擇讓系統(tǒng)以更低的頻率進(jìn)行版本生成,相反,當(dāng)系統(tǒng)安全狀況比較糟糕的時(shí)候,可以通過提高版本生成頻率適當(dāng)降低服務(wù)性能來獲得更高的數(shù)據(jù)安全性能,當(dāng)系統(tǒng)處于緊急狀態(tài)時(shí),甚至可以要求立即進(jìn)行版本生成。

基于這些考慮,我們采用了自適應(yīng)的備份策略,災(zāi)情評估系統(tǒng)可以動態(tài)評估系統(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)重要的,所以,對于文件系統(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)替換下來,進(jìn)入恢復(fù)狀態(tài),其他正常的站點(diǎn)仍可提供正常的服務(wù)。

當(dāng)然,也存在所有站點(diǎn)均出現(xiàn)故障的情況,但是由于我們采用了多種措施,如動態(tài)隨機(jī)遷移、災(zāi)情評估與響應(yīng)策略等,再配合傳統(tǒng)的防火墻、IDS 等安全系統(tǒng),可以極大限度地減少這種幾率。因此,我們的數(shù)據(jù)恢復(fù)問題主要考慮上述這種情形,即個(gè)別服務(wù)器出現(xiàn)故障退出服務(wù)而其他系統(tǒng)依然正常的情況。

首先,我們來分析一下系統(tǒng)退出后數(shù)據(jù)的情形,主要涉及到退出的服務(wù)器和正常的主服務(wù)器與備份服務(wù)器,如圖 4 所示:

圖 4 一個(gè)系統(tǒng)退出后數(shù)據(jù)狀態(tài)示意圖

在上圖中,退出服務(wù)器最后生成的版本號為 i,系統(tǒng)退出后,一方面主文件服務(wù)器會察覺到同步數(shù)據(jù)無法從退出服務(wù)器返回結(jié)果,這樣的話它就會重發(fā)同步請求,經(jīng)過 3 次重發(fā)后,如果依然沒有返回信息,則認(rèn)為該服務(wù)器退出服務(wù),因此會把同步數(shù)據(jù)備份到磁盤文件中,并記錄下該服務(wù)器在同步數(shù)據(jù)文件中的起始位置,這當(dāng)由多個(gè)文件服務(wù)器退出時(shí)可以分別識別出來。由于退出系統(tǒng)無法繼續(xù)保持同步,因此其狀態(tài)會與工作的文件服務(wù)器不一致,具體表現(xiàn)在以下幾個(gè)方面:

當(dāng)退出時(shí)間很短時(shí),數(shù)據(jù)不一致僅存在于緩沖區(qū)中,這時(shí)如果退出服務(wù)器能立即重新投入使用,則不需要進(jìn)行額外的數(shù)據(jù)恢復(fù),數(shù)據(jù)同步可以通過主服務(wù)器同步請求的重試來達(dá)到。

當(dāng)主服務(wù)器確認(rèn)退出服務(wù)器退出后,會把未同步的數(shù)據(jù)寫入特定的同步數(shù)據(jù)文件中,這時(shí)的不一致性包括了緩沖區(qū)中的數(shù)據(jù)和同步數(shù)據(jù)文件中的數(shù)據(jù),這時(shí)的數(shù)據(jù)恢復(fù)需要做兩方面的工作:

把同步數(shù)據(jù)文件中的正確數(shù)據(jù)一次性發(fā)送給退出服務(wù)器,退出服務(wù)器把它寫入本地的同步數(shù)據(jù)文件;

建立本地的緩沖區(qū),建立起同步機(jī)制,接收同步數(shù)據(jù),同時(shí)啟動數(shù)據(jù)同步進(jìn)程,先同步數(shù)據(jù)文件中的數(shù)據(jù),當(dāng)緩沖區(qū)數(shù)據(jù)因沒有處理而達(dá)到一定程度時(shí),會自動把部分?jǐn)?shù)據(jù)追加到同步數(shù)據(jù)文件的后面,這時(shí),退出服務(wù)器已經(jīng)恢復(fù)了正常工作,實(shí)際上也不需要過多的數(shù)據(jù)恢復(fù)工作。[!--empirenews.page--]

由于主文件服務(wù)器一般需要處理文件的讀寫請求,寫請求僅占一部分,需要同步而執(zhí)行的操作造成的負(fù)載要小于主服務(wù)器,因此可能在較短的時(shí)間內(nèi)完成同步。當(dāng)需要退出服務(wù)器(此時(shí)已經(jīng)進(jìn)入同步階段)成為主服務(wù)器時(shí),則必須等所有同步數(shù)據(jù)同步完成后才能開始服務(wù)。

如果退出服務(wù)器是因?yàn)檩^嚴(yán)重的故障或?yàn)?zāi)難而退出的,則可能需要較長時(shí)間的處理,如更換硬件、系統(tǒng)重啟、甚至重裝系統(tǒng)等,這時(shí)就可能出現(xiàn)一些困難的情況,一種是如上圖所示的,工作正常的系統(tǒng)已經(jīng)生成了新的版本,如服務(wù)器退出時(shí)的最新版本是 i,經(jīng)過一段時(shí)間后,正常系統(tǒng)生成了新的版本,這時(shí)主系統(tǒng)會清空同步數(shù)據(jù)文件,重新從版本生成后進(jìn)行記錄。對于這種情況,可以有兩種處理辦法:

基于本地版本的快速恢復(fù):當(dāng)退出文件服務(wù)器本地至少存在一個(gè)版本與其他正常機(jī)器上的版本相同時(shí),可以采用這種恢復(fù)策略。具體而言,先確定一個(gè)最新的正確版本,用本地版本恢復(fù),這一過程非常簡單快捷,僅涉及到兩次 inode 的修改;然后選擇一臺正常服務(wù)器,請求它生成一個(gè)正常系統(tǒng)上最新版本與恢復(fù)版本的增量升級數(shù)據(jù),這樣的數(shù)據(jù)量不會很大,而且不需要象基于操作的同步那樣逐步進(jìn)行,同步效率非常高,因此可以大大提高恢復(fù)速度。同步到正常系統(tǒng)的最新版本后,然后就按照上述第 2 條的情況進(jìn)行同步數(shù)據(jù)文件的同步。

基于分布版本的快速恢復(fù):當(dāng)停頓時(shí)間太長而不存在一個(gè)相同的版本,或文件服務(wù)器數(shù)據(jù)出現(xiàn)損壞(如磁盤故障造成數(shù)據(jù)損毀)時(shí),需要采用此種方法。具體辦法如下:直接把正常服務(wù)器上的最新版本傳送到退出服務(wù)器,然后按照上述的第 2 種情況進(jìn)行同步數(shù)據(jù)文件的同步。

正如上面所述,全部服務(wù)器均出現(xiàn)問題的概率是很小的,但是,不能簡單的排除這種情況的出現(xiàn),特別是本方案采用數(shù)據(jù)同步機(jī)制,即多個(gè)站點(diǎn)的數(shù)據(jù)是保持快速同步的,這雖然能保證動態(tài)遷移的順利完成,但是也帶來較大的風(fēng)險(xiǎn),就是會出現(xiàn)數(shù)據(jù)”污染”的自動傳播,當(dāng)主文件服務(wù)器中的文件數(shù)據(jù)因?yàn)槟承┰?主要是對文件的非法訪問)造成數(shù)據(jù)非法修改時(shí),會立即傳播到其他備份節(jié)點(diǎn),這樣的話,不管服務(wù)遷移到哪臺機(jī)器均會出現(xiàn)錯(cuò)誤。

針對這種情況,我們采取了以下措施:當(dāng)發(fā)現(xiàn)非法修改造成數(shù)據(jù)污染時(shí),系統(tǒng)可以自動命令各站點(diǎn)恢復(fù)到指定的版本,如前一版本(可以由管理員配置成前一、二、三個(gè)版本);管理員也可以干預(yù)這一過程,強(qiáng)制各站點(diǎn)恢復(fù)到同一指定的版本,從而保證全局文件系統(tǒng)使用同一正確版本。

NFS 文件細(xì)粒度恢復(fù)技術(shù)

在傳統(tǒng)恢復(fù)技術(shù)中,一方面由于數(shù)據(jù)備份不是實(shí)時(shí)進(jìn)行的,當(dāng)出現(xiàn)事故需要恢復(fù)時(shí),最新的備份數(shù)據(jù)與最新數(shù)據(jù)之間存在一個(gè)時(shí)間差,這樣就造成了該時(shí)間段內(nèi)數(shù)據(jù)的丟失(見圖 5);同時(shí),傳統(tǒng)的數(shù)據(jù)備份是一定時(shí)間段后數(shù)據(jù)的增量備份,是一段時(shí)間內(nèi)所有文件操作疊加后的結(jié)果,因而無法精確知道在這段時(shí)間內(nèi)實(shí)際數(shù)據(jù)的變化過程,因而也無法從所有這些操作中定位非法操作,并進(jìn)行選擇性的恢復(fù),以保證數(shù)據(jù)的正確性。

圖 5 因非實(shí)時(shí)備份造成恢復(fù)時(shí)的數(shù)據(jù)丟失示意圖

基于上述考慮,我們不但采用了增量方式的多版本備份恢復(fù)技術(shù),同時(shí)還對文件的修改日志進(jìn)行了實(shí)時(shí)的備份,這樣就可以在事故發(fā)生后進(jìn)行基于文件操作的精確恢復(fù),并支持允許剔除非法操作的選擇性恢復(fù),這樣既能盡量避免因事故造成的數(shù)據(jù)丟失問題,又能通過選擇性恢復(fù)較好保證數(shù)據(jù)的正確性,同時(shí),還可以通過對日志的分析,結(jié)合數(shù)據(jù)的精確恢復(fù),達(dá)到發(fā)現(xiàn)犯罪線索、獲得有效證據(jù)的目的,為打擊網(wǎng)絡(luò)犯罪提供有力的技術(shù)手段。在這里,精確性恢復(fù)指的是恢復(fù)某一時(shí)段的所有操作,一般是在某一版本后的所有操作,不由用戶進(jìn)行選擇,而選擇性恢復(fù)則指的是某一時(shí)間段內(nèi)的所有操作構(gòu)成的集合的子集,需要恢復(fù)的操作由用戶通過查詢、瀏覽等工具來進(jìn)行選擇。在我們的定義中,實(shí)際上可以認(rèn)為精確恢復(fù)為選擇性恢復(fù)的一個(gè)特例。

我們首先需要有相關(guān)的解決方法來記錄下具體的操作信息,形成操作日志文件,從而作為分析的證據(jù)(參見圖 6)。我們使用的策略是通過修改服務(wù)器操作系統(tǒng)內(nèi)核調(diào)用 nfsd_write()、nfsd_create()……。從中取到調(diào)用處理對象的文件、目錄的全路徑名,寫進(jìn)文件,在內(nèi)核中截獲相應(yīng)的文件操作請求。下面以 nfsd_rename()系統(tǒng)調(diào)用為例,進(jìn)行擴(kuò)充、修改而實(shí)現(xiàn)記錄操作日志的功能。

int nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname,

int flen,struct svc_fh *tfhp, char *tname, int tlen)

{

struct dentry *fdentry, *tdentry, *odentry, *ndentry;

struct inode *fdir, *tdir;

int err;

char *name;

mem_segment_t oldfs;

int fd;

err = fh_verify(rqstp, ffhp, S_IFDIR, MAY_REMOVE);

if (err)

goto out;

rqstp->rq_path1 = rqstp->rq_path2;

err = fh_verify(rqstp, tfhp, S_IFDIR, MAY_CREATE);

if (err)

goto out;

fdentry = ffhp->fh_dentry;

fdir = fdentry->d_inode;

tdentry = tfhp->fh_dentry;

tdir = tdentry->d_inode;

……

//加入的代碼進(jìn)行處理工作

if((!rqstp->rq_recover)&&(!S_ISDIR(odentry->d_inode->i_mode))

&&(odentry->d_inode->i_nlink>1)){

rqstp->rq_copy->wait = 1;

rqstp->rq_copy->done = 0;

name = get_total_name(dentry,NULL);

oldfs = get_fs();

set_fs(KERNEL_DS); //進(jìn)入內(nèi)核模式

fd = sys_open("/backupserv/changfilename.c",0,31681);

sys_write(fd,name,strlen(name));

sys_close(fd);

set_fs(oldfs); //從內(nèi)核模式返回

[!--empirenews.page--]

while(!rqstp->rq_copy->done){

schedule_timeout((HZ+99)/100);

……

}

}

該文件是在 nfs 服務(wù)器端執(zhí)行 nfs 客戶機(jī)發(fā)送過來的修改文件或者是目錄的原函數(shù)。在這里,我們可以通過添加自己的代碼,來將創(chuàng)建的目錄和文件名存入一個(gè)磁盤文件當(dāng)中,以備后面的備份和恢復(fù)操作。

圖 6 NFS 文件細(xì)粒度恢復(fù)日志產(chǎn)生示意圖

獲得了操作日志信息,然后就可以進(jìn)行精確恢復(fù)和選擇性恢復(fù)時(shí)。首先由用戶利用數(shù)據(jù)查詢、瀏覽工具確定需要恢復(fù)的文件操作集,然后利用相應(yīng)的日志數(shù)據(jù)按記錄產(chǎn)生順序逐條生成恢復(fù)請求,發(fā)送給文件服務(wù)器端的代理程序,由它通過 proc 文件請求 NFS 文件系統(tǒng)恢復(fù)模塊進(jìn)行恢復(fù),恢復(fù)模塊收到請求后,取出相關(guān)數(shù)據(jù),然后通過調(diào)用底層 ext3 文件系統(tǒng)基本操作完成該次文件操作的”重放”,最后返回執(zhí)行結(jié)果,通過 proc 文件通知代理程序,代理程序再通知管理端,管理端再發(fā)送下一條恢復(fù)請求,及到所有選中的操作全完成為止。具體實(shí)現(xiàn)模式請參看圖 7:

圖 7 恢復(fù)流程示意圖

數(shù)據(jù)快速同步技術(shù)

在系統(tǒng)中,各文件服務(wù)器之間的數(shù)據(jù)需要及時(shí)同步更新,這樣才能保證服務(wù)遷移后到新的環(huán)境后相關(guān)數(shù)據(jù)環(huán)境的一致性,從而保證服務(wù)遷移在語義上的正確性。在本方案中,每個(gè)文件服務(wù)器均采用 NFSv3 協(xié)議向外提供文件服務(wù),當(dāng)系統(tǒng)開始工作時(shí),管理員會指定一臺主服務(wù)器,由該服務(wù)器負(fù)責(zé)向外提供服務(wù),其他文件服務(wù)器為備份服務(wù)器,接收同步數(shù)據(jù),進(jìn)行數(shù)據(jù)的同步更新,并不對外提供服務(wù),只有當(dāng)系統(tǒng)決定遷移后,選定的遷移目標(biāo)對應(yīng)的文件服務(wù)器才成為主文件服務(wù)器。

由于主文件服務(wù)器負(fù)責(zé)對外的文件服務(wù),因此,數(shù)據(jù)同步的發(fā)起者應(yīng)該是主文件服務(wù)器,而所有的備份服務(wù)器均為被動的同步數(shù)據(jù)接收者。因此,數(shù)據(jù)的快速同步包含兩方面的工作:主文件服務(wù)器產(chǎn)生同步數(shù)據(jù)和備份文件服務(wù)器接收同步數(shù)據(jù)完成同步。具體的數(shù)據(jù)流向如圖 8 所示:

圖 8 同步數(shù)據(jù)的產(chǎn)生與流動示意圖

為了達(dá)到數(shù)據(jù)快速同步的目的,我們采用了記錄文件寫操作(包括創(chuàng)建、修改、刪除、改名、屬性修改等所有的改變文件或目錄屬性、內(nèi)容的操作)的具體參數(shù)的方法來生成同步數(shù)據(jù),這樣每次生成的數(shù)據(jù)量比較少,而且可以滿足及時(shí)更新的目的。同步數(shù)據(jù)的格式及相關(guān)代碼段如下:

struct Log {

int length; //整個(gè)數(shù)據(jù)包的長度

int ops; //操作的類型

char* data; //與操作相關(guān)數(shù)據(jù)

};

//下面代碼段從內(nèi)核將同步數(shù)據(jù)包發(fā)往其他文件服務(wù)器

long send(struct socket* sock, void * buff,size_t len)

{

int err;

mm_segment_t oldfs;

struct msghdr msg;

struct iovec iov;

static int total = 0;

down(&log_sem);

iov.iov_base=buff;

iov.iov_len=len;

msg.msg_name=NULL;

msg.msg_iov=&iov;

msg.msg_iovlen=1;

msg.msg_control=NULL;

msg.msg_controllen=0;

msg.msg_namelen=0;

total += len;

msg.msg_flags = MSG_SYN;//DONTWAIT;

oldfs=get_fs();

set_fs(KERNEL_DS);

err = sock_sendmsg(sock, &msg, len);

set_fs(oldfs);

if(err<0){

dprintk("send err(errNo=%d len = %d)n",err,len);

netbroken = 1;

}

……

up(&log_sem);

return(err);

}

同步數(shù)據(jù)產(chǎn)生后,先放入一個(gè)緩沖區(qū)中,而不是立即發(fā)送到備份文件服務(wù)器,這樣可以較大程度改善系統(tǒng)的總體性能。緩沖區(qū)中的數(shù)據(jù)由同步管理進(jìn)程管理,當(dāng)達(dá)到一定數(shù)據(jù)量時(shí),同步管理程序負(fù)責(zé)把緩沖區(qū)中的數(shù)據(jù)發(fā)送到備份文件服務(wù)器上,并根據(jù)返回的應(yīng)答結(jié)果決定是否需要把重發(fā)數(shù)據(jù),當(dāng)確認(rèn)某個(gè)服務(wù)器無法響應(yīng)后,自動把同步數(shù)據(jù)定期寫入一個(gè)僅可追加的文件,以便于隨后可能需要的恢復(fù)階段同步的需要,當(dāng)這個(gè)寫入的文件數(shù)據(jù)量超出一定限制時(shí),并且系統(tǒng)確認(rèn)已經(jīng)至少有一個(gè)新的版本生成,可以把該文件清空。

當(dāng)數(shù)據(jù)到達(dá)備份文件服務(wù)器時(shí),由獨(dú)立的接收進(jìn)程負(fù)責(zé)把數(shù)據(jù)放入接收緩沖區(qū),經(jīng)核對數(shù)據(jù)無誤后給主服務(wù)器發(fā)送確認(rèn)信號,另一個(gè)獨(dú)立進(jìn)程即更新管理進(jìn)程把接收緩沖區(qū)作為輸入,從中解析出一個(gè)個(gè)的順序的操作日志,從每個(gè)日志中得到操作類型,然后在剩余的數(shù)據(jù)中按照特定的操作類型提取所需的參數(shù),利用文件系統(tǒng)調(diào)用完成相應(yīng)操作。

總結(jié)

Linux 網(wǎng)絡(luò)文件系統(tǒng)已經(jīng)為企業(yè)在數(shù)據(jù)備份和共享領(lǐng)域得到了廣泛應(yīng)用。如何保證其多版本備份、實(shí)時(shí)恢復(fù)是一個(gè)非常關(guān)鍵的問題,本文將詳細(xì)介紹針對該網(wǎng)絡(luò)文件系統(tǒng)的數(shù)據(jù)備份、恢復(fù)及同步機(jī)制在內(nèi)核的具體實(shí)現(xiàn),給廣大系統(tǒng)管理員和研發(fā)人員提供技術(shù)參考。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀
關(guān)閉
關(guān)閉