Linux 網(wǎng)絡(luò)文件系統(tǒng)的數(shù)據(jù)備份及恢復(fù)機(jī)制實現(xiàn)
Linux 網(wǎng)絡(luò)文件系統(tǒng)簡介
本文引用地址:http://2s4d.com/article/201609/304200.htm網(wǎng)絡(luò)文件系統(tǒng)(NFS)協(xié)議是由 Sun MicroSystem 公司在 20 世紀(jì) 80 年代為了提供對共享文件的遠(yuǎn)程訪問而設(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)來實現(xiàn)運(yùn)行在一臺計算機(jī)上的程序來調(diào)用在另一臺遠(yuǎn)程機(jī)器上運(yùn)行的子程序。同時,為了解決不同平臺上的數(shù)據(jù)交互問題,它提供了外部數(shù)據(jù)表示(XDR)來解決這個問題。為了靈活地提供文件共享服務(wù),該協(xié)議可以在 TCP 協(xié)議或者是 UDP 協(xié)議上運(yùn)行,典型的情況是在 UDP 協(xié)議上運(yùn)行。在此基礎(chǔ)上,NFS 在數(shù)據(jù)的傳送過程中需要 RPC 命令得到確認(rèn),而且在需要的時候會要重傳,這樣既可以通過 UDP 協(xié)議獲得較高的通信效率,也能通過 RPC 來獲得較高的通信可靠性。
由于 NFS 基于 C/S 模式提供服務(wù),所以它的核心組件主要包括客戶機(jī)和服務(wù)器兩部分。圖 1 詳細(xì)說明了 NFS 的主要組件以及主要的配置文件。在服務(wù)器端,portmap、mountd、nfsd 三個監(jiān)控程序?qū)⒃诤笈_運(yùn)行。portmap 監(jiān)控程序用來注冊基于 RPC 的服務(wù)。當(dāng)一個 RPC 的監(jiān)控程序啟動的時候,它告訴 portmap 監(jiān)控程序它在哪一個端口進(jìn)行偵聽,并且它在進(jìn)行什么樣的 RPC 服務(wù)。當(dāng)一個客戶機(jī)向服務(wù)器提出一個 RPC 請求,那么它就會和 portmap 監(jiān)控程序取得聯(lián)系以確定 RPC 消息應(yīng)該發(fā)往的端口號。而 Mountd 監(jiān)控程序的功能是來讀取服務(wù)器端的/etc/exportfs 文件并且創(chuàng)建一個將服務(wù)器的本地文件系統(tǒng)導(dǎo)出的主機(jī)和網(wǎng)絡(luò)列表,因而客戶機(jī)的掛接(mount)請求都被定位到 mountd 監(jiān)控程序(daemon)。當(dāng)驗證了服務(wù)器確實具有掛接所請求的文件系統(tǒng)的權(quán)限以后,mountd 為請求的掛接點(diǎn)返回一個文件句柄。而 nfsd 監(jiān)控程序則被服務(wù)器用來處理客戶機(jī)端發(fā)送過來的請求。由于服務(wù)器需要同時處理多個客戶機(jī)的請求,所以在缺省情況下,操作系統(tǒng)將會自動啟動八個 nfsd 線程。當(dāng)然,如果 NFS 服務(wù)器特別忙的時候,系統(tǒng)有可能根據(jù)實際情況啟動更多的線程。
圖 1 網(wǎng)絡(luò)文件系統(tǒng)簡圖
NFS 的客戶機(jī)與服務(wù)器之間通過 RPC 進(jìn)行通信,通信過程如下所示:
用戶將 NFS 服務(wù)器的共享目錄掛載到本地文件系統(tǒng)中。
客戶訪問 NFS 目錄中的文件時,NFS 客戶端向 NFS 服務(wù)器端發(fā)送 RPC 請求。
NFS 服務(wù)端接收客戶端發(fā)來的 RPC 請求,并將這個請求傳遞給本地文件訪問程序,然后訪問服務(wù)器主機(jī)上的一個本地的磁盤文件。NFS 服務(wù)器可以同時接收多個 NFS 客戶端的請求,并對其進(jìn)行并發(fā)控制。
NFS 客戶端向服務(wù)器主機(jī)發(fā)出一個 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ù)的快速備份,切實保證系統(tǒng)數(shù)據(jù)的安全;
可以根據(jù)指令完成備份系統(tǒng)的實時切入,保證服務(wù)不被中斷,保持系統(tǒng)持續(xù)運(yùn)行的能力;
通過實時記錄所有文件的操作日志,系統(tǒng)管理員能夠在發(fā)生災(zāi)難的情況下對日志進(jìn)行分析和取證,從而發(fā)現(xiàn)入侵者的蛛絲馬跡。
NFS 多版本備份技術(shù)
為了保證服務(wù)器出現(xiàn)故障后能迅速恢復(fù),要求系統(tǒng)數(shù)據(jù)能快速恢復(fù)到一個最近的正確狀態(tài),所有這些都需要多版本技術(shù)的支持,通過同步記錄文件的在某些時刻的狀態(tài),在整個系統(tǒng)范圍內(nèi)建立起類似于數(shù)據(jù)庫系統(tǒng)的”檢查點(diǎn)”,以保證上述目標(biāo)的實現(xiàn)。
對于多版本系統(tǒng)而言,需要較好地解決兩個方面的問題:性能和空間利用率。對于前者,最主要的是保證在生成版本的時候能夠快速完成,同時恢復(fù)時也具有較好的性能。此外,系統(tǒng)引入多版本造成的整體開銷也應(yīng)該比較理想。對于第二點(diǎn),主要考慮是節(jié)約磁盤空間,雖然隨著硬件技術(shù)的不斷發(fā)展,磁盤空間越來越大,性價比也越來越高,但是當(dāng)版本較多而且文件數(shù)量較多、較大時,引入多版本增加的開銷也可能相當(dāng)可觀,同時,較大的空間也意味著版本生成時可能需要更多的寫操作,這樣也必將影響總體性能。
為了保證引入多版本特性后文件系統(tǒng)仍具有較好的性能,以及保證較高的空間利用率,我們開發(fā)了一種高效的惰性版本生成算法。主要思想是:生成版本時不進(jìn)行文件的復(fù)制,僅復(fù)制目錄結(jié)構(gòu),在新版本生成后到下一版本生成前,如果有文件需要修改,則第一次修改時對該文件進(jìn)行復(fù)制,從而保證該文件狀態(tài)與對應(yīng)的版本保持一致。
在一般情況下,目錄結(jié)構(gòu)的數(shù)據(jù)量遠(yuǎn)遠(yuǎn)小于文件的數(shù)據(jù)量,因而這種方法可以大大降低版本生成時需要復(fù)制的數(shù)據(jù)量,因而具有較高的性能。同時,這種把單個文件版本生成的實際操作推后到非做不可的時候,并且任意文件在兩次版本之間最多生成一次版本,因此這種惰性策略可以使需要實際生成版本的文件數(shù)量達(dá)到最少,同時還可以把多個文件版本生成操作分散到具體的文件操作中,從而避免了集中的一次性版本生成方法可能造成的服務(wù)暫時停頓的問題。
版本生成后的結(jié)構(gòu)如圖 2 所示。
圖 2 多版本生成示意圖
具體算法包括兩個部分,即版本生成算法和文件第一次修改處理算法,版本生成算法主要完成版本生成工作,主要過程如下:
找到需要形成版本的最高層目錄作為原目錄;
利用文件系統(tǒng)提供的函數(shù),生成新的目錄節(jié)點(diǎn),稱為新目錄;
評論