專利名稱:一種零拷貝快照方法
技術(shù)領(lǐng)域:
本發(fā)明屬于網(wǎng)絡(luò)存儲(chǔ)技術(shù)領(lǐng)域。
背景技術(shù):
隨著信息技術(shù)的發(fā)展,存儲(chǔ)備份容災(zāi)技術(shù)已成為當(dāng)前存儲(chǔ)領(lǐng)域研究的熱點(diǎn)。由 于黑客、病毒、硬件設(shè)備的失效以及火災(zāi)、地震等自然災(zāi)害的原因,使系統(tǒng)和數(shù)據(jù)信息 遭到破壞甚至毀滅,如果不及時(shí)地進(jìn)行恢復(fù),將對企業(yè)造成巨大的損失,所以備份容災(zāi) 技術(shù)顯得尤為重要。根據(jù)備份數(shù)據(jù)對現(xiàn)有應(yīng)用產(chǎn)生的影響程度,可分為離線備份和在線備份。離線 備份(Off-line Backup)在進(jìn)行備份操作時(shí),服務(wù)器不再接受來自用戶或應(yīng)用對數(shù)據(jù)的 更新。離線備份可以很好地解決在備份過程中數(shù)據(jù)的完整性問題,是防止破壞、敵意的 病毒襲擊、應(yīng)用失誤等的有效方式,但是存在一個(gè)備份窗口的問題。在備份過程中,服 務(wù)器不再接受任何更新操作,對于那些需要提供24X7的服務(wù)系統(tǒng)來說,這就成為一個(gè) 瓶頸。在線備份(On-line Back-up),就是用戶和應(yīng)用正在更新數(shù)據(jù)的同時(shí),系統(tǒng)能夠 進(jìn)行備份。在線備份可以提供24X7的持續(xù)服務(wù),但最大的難點(diǎn)是如何保持?jǐn)?shù)據(jù)的完整 性。為了保持?jǐn)?shù)據(jù)的完整性,在線備份大多采用快照(Snapshot)技術(shù)。快照技術(shù)可以 最大限度地減小復(fù)制操作對上層應(yīng)用的影響,同時(shí)保證了復(fù)制的完整性。在LVM2 (Logical Volume Manager邏輯卷管理器)中,快照采用虛擬視圖技 術(shù),在建立快照卷時(shí),源卷與快照卷共享同一份物理數(shù)據(jù)。當(dāng)源卷的數(shù)據(jù)產(chǎn)生變化時(shí), 快照只拷貝那些變化了的數(shù)據(jù),這個(gè)拷貝過程是通過一個(gè)kcopyd的后臺內(nèi)核線程來完成 的。為了實(shí)現(xiàn)快照過程,LVM2為每個(gè)源卷創(chuàng)建一個(gè)COW區(qū)域(Copy-On-Write寫
前拷貝),用于存放源LV自創(chuàng)建快照卷以來被修改的塊在修改前的數(shù)據(jù)。用戶為一個(gè) 普通邏輯創(chuàng)建快照卷后,該邏輯卷就變成一個(gè)源卷,LVM2會(huì)在創(chuàng)建快照卷的同時(shí)創(chuàng)建 COW區(qū)域。在快照卷創(chuàng)建后,用戶可以對快照卷進(jìn)行備份,產(chǎn)生的備份為源卷在創(chuàng)建 快照卷時(shí)的數(shù)據(jù)映像。LVM2對源卷上的讀寫請求和快照卷上的讀寫請求的處理方式不 同,其核心思想如下
(1)對于源卷上的讀請求處理保持不變。由于對于源卷的更新已經(jīng)反映到其對應(yīng)的 物理設(shè)備上,因此讀請求返回的是最新的數(shù)據(jù)。(2)對于源卷的寫請求處理,首先遍歷該源卷的所有快照卷,如果請求的 chunk數(shù)據(jù)沒有拷貝到快照卷的COW區(qū)域中,則把該chunk的數(shù)據(jù)拷貝到COW區(qū)域中 并記錄拷貝前后的映射關(guān)系。上述拷貝過程稱之為寫前拷貝(COW)操作。然后再更 新該chunk上的數(shù)據(jù)。上述處理保證快照LV被創(chuàng)建后源LV上所有數(shù)據(jù)在第一次被修改 前被復(fù)制到COW區(qū)域。為了減少Copy-On-Write的次數(shù),LVM把每個(gè)PE劃分成多個(gè) chunk,每次COW操作的單位是一個(gè)chunk,而不是一個(gè)扇區(qū),chunk的大小是扇區(qū)大小 的整數(shù)倍。
(3)對于快照卷上的讀請求,首先檢查該請求所在的chunk有沒有拷貝到COW 區(qū)域,如果該chunk已經(jīng)拷貝到COW區(qū)域,則直接讀取COW區(qū)域中的數(shù)據(jù),否則需要 映射到源卷,從源卷上讀取該chunk的數(shù)據(jù)。(4)對于快照卷上的寫請求,首先檢查該請求所在的chunk有沒有拷貝到COW 區(qū)域中,如果該chunk已經(jīng)拷貝到COW區(qū)域中,則直接更新該COW區(qū)域中數(shù)據(jù)。否則 需要記錄該chunk和COW區(qū)域的拷貝映射關(guān)系,再更新該COW區(qū)域中的數(shù)據(jù)。對于源卷的寫請求,寫前拷貝的處理過程大量的時(shí)間消耗在遍歷快照卷上和拷 貝數(shù)據(jù)上。如果能夠減少這兩個(gè)主要的時(shí)間消耗點(diǎn)所耗費(fèi)的時(shí)間,則新的快照方法的速 度能夠得到進(jìn)一步的提升。對于快照卷上的讀請求,從時(shí)間消耗的角度來看,寫前拷貝的方法對于檢查 chunk的時(shí)間損耗是可以避免的,所以在新的快照方法中,可以通過除去這一步以提升快 照技術(shù)的性能。
發(fā)明內(nèi)容
本發(fā)明的目的是創(chuàng)建一種新的快照方法,避免現(xiàn)有快照方法(如寫前拷貝)多 次的IO操作,提高快照的性能。本發(fā)明提出了一種零拷貝快照方法,完全消除了源卷寫操作時(shí)數(shù)據(jù)的寫前拷 貝,用初始化位圖的方法避免了快照元數(shù)據(jù)的拷貝。該方法采用追加寫的方式處理寫請 求,創(chuàng)建快照的方法簡單,系統(tǒng)開銷小,提高了系統(tǒng)整體性能。本發(fā)明提供的零拷貝快照方法,包括
第1、與現(xiàn)有的快照方法相比,不再有源數(shù)據(jù)卷和快照卷之分;磁盤布局分為元數(shù) 據(jù)區(qū)和數(shù)據(jù)區(qū),元數(shù)據(jù)區(qū)是一組chunkmap,每個(gè)chunkmap對應(yīng)一個(gè)版本的元數(shù)據(jù), chunkmap的數(shù)量與欲進(jìn)行快照的版本數(shù)相一致,數(shù)據(jù)區(qū)用于保存用戶的數(shù)據(jù); 第2、數(shù)據(jù)區(qū)處理寫請求方式采用追加寫的方式處理寫請求; 第3、創(chuàng)建快照的過程在初始狀態(tài)時(shí),當(dāng)前版本指針指向首個(gè)chunkmap;當(dāng)有創(chuàng) 建快照的請求到達(dá)時(shí),當(dāng)前版本指針指向下一個(gè)chunkmap,前一個(gè)chunkmap置為只讀, 前一個(gè)chunkmap里保存的元數(shù)據(jù)及對應(yīng)的數(shù)據(jù)即為最新快照版本;新的元數(shù)據(jù)保存在當(dāng) 前版本指針?biāo)鶎?yīng)的chunkmap中;
第4、創(chuàng)建快照的用戶態(tài)接口在Device Mapper用戶態(tài)的命令dmsetup里增加了新 的參數(shù)snap,用于表示采用零拷貝快照技術(shù)創(chuàng)建快照;
第5、快照版本切換改變當(dāng)前版本指針位置,指向?qū)?yīng)的chunkmap; 第6、快照版本切換用戶態(tài)接口 在Device Mapper用戶態(tài)的命令dmsetup里增加了 新的參數(shù)rollbk,用于表示進(jìn)行快照版本切換;
第7、元數(shù)據(jù)訪問當(dāng)前指針?biāo)傅腸hunkmap中的某一個(gè)塊如果沒被訪問過,表示 當(dāng)前狀態(tài)下,未對該塊數(shù)據(jù)進(jìn)行過更新,那么需要在歷史版本中找到對應(yīng)的最新數(shù)據(jù)。第2步所述的采用追加寫的方式處理數(shù)據(jù)區(qū)的寫請求具體為
實(shí)時(shí)記錄當(dāng)前未被使用的扇區(qū)號,每次進(jìn)行寫操作時(shí),基地址加上記錄的扇區(qū)號, 就是真正的偏移量,由此實(shí)現(xiàn)追加寫。第7步所述的元數(shù)據(jù)訪問具體為在內(nèi)存中維護(hù)一個(gè)位向量,該向量中的每一位對應(yīng)Chunkmap中一片連續(xù)區(qū)域,每N 位對應(yīng)同一位置數(shù)據(jù)的N個(gè)版本,N為Chunkmap數(shù);如果某一位為1,表示對應(yīng)版本的 Chunkmap中的數(shù)據(jù)被訪問過;為0,表示未訪問過;通過該位向量就可以確定chunkmap 中的某一塊是否有過數(shù)據(jù)更新;如果沒有過更新,則查找位向量,直到找到對應(yīng)位置為 1的位為止,那么相應(yīng)的數(shù)據(jù)就是最新版本的數(shù)據(jù)。本發(fā)明的優(yōu)點(diǎn)和有益效果
本發(fā)明實(shí)現(xiàn)了一種零拷貝快照方法,實(shí)現(xiàn)了創(chuàng)建快照時(shí)數(shù)據(jù)的零拷貝。創(chuàng)建快照時(shí) 當(dāng)前的寫操作不必暫停,創(chuàng)建快照速度快,提高了系統(tǒng)性能。本發(fā)明與現(xiàn)有快照技術(shù)相比,沒有了源數(shù)據(jù)卷和快照卷之分。底層的數(shù)據(jù)卷 由元數(shù)據(jù)區(qū)和數(shù)據(jù)區(qū)組成,元數(shù)據(jù)區(qū)是由多個(gè)Chunkmap組成的Chunkmap組,每個(gè) Chunkmap對應(yīng)一個(gè)版本快照的元數(shù)據(jù),Chunkmap的個(gè)數(shù)與快照版本的個(gè)數(shù)相一致。本發(fā)明采用追加寫的方式處理寫請求,在創(chuàng)建快照的過程中,對數(shù)據(jù)的寫請求 沒有影響,繼續(xù)追加即可。本發(fā)明利用了當(dāng)前版本指針、位向量等輔助性的變量來完成創(chuàng)建快照、訪問元 數(shù)據(jù)等操作,這些變量都保存在內(nèi)存中,不需要外存空間,且沒有真正的磁盤上的操 作,在內(nèi)存中即可完成,系統(tǒng)開銷很小。本發(fā)明中創(chuàng)建快照及快照版本切換的用戶態(tài)接口利用DeviceMapper用戶態(tài)已有 的命令,不改變現(xiàn)有命令邏輯,添加新的參數(shù)來表示采用本發(fā)明所述的方法進(jìn)行操作, 遵守用戶使用習(xí)慣,操作簡單易行。
圖1是磁盤布局示意圖; 圖2是創(chuàng)建快照過程示意圖3是追加寫方式處理寫請求示意圖; 圖4是版本切換示意圖。
具體實(shí)施例方式為便于理解本發(fā)明的上述目的、特征和優(yōu)點(diǎn),下面結(jié)合附圖和具體實(shí)施方式
對 本發(fā)明作進(jìn)一步的詳細(xì)說明。參閱圖1,磁盤布局示意圖。具體如下
該發(fā)明所用的數(shù)據(jù)卷包括元數(shù)據(jù)區(qū)和數(shù)據(jù)區(qū),元數(shù)據(jù)區(qū)由多個(gè)Chunkmap組成,每個(gè) Chunkmap負(fù)責(zé)保存對應(yīng)一個(gè)版本快照的元數(shù)據(jù),Chunkmap的個(gè)數(shù)與快照版本的個(gè)數(shù)相 一致。Chunkmap中的元數(shù)據(jù)與數(shù)據(jù)區(qū)的數(shù)據(jù)相對應(yīng),通過元數(shù)據(jù)就可以確定數(shù)據(jù)區(qū)的數(shù) 據(jù)。數(shù)據(jù)區(qū)由多個(gè)數(shù)據(jù)塊組成,負(fù)責(zé)保存用戶的真正的數(shù)據(jù)。參閱圖2,是創(chuàng)建快照過程示意圖。具體如下
在卷的初始狀態(tài),當(dāng)前版本指針指向0號chunkmap,隨著用戶的使用,元數(shù)據(jù)保 存在0號chunkmap中。當(dāng)上層下發(fā)創(chuàng)建快照的命令時(shí),當(dāng)前版本指針移動(dòng),指向1號 chunkmap,而0號chunkmap的數(shù)據(jù)置為只讀。數(shù)據(jù)的寫請求不必暫停,繼續(xù)追加在數(shù) 據(jù)區(qū),快照命令下發(fā)后產(chǎn)生的元數(shù)據(jù)保存在1號chunkmap中。此時(shí),0號chunkmap中的數(shù)據(jù)就是0號版本。同理,當(dāng)再有快照命令下發(fā)時(shí),操作類似。參閱圖3,是追加寫方式處理寫請求示意圖。具體如下
為保證數(shù)據(jù)不會(huì)丟失且減少了尋道時(shí)間,零拷貝快照技術(shù)要求底層卷采用追加寫技 術(shù)代替了傳統(tǒng)覆蓋寫。具體算法是實(shí)時(shí)記錄當(dāng)前沒被使用的扇區(qū)號,每次進(jìn)行寫操作 時(shí),基地址加上記錄的扇區(qū)號,就是真正的偏移量。由此可以實(shí)現(xiàn)追加寫。參閱圖4,是版本切換示意圖。具體如下
當(dāng)前版本指針最初指向0號chunkmap,即對應(yīng)版本0的元數(shù)據(jù)。當(dāng)用戶要求進(jìn)行版 本切換時(shí),只需將對應(yīng)版本的chunkmap地址賦值給當(dāng)前版本指針,此時(shí)當(dāng)前版本指針的 位置即是目標(biāo)版本。該方法簡單易行,系統(tǒng)開銷極小。
權(quán)利要求
1.一種零拷貝快照方法,其特征在于第1、與現(xiàn)有的快照方法相比,不再有源數(shù)據(jù)卷和快照卷之分;磁盤布局分為元數(shù) 據(jù)區(qū)和數(shù)據(jù)區(qū),元數(shù)據(jù)區(qū)是一組chunkmap,每個(gè)chunkmap對應(yīng)一個(gè)版本的元數(shù)據(jù), chunkmap的數(shù)量與欲進(jìn)行快照的版本數(shù)相一致,數(shù)據(jù)區(qū)用于保存用戶的數(shù)據(jù); 第2、數(shù)據(jù)區(qū)處理寫請求方式采用追加寫的方式處理寫請求; 第3、創(chuàng)建快照的過程在初始狀態(tài)時(shí),當(dāng)前版本指針指向首個(gè)chunkmap;當(dāng)有創(chuàng) 建快照的請求到達(dá)時(shí),當(dāng)前版本指針指向下一個(gè)chunkmap,前一個(gè)chunkmap置為只讀, 前一個(gè)chunkmap里保存的元數(shù)據(jù)及對應(yīng)的數(shù)據(jù)即為最新快照版本;新的元數(shù)據(jù)保存在當(dāng) 前版本指針?biāo)鶎?yīng)的chunkmap中;第4、創(chuàng)建快照的用戶態(tài)接口 在Device Mapper用戶態(tài)的命令dmsetup里增加了新 的參數(shù)snap,用于表示采用零拷貝快照技術(shù)創(chuàng)建快照;第5、快照版本切換改變當(dāng)前版本指針位置,指向?qū)?yīng)的chunkmap; 第6、快照版本切換用戶態(tài)接口 在Device Mapper用戶態(tài)的命令dmsetup里增加了 新的參數(shù)rollbk,用于表示進(jìn)行快照版本切換;第7、元數(shù)據(jù)訪問當(dāng)前指針?biāo)傅腸hunkmap中的某一個(gè)塊如果沒被訪問過,表示 當(dāng)前狀態(tài)下,未對該塊數(shù)據(jù)進(jìn)行過更新,那么需要在歷史版本中找到對應(yīng)的最新數(shù)據(jù)。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于第2步所述的采用追加寫的方式處理數(shù)據(jù) 區(qū)的寫請求具體為實(shí)時(shí)記錄當(dāng)前未被使用的扇區(qū)號,每次進(jìn)行寫操作時(shí),基地址加上記錄的扇區(qū)號, 就是真正的偏移量,由此實(shí)現(xiàn)追加寫。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于第7步所述的元數(shù)據(jù)訪問具體為 在內(nèi)存中維護(hù)一個(gè)位向量,該向量中的每一位對應(yīng)Chunkmap中一片連續(xù)區(qū)域,每N位對應(yīng)同一位置數(shù)據(jù)的N個(gè)版本,N為Chunkmap數(shù);如果某一位為1,表示對應(yīng)版本的 Chunkmap中的數(shù)據(jù)被訪問過;為0,表示未訪問過;通過該位向量就可以確定chunkmap 中的某一塊是否有過數(shù)據(jù)更新;如果沒有過更新,則查找位向量,直到找到對應(yīng)位置為 1的位為止,那么相應(yīng)的數(shù)據(jù)就是最新版本的數(shù)據(jù)。
全文摘要
本發(fā)明屬于網(wǎng)絡(luò)存儲(chǔ)技術(shù)領(lǐng)域,公開了一種零拷貝快照方法,完全消除了源卷寫操作時(shí)數(shù)據(jù)的寫前拷貝,用初始化位圖的方法避免了快照元數(shù)據(jù)的拷貝。該方法沒有源數(shù)據(jù)卷和快照卷之分,采用追加寫的方式處理寫請求,創(chuàng)建快照時(shí)當(dāng)前的業(yè)務(wù)不必暫停,創(chuàng)建快照速度快,方法簡單,系統(tǒng)開銷小。
文檔編號G06F11/14GK102012853SQ20111000788
公開日2011年4月13日 申請日期2011年1月14日 優(yōu)先權(quán)日2011年1月14日
發(fā)明者劉曉光, 徐廣治, 曹瑞, 王剛, 甄彩軍, 高巖 申請人:南開大學(xué)