Linux 網(wǎng)絡(luò)文件系統(tǒng)的數(shù)據(jù)備份及恢復(fù)機(jī)制實(shí)現(xiàn)
由于主文件服務(wù)器一般需要處理文件的讀寫請求,寫請求僅占一部分,需要同步而執(zhí)行的操作造成的負(fù)載要小于主服務(wù)器,因此可能在較短的時間內(nèi)完成同步。當(dāng)需要退出服務(wù)器(此時已經(jīng)進(jìn)入同步階段)成為主服務(wù)器時,則必須等所有同步數(shù)據(jù)同步完成后才能開始服務(wù)。
如果退出服務(wù)器是因?yàn)檩^嚴(yán)重的故障或?yàn)?zāi)難而退出的,則可能需要較長時間的處理,如更換硬件、系統(tǒng)重啟、甚至重裝系統(tǒng)等,這時就可能出現(xiàn)一些困難的情況,一種是如上圖所示的,工作正常的系統(tǒng)已經(jīng)生成了新的版本,如服務(wù)器退出時的最新版本是 i,經(jīng)過一段時間后,正常系統(tǒng)生成了新的版本,這時主系統(tǒng)會清空同步數(shù)據(jù)文件,重新從版本生成后進(jìn)行記錄。對于這種情況,可以有兩種處理辦法:
基于本地版本的快速恢復(fù):當(dāng)退出文件服務(wù)器本地至少存在一個版本與其他正常機(jī)器上的版本相同時,可以采用這種恢復(fù)策略。具體而言,先確定一個最新的正確版本,用本地版本恢復(fù),這一過程非常簡單快捷,僅涉及到兩次 inode 的修改;然后選擇一臺正常服務(wù)器,請求它生成一個正常系統(tǒng)上最新版本與恢復(fù)版本的增量升級數(shù)據(jù),這樣的數(shù)據(jù)量不會很大,而且不需要象基于操作的同步那樣逐步進(jìn)行,同步效率非常高,因此可以大大提高恢復(fù)速度。同步到正常系統(tǒng)的最新版本后,然后就按照上述第 2 條的情況進(jìn)行同步數(shù)據(jù)文件的同步。
基于分布版本的快速恢復(fù):當(dāng)停頓時間太長而不存在一個相同的版本,或文件服務(wù)器數(shù)據(jù)出現(xiàn)損壞(如磁盤故障造成數(shù)據(jù)損毀)時,需要采用此種方法。具體辦法如下:直接把正常服務(wù)器上的最新版本傳送到退出服務(wù)器,然后按照上述的第 2 種情況進(jìn)行同步數(shù)據(jù)文件的同步。
正如上面所述,全部服務(wù)器均出現(xiàn)問題的概率是很小的,但是,不能簡單的排除這種情況的出現(xiàn),特別是本方案采用數(shù)據(jù)同步機(jī)制,即多個站點(diǎn)的數(shù)據(jù)是保持快速同步的,這雖然能保證動態(tài)遷移的順利完成,但是也帶來較大的風(fēng)險(xiǎn),就是會出現(xiàn)數(shù)據(jù)”污染”的自動傳播,當(dāng)主文件服務(wù)器中的文件數(shù)據(jù)因?yàn)槟承┰?主要是對文件的非法訪問)造成數(shù)據(jù)非法修改時,會立即傳播到其他備份節(jié)點(diǎn),這樣的話,不管服務(wù)遷移到哪臺機(jī)器均會出現(xiàn)錯誤。
針對這種情況,我們采取了以下措施:當(dāng)發(fā)現(xiàn)非法修改造成數(shù)據(jù)污染時,系統(tǒng)可以自動命令各站點(diǎn)恢復(fù)到指定的版本,如前一版本(可以由管理員配置成前一、二、三個版本);管理員也可以干預(yù)這一過程,強(qiáng)制各站點(diǎn)恢復(fù)到同一指定的版本,從而保證全局文件系統(tǒng)使用同一正確版本。
NFS 文件細(xì)粒度恢復(fù)技術(shù)
在傳統(tǒng)恢復(fù)技術(shù)中,一方面由于數(shù)據(jù)備份不是實(shí)時進(jìn)行的,當(dāng)出現(xiàn)事故需要恢復(fù)時,最新的備份數(shù)據(jù)與最新數(shù)據(jù)之間存在一個時間差,這樣就造成了該時間段內(nèi)數(shù)據(jù)的丟失(見圖 5);同時,傳統(tǒng)的數(shù)據(jù)備份是一定時間段后數(shù)據(jù)的增量備份,是一段時間內(nèi)所有文件操作疊加后的結(jié)果,因而無法精確知道在這段時間內(nèi)實(shí)際數(shù)據(jù)的變化過程,因而也無法從所有這些操作中定位非法操作,并進(jìn)行選擇性的恢復(fù),以保證數(shù)據(jù)的正確性。
圖 5 因非實(shí)時備份造成恢復(fù)時的數(shù)據(jù)丟失示意圖
基于上述考慮,我們不但采用了增量方式的多版本備份恢復(fù)技術(shù),同時還對文件的修改日志進(jìn)行了實(shí)時的備份,這樣就可以在事故發(fā)生后進(jìn)行基于文件操作的精確恢復(fù),并支持允許剔除非法操作的選擇性恢復(fù),這樣既能盡量避免因事故造成的數(shù)據(jù)丟失問題,又能通過選擇性恢復(fù)較好保證數(shù)據(jù)的正確性,同時,還可以通過對日志的分析,結(jié)合數(shù)據(jù)的精確恢復(fù),達(dá)到發(fā)現(xiàn)犯罪線索、獲得有效證據(jù)的目的,為打擊網(wǎng)絡(luò)犯罪提供有力的技術(shù)手段。在這里,精確性恢復(fù)指的是恢復(fù)某一時段的所有操作,一般是在某一版本后的所有操作,不由用戶進(jìn)行選擇,而選擇性恢復(fù)則指的是某一時間段內(nèi)的所有操作構(gòu)成的集合的子集,需要恢復(fù)的操作由用戶通過查詢、瀏覽等工具來進(jìn)行選擇。在我們的定義中,實(shí)際上可以認(rèn)為精確恢復(fù)為選擇性恢復(fù)的一個特例。
我們首先需要有相關(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)核模式返回
評論