Linux 網(wǎng)絡(luò )文件系統的數據備份及恢復機制實(shí)現
由于主文件服務(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)行同步數據文件的同步。
基于分布版本的快速恢復:當停頓時(shí)間太長(cháng)而不存在一個(gè)相同的版本,或文件服務(wù)器數據出現損壞(如磁盤(pán)故障造成數據損毀)時(shí),需要采用此種方法。具體辦法如下:直接把正常服務(wù)器上的最新版本傳送到退出服務(wù)器,然后按照上述的第 2 種情況進(jìn)行同步數據文件的同步。
正如上面所述,全部服務(wù)器均出現問(wèn)題的概率是很小的,但是,不能簡(jiǎn)單的排除這種情況的出現,特別是本方案采用數據同步機制,即多個(gè)站點(diǎn)的數據是保持快速同步的,這雖然能保證動(dòng)態(tài)遷移的順利完成,但是也帶來(lái)較大的風(fēng)險,就是會(huì )出現數據”污染”的自動(dòng)傳播,當主文件服務(wù)器中的文件數據因為某些原因(主要是對文件的非法訪(fǎng)問(wèn))造成數據非法修改時(shí),會(huì )立即傳播到其他備份節點(diǎn),這樣的話(huà),不管服務(wù)遷移到哪臺機器均會(huì )出現錯誤。
針對這種情況,我們采取了以下措施:當發(fā)現非法修改造成數據污染時(shí),系統可以自動(dòng)命令各站點(diǎn)恢復到指定的版本,如前一版本(可以由管理員配置成前一、二、三個(gè)版本);管理員也可以干預這一過(guò)程,強制各站點(diǎn)恢復到同一指定的版本,從而保證全局文件系統使用同一正確版本。
NFS 文件細粒度恢復技術(shù)
在傳統恢復技術(shù)中,一方面由于數據備份不是實(shí)時(shí)進(jìn)行的,當出現事故需要恢復時(shí),最新的備份數據與最新數據之間存在一個(gè)時(shí)間差,這樣就造成了該時(shí)間段內數據的丟失(見(jiàn)圖 5);同時(shí),傳統的數據備份是一定時(shí)間段后數據的增量備份,是一段時(shí)間內所有文件操作疊加后的結果,因而無(wú)法精確知道在這段時(shí)間內實(shí)際數據的變化過(guò)程,因而也無(wú)法從所有這些操作中定位非法操作,并進(jìn)行選擇性的恢復,以保證數據的正確性。
圖 5 因非實(shí)時(shí)備份造成恢復時(shí)的數據丟失示意圖

基于上述考慮,我們不但采用了增量方式的多版本備份恢復技術(shù),同時(shí)還對文件的修改日志進(jìn)行了實(shí)時(shí)的備份,這樣就可以在事故發(fā)生后進(jìn)行基于文件操作的精確恢復,并支持允許剔除非法操作的選擇性恢復,這樣既能盡量避免因事故造成的數據丟失問(wèn)題,又能通過(guò)選擇性恢復較好保證數據的正確性,同時(shí),還可以通過(guò)對日志的分析,結合數據的精確恢復,達到發(fā)現犯罪線(xiàn)索、獲得有效證據的目的,為打擊網(wǎng)絡(luò )犯罪提供有力的技術(shù)手段。在這里,精確性恢復指的是恢復某一時(shí)段的所有操作,一般是在某一版本后的所有操作,不由用戶(hù)進(jìn)行選擇,而選擇性恢復則指的是某一時(shí)間段內的所有操作構成的集合的子集,需要恢復的操作由用戶(hù)通過(guò)查詢(xún)、瀏覽等工具來(lái)進(jìn)行選擇。在我們的定義中,實(shí)際上可以認為精確恢復為選擇性恢復的一個(gè)特例。
我們首先需要有相關(guān)的解決方法來(lái)記錄下具體的操作信息,形成操作日志文件,從而作為分析的證據(參見(jiàn)圖 6)。我們使用的策略是通過(guò)修改服務(wù)器操作系統內核調用 nfsd_write()、nfsd_create()……。從中取到調用處理對象的文件、目錄的全路徑名,寫(xiě)進(jìn)文件,在內核中截獲相應的文件操作請求。下面以 nfsd_rename()系統調用為例,進(jìn)行擴充、修改而實(shí)現記錄操作日志的功能。
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)入內核模式
fd = sys_open(/backupserv/changfilename.c,0,31681);
sys_write(fd,name,strlen(name));
sys_close(fd);
set_fs(oldfs); //從內核模式返回
評論