本發(fā)明涉及數(shù)據(jù)存儲(chǔ)技術(shù)領(lǐng)域,特別涉及一種更新反向映射元數(shù)據(jù)的方法及裝置。
背景技術(shù):
在大數(shù)據(jù)的背景下,數(shù)據(jù)存儲(chǔ)技術(shù)發(fā)展迅速。如今,為實(shí)現(xiàn)節(jié)省存儲(chǔ)空間的目的,一個(gè)數(shù)據(jù)塊在服務(wù)器中存儲(chǔ)一次即可,如果某些應(yīng)用需使用該數(shù)據(jù)塊,則不必重復(fù)存儲(chǔ),而是為這些應(yīng)用分配VLUN(Virtual LUN(Logical Unit Number,邏輯單元號(hào)),虛擬邏輯單元號(hào)),且VLUN的VLBA(Virtual LUN(Logical Unit Number,邏輯單元號(hào))Logic Block Address,虛擬邏輯區(qū)塊地址)上存儲(chǔ)該數(shù)據(jù)塊所在的PLBA(Physical LUN(Logical Unit Number,邏輯單元號(hào))Logic Block Address,物理邏輯區(qū)塊地址),使得VLBA可以引用數(shù)據(jù)塊。當(dāng)然,如果數(shù)據(jù)塊不再被引用,則需回收數(shù)據(jù)塊所在的存儲(chǔ)空間。因此,每次數(shù)據(jù)塊被引用時(shí),則添加一個(gè)PLBA到VLBA的反向映射元數(shù)據(jù),以標(biāo)志該數(shù)據(jù)塊處于被引用狀態(tài)。一旦檢測(cè)到不存在反向映射元數(shù)據(jù)對(duì)應(yīng)該P(yáng)LBA,則對(duì)PLBA所在的存儲(chǔ)區(qū)域進(jìn)行回收。當(dāng)然,隨著應(yīng)用對(duì)數(shù)據(jù)塊需求的變化,反向映射元數(shù)據(jù)可能會(huì)更新。
例如,對(duì)于服務(wù)器中已存儲(chǔ)的數(shù)據(jù)塊A,當(dāng)建立或取消VLBA到PLBA的引用關(guān)系時(shí),生成反向映射元數(shù)據(jù)的更新請(qǐng)求,進(jìn)而,服務(wù)器在系統(tǒng)日志中記錄該更新請(qǐng)求,再基于更新請(qǐng)求的標(biāo)識(shí),在緩存中更新反向映射元數(shù)據(jù)。如果該標(biāo)識(shí)指示添加反向映射元數(shù)據(jù),則將更新請(qǐng)求存儲(chǔ)至緩存中,如果該標(biāo)識(shí)指示刪除反向映射元數(shù)據(jù),則將緩存中具有相同反向映射元數(shù)據(jù)的更新請(qǐng)求刪除。需要說(shuō)明的是,對(duì)應(yīng)同一個(gè)PLBA的更新請(qǐng)求在緩存中有序存儲(chǔ)。
在實(shí)現(xiàn)本發(fā)明的過(guò)程中,發(fā)明人發(fā)現(xiàn)現(xiàn)有技術(shù)至少存在以下問(wèn)題:
由于對(duì)應(yīng)同一個(gè)PLBA的更新請(qǐng)求在緩存中有序存儲(chǔ),則每次更新反向映射元數(shù)據(jù)時(shí),如,在緩存中插入新的更新請(qǐng)求或者刪除舊的更新請(qǐng)求,緩存中更新請(qǐng)求的存儲(chǔ)位置均會(huì)重新調(diào)整,造成一定的時(shí)延,導(dǎo)致更新效率低。由于反向映射元數(shù)據(jù)的數(shù)據(jù)量大,則在緩存中存儲(chǔ)反向映射元數(shù)據(jù)會(huì)占用大量?jī)?nèi)存。
技術(shù)實(shí)現(xiàn)要素:
為了解決現(xiàn)有技術(shù)的問(wèn)題,本發(fā)明實(shí)施例提供了一種更新反向映射元數(shù)據(jù)的方法及裝置。所述技術(shù)方案如下:
第一方面,提供了一種更新反向映射元數(shù)據(jù)的方法,所述方法包括:
接收更新請(qǐng)求,所述更新請(qǐng)求用于指示添加或刪除反向映射元數(shù)據(jù);將所述更新請(qǐng)求存儲(chǔ)至系統(tǒng)日志;根據(jù)回收進(jìn)程的工作狀態(tài),判斷是否在所述緩存中更新所述反向映射元數(shù)據(jù);如果確定不在所述緩存中更新所述反向映射元數(shù)據(jù),則直到回收進(jìn)程啟動(dòng)之前,或所述系統(tǒng)日志已滿時(shí),將所述系統(tǒng)日志中所存儲(chǔ)的更新請(qǐng)求合并至指定存儲(chǔ)區(qū)域中的反向映射元數(shù)據(jù)。
其中,系統(tǒng)日志用于服務(wù)器存儲(chǔ)更新請(qǐng)求,在存儲(chǔ)時(shí),以保護(hù)反向映射元數(shù)據(jù)的完整性、安全性為目的,不會(huì)對(duì)更新請(qǐng)求做進(jìn)一步處理。
回收進(jìn)程是指服務(wù)器回收存儲(chǔ)區(qū)域的進(jìn)程,一般地,服務(wù)器可以在回收進(jìn)程中刪除沒(méi)有反向映射元數(shù)據(jù)對(duì)應(yīng)的存儲(chǔ)區(qū)域上的數(shù)據(jù)塊,從而回收該存儲(chǔ)區(qū)域。
回收進(jìn)程的工作狀態(tài)是指回收進(jìn)程是否啟動(dòng),或者回收進(jìn)程啟動(dòng)之后所達(dá)到的階段。
指定存儲(chǔ)區(qū)域是指與服務(wù)器連接的存儲(chǔ)區(qū)域,可用于存儲(chǔ)反向映射元數(shù)據(jù)即可,本發(fā)明對(duì)指定存儲(chǔ)區(qū)域不做具體限定。例如,指定存儲(chǔ)區(qū)域可以是SAN(Storage Area Network,存儲(chǔ)區(qū)域網(wǎng)絡(luò))、磁盤或NAS(Network Attached Storage,網(wǎng)絡(luò)附加存儲(chǔ))。一般地,指定存儲(chǔ)區(qū)域的存儲(chǔ)空間較大,還可以用于存儲(chǔ)服務(wù)器所需的各種數(shù)據(jù),如,本發(fā)明實(shí)施例涉及的數(shù)據(jù)塊及反向映射元數(shù)據(jù)。
本發(fā)明實(shí)施例中,服務(wù)器根據(jù)回收進(jìn)程的工作狀態(tài),判斷是否在所述緩存中更新所述反向映射元數(shù)據(jù),從而提供了不在緩存中更新反向映射元數(shù)據(jù)的方案,在回收進(jìn)程啟動(dòng)之前,從系統(tǒng)日志中已存儲(chǔ)的更新請(qǐng)求提取出反向映射元數(shù)據(jù),且合并至指定存儲(chǔ)區(qū)域上,以保證反向映射元數(shù)據(jù)的完整性。由于反向映射元數(shù)據(jù)更新頻繁,但是基本僅在回收進(jìn)程中使用,因此,本發(fā)明實(shí)施例對(duì)于多數(shù)更新反向映射元數(shù)據(jù)的過(guò)程可以減少時(shí)延,提高更新效率,且占用較少內(nèi)存。
在第一方面的第一種可能實(shí)現(xiàn)方式中,所述根據(jù)回收進(jìn)程的工作狀態(tài),判斷是否在所述緩存中更新所述反向映射元數(shù)據(jù)包括:
檢測(cè)是否啟動(dòng)所述回收進(jìn)程;
如果啟動(dòng)所述回收進(jìn)程,則判斷所述更新請(qǐng)求對(duì)應(yīng)的第一存儲(chǔ)區(qū)域是否處于所述回收進(jìn)程;
如果所述第一存儲(chǔ)區(qū)域處于所述回收進(jìn)程,則判斷所述緩存是否已滿;
如果所述緩存未滿,則確定在所述緩存中更新所述反向映射元數(shù)據(jù);或,
如果所述緩存已滿,則確定在所述緩存中更新所述反向映射元數(shù)據(jù),并刪除所述緩存中對(duì)應(yīng)于同一個(gè)第二存儲(chǔ)區(qū)域且占用緩存空間最大的更新請(qǐng)求,且將第二存儲(chǔ)區(qū)域從所述回收列表中移除。
在第一種可能實(shí)現(xiàn)方式中,在第一存儲(chǔ)區(qū)域處于回收進(jìn)程時(shí),服務(wù)器允許在緩存中更新反向映射元數(shù)據(jù),使得回收進(jìn)程中服務(wù)器可以從緩存中讀取到最新的更新請(qǐng)求,并基于最新的更新請(qǐng)求進(jìn)行回收,提高了回收準(zhǔn)確性。而且,在緩存已滿的情況下,提供了釋放緩存空間的方式,從而留出緩存的存儲(chǔ)資源,提高緩存的利用率。
在第一方面的第二種可能實(shí)現(xiàn)方式中,所述根據(jù)回收進(jìn)程的工作狀態(tài),判斷是否在所述緩存中更新所述反向映射元數(shù)據(jù)包括:
如果未啟動(dòng)所述回收進(jìn)程,則確定不在所述緩存中更新所述反向映射元數(shù)據(jù);或,
如果所述第一存儲(chǔ)區(qū)域未處于所述回收進(jìn)程,則確定不在所述緩存中更新所述反向映射元數(shù)據(jù);或,
如果所述緩存已滿,則確定不在所述緩存中更新所述反向映射元數(shù)據(jù),并刪除所述緩存中對(duì)應(yīng)所述第一存儲(chǔ)區(qū)域的更新請(qǐng)求,且將第一存儲(chǔ)區(qū)域從回收列表中移除,所述回收列表用于指示本次回收進(jìn)程中所要回收的存儲(chǔ)區(qū)域。
在第二種可能實(shí)現(xiàn)方式中,提供了多種用于判斷是否需要在緩存中更新該反向映射元數(shù)據(jù)的方式,基于回收進(jìn)程是否啟動(dòng)或第一存儲(chǔ)區(qū)域是否處于回收進(jìn)程等具體的運(yùn)行狀態(tài),來(lái)確定后續(xù)的具體實(shí)現(xiàn)方式,服務(wù)器未啟動(dòng)回收進(jìn)程,或者第一存儲(chǔ)區(qū)域未處于回收進(jìn)程,或者緩存已滿時(shí),由于反向映射元數(shù)據(jù)已在系統(tǒng)日志中存儲(chǔ)過(guò),不必在緩存中更新反向映射元數(shù)據(jù),解決了相關(guān)技術(shù)占用大量?jī)?nèi)存、時(shí)延高、更新效率低問(wèn)題。另外,該方式在緩存已滿時(shí)提供了釋放緩存空間的策略,從而留出更多的存儲(chǔ)資源,以提高緩存的利用率,進(jìn)一步提高服務(wù)器的讀寫效率。
在第一方面的第三種可能實(shí)現(xiàn)方式中,所述如果所述緩存未滿,則確定在所述緩存中更新所述更新請(qǐng)求之后,所述方法還包括:
判斷所述回收進(jìn)程的進(jìn)度;
如果所述回收進(jìn)程已完成從所述緩存及所述指定存儲(chǔ)區(qū)域中讀取對(duì)應(yīng)所述第一存儲(chǔ)區(qū)域的反向映射元數(shù)據(jù)的過(guò)程,且所述更新請(qǐng)求指示添加反向映射元數(shù)據(jù),則為所述第一存儲(chǔ)區(qū)域添加指定標(biāo)記,所述指定標(biāo)記用于指示在本次回收進(jìn)程中不回收被標(biāo)記的存儲(chǔ)區(qū)域。
在第三種可能實(shí)現(xiàn)方式中,如果回收進(jìn)程已完成從緩存及指定存儲(chǔ)區(qū)域中讀取對(duì)應(yīng)第一存儲(chǔ)區(qū)域的反向映射元數(shù)據(jù)的過(guò)程,說(shuō)明當(dāng)前所更新的反向映射元數(shù)據(jù)沒(méi)有在回收進(jìn)程中被讀取,此時(shí),為了避免第一存儲(chǔ)區(qū)域被誤刪,服務(wù)器為第一存儲(chǔ)區(qū)域添加指定標(biāo)記,從而提高回收的準(zhǔn)確性。
在第一方面的第四種可能實(shí)現(xiàn)方式中,所述方法還包括:
當(dāng)啟動(dòng)所述回收進(jìn)程時(shí),基于所述緩存及所述指定存儲(chǔ)區(qū)域中的反向映射元數(shù)據(jù)執(zhí)行所述回收進(jìn)程,所述回收進(jìn)程用于回收不具有指定標(biāo)記且不具有反向映射元數(shù)據(jù)的存儲(chǔ)區(qū)域;
當(dāng)本次回收進(jìn)程結(jié)束時(shí),刪除所述指定標(biāo)記及所述緩存中所有的反向映射元數(shù)據(jù);
其中,所述本次回收進(jìn)程完成對(duì)任一存儲(chǔ)區(qū)域的回收時(shí),刪除所述緩存中對(duì)應(yīng)所述任一存儲(chǔ)區(qū)域的反向映射元數(shù)據(jù)。
在第四種可能實(shí)現(xiàn)方式中,更新反向映射元數(shù)據(jù)時(shí),如果回收進(jìn)程也在進(jìn)行,則服務(wù)器在檢測(cè)到所要回收的存儲(chǔ)區(qū)域具有指定標(biāo)記時(shí),不對(duì)該存儲(chǔ)區(qū)域進(jìn)行回收,以保證當(dāng)前所更新的反向映射元數(shù)據(jù)、或者所刪除的反向映射元數(shù)據(jù)中的VLBA可以引用該存儲(chǔ)區(qū)域上的數(shù)據(jù)塊。而且,在回收進(jìn)程結(jié)束時(shí),服務(wù)器可以刪除指定標(biāo)記,使得該存儲(chǔ)區(qū)域在之后的回收進(jìn)程中可以被回收。另外,該方式提供了兩種釋放緩存空間的策略,從而留出更多的存儲(chǔ)資源,以提高緩存的利用率,進(jìn)一步提高服務(wù)器的讀寫效率。
第二方面,提供了一種服務(wù)器,該服務(wù)器包括:處理器、網(wǎng)絡(luò)接口、存儲(chǔ)器以及總線,存儲(chǔ)器與網(wǎng)絡(luò)接口分別通過(guò)總線與處理器相連;處理器被配置為執(zhí)行存儲(chǔ)器中存儲(chǔ)的指令;處理器通過(guò)執(zhí)行指令來(lái)實(shí)現(xiàn)上述第一方面或第一方面中任意一種可能的實(shí)現(xiàn)方式所提供的更新反向映射元數(shù)據(jù)的方法。
第三方面,提供了一種服務(wù)器,該服務(wù)器包括至少一個(gè)模塊,該至少一個(gè)模塊用于實(shí)現(xiàn)上述第一方面或第一方面中任意一種可能的實(shí)現(xiàn)方式所提供的更新反向映射元數(shù)據(jù)的方法。
上述第二方面和第三方面所獲得的技術(shù)效果與第一方面對(duì)應(yīng)的技術(shù)手段獲得的技術(shù)效果近似,在這里不再贅述。
附圖說(shuō)明
為了更清楚地說(shuō)明本發(fā)明實(shí)施例中的技術(shù)方案,下面將對(duì)實(shí)施例描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1是本發(fā)明實(shí)施例提供的一種服務(wù)器集群系統(tǒng)的組成圖;
圖2是本發(fā)明實(shí)施例提供的一種服務(wù)器的結(jié)構(gòu)示意圖;
圖3是本發(fā)明實(shí)施例提供的一種更新反向映射元數(shù)據(jù)的方法流程圖;
圖4是本發(fā)明實(shí)施例提供的一種回收方法流程圖;
圖5是本發(fā)明實(shí)施例提供的一種更新反向映射元數(shù)據(jù)的裝置結(jié)構(gòu)示意圖。
具體實(shí)施方式
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖對(duì)本發(fā)明實(shí)施方式作進(jìn)一步地詳細(xì)描述。
圖1是本發(fā)明實(shí)施例提供的一種服務(wù)器集群系統(tǒng)的組成圖。如圖1所示,該服務(wù)器集群系統(tǒng)通過(guò)網(wǎng)絡(luò)層與應(yīng)用客戶端或者存儲(chǔ)管理中心通信,所述服務(wù)器集群系統(tǒng)由服務(wù)器和網(wǎng)絡(luò)存儲(chǔ)節(jié)點(diǎn)(本實(shí)施例以SAN存儲(chǔ)設(shè)備為例)組成,服務(wù)器和網(wǎng)絡(luò)存儲(chǔ)節(jié)點(diǎn)均可以是一個(gè)或多個(gè),本實(shí)施例以2臺(tái)SAN存儲(chǔ)節(jié)點(diǎn)為例,每臺(tái)服務(wù)器的物理設(shè)備包含CPU、內(nèi)存、網(wǎng)絡(luò)和硬盤等,網(wǎng)絡(luò)存儲(chǔ)節(jié)點(diǎn)的物理設(shè)備包含存儲(chǔ)陣列和存儲(chǔ)陣列的控制器,本實(shí)施例將服務(wù)器的CPU和內(nèi)存等用于為接入所述服務(wù)器集群系統(tǒng)的應(yīng)用程序提供計(jì)算資源的物理設(shè)備統(tǒng)稱為所述服務(wù)器集群系統(tǒng)的計(jì)算資源,其為組成計(jì)算層的基礎(chǔ),將存儲(chǔ)資源層的服務(wù)器的硬盤和網(wǎng)絡(luò)存儲(chǔ)節(jié)點(diǎn)的存儲(chǔ)陣列統(tǒng)稱為所述服務(wù)器集群系統(tǒng)的存儲(chǔ)資源。
所述服務(wù)器集群用于對(duì)外將計(jì)算資源提供給不同的應(yīng)用程序使用,例如可以在所述服務(wù)器集群上運(yùn)行WEB應(yīng)用或者HADOOP分布式集群系統(tǒng)。所述服務(wù)器集群的計(jì)算資源還可以進(jìn)一步被抽象成多臺(tái)虛擬機(jī),在每臺(tái)虛擬機(jī)上運(yùn)行不同的應(yīng)用程序,或者多臺(tái)虛擬機(jī)組成虛擬機(jī)集群從而為同一個(gè)應(yīng)用程序提供服務(wù),本實(shí)施例對(duì)具體實(shí)現(xiàn)形式不拘一格。當(dāng)所述服務(wù)器集群上運(yùn)行應(yīng)用程序,所述應(yīng)用程序的相關(guān)數(shù)據(jù)可以存儲(chǔ)在所述服務(wù)器集群系統(tǒng)的存儲(chǔ)資源上,即存儲(chǔ)在服務(wù)器的硬盤上或者SAN節(jié)點(diǎn)的存儲(chǔ)陣列中,也可以同時(shí)存儲(chǔ)在服務(wù)器的硬盤和SAN節(jié)點(diǎn)的存儲(chǔ)陣列中。
所述服務(wù)器集群系統(tǒng)還運(yùn)行了分布式存儲(chǔ)控制器,所述分布式存儲(chǔ)控制器用于將服務(wù)器的硬盤和網(wǎng)絡(luò)存儲(chǔ)節(jié)點(diǎn)(如SAN)提供的存儲(chǔ)陣列的存儲(chǔ)資源劃分為多個(gè)存儲(chǔ)分區(qū),所述多個(gè)存儲(chǔ)分區(qū)組成所述服務(wù)器集群系統(tǒng)的共享存儲(chǔ)資源池,運(yùn)行在所述服務(wù)器集群上的應(yīng)用程序可以從所述共享存儲(chǔ)資源池中獲得分布的存儲(chǔ)資源塊并進(jìn)行使用,保證了存儲(chǔ)資源的較高的利用率和存儲(chǔ)的均勻分布,并由此提升了存儲(chǔ)資源的讀寫效率。在本發(fā)明實(shí)施例中所述分布式存儲(chǔ)控制器通過(guò)安裝在服務(wù)器的硬件設(shè)備上的軟件模塊來(lái)實(shí)現(xiàn),從而可以避免另外購(gòu)置硬件設(shè)備作為存儲(chǔ)控制設(shè)備的問(wèn)題,解決方案更加經(jīng)濟(jì)并節(jié)約成本。
本發(fā)明實(shí)施例所述分布式存儲(chǔ)控制器是對(duì)每臺(tái)服務(wù)器上運(yùn)行的存儲(chǔ)控制功能模塊的統(tǒng)稱,作為解決方案提供的分布式存儲(chǔ)控制器可以包含不同的功能模塊,而在實(shí)際部署的時(shí)候,每臺(tái)服務(wù)器根據(jù)其功能和部署策略可以運(yùn)行分布式存儲(chǔ)控制器的不同的功能模塊,也就是說(shuō),根據(jù)服務(wù)器集群的部署策略,可以在不同的服務(wù)器上運(yùn)行分布式存儲(chǔ)控制器的不同的功能模塊,每臺(tái)服務(wù)器可以運(yùn)行分布式存儲(chǔ)控制器所有的功能模塊,也可以運(yùn)行分布式存儲(chǔ)控制器部分的功能模塊。分布式存儲(chǔ)控制器主要用于:對(duì)所述服務(wù)器集群系統(tǒng)的計(jì)算資源提供數(shù)據(jù)訪問(wèn)的接口,以及對(duì)所述服務(wù)器集群系統(tǒng)的共享存儲(chǔ)資源進(jìn)行管理和讀寫控制。
需要說(shuō)明的是,本發(fā)明實(shí)施例提供的服務(wù)器可以為存儲(chǔ)系統(tǒng)中任一個(gè)用于進(jìn)行數(shù)據(jù)管理的服務(wù)器。圖2是本發(fā)明實(shí)施例提供的一種服務(wù)器的結(jié)構(gòu)示意圖,該服務(wù)器20包括:處理器22和網(wǎng)絡(luò)接口24。
處理器22包括一個(gè)或者一個(gè)以上處理核心。處理器22通過(guò)運(yùn)行軟件程序以及模塊,從而執(zhí)行下述更新反向映射元數(shù)據(jù)的方法所涉及的各種功能應(yīng)用以及數(shù)據(jù)處理。
網(wǎng)絡(luò)接口24可以為多個(gè),該網(wǎng)絡(luò)接口24用于與其它通信設(shè)備、業(yè)務(wù)終端或者網(wǎng)絡(luò)設(shè)備進(jìn)行通信。
在一種可能的實(shí)現(xiàn)方式中,服務(wù)器20還包括存儲(chǔ)器26、總線28等部件。其中,存儲(chǔ)器26與網(wǎng)絡(luò)接口24分別通過(guò)總線28與處理器22相連。
存儲(chǔ)器26可用于存儲(chǔ)軟件程序以及模塊。具體的,存儲(chǔ)器26可存儲(chǔ)操作系統(tǒng)262、至少一個(gè)功能所需的應(yīng)用程序模塊264。操作系統(tǒng)262可以是實(shí)時(shí)操作系統(tǒng)(Real Time Operating System,RTOS)、LINUX、UNIX、WINDOWS或OS X之類的操作系統(tǒng)。
圖3是本發(fā)明實(shí)施例提供的一種更新反向映射元數(shù)據(jù)的方法流程圖。參見(jiàn)圖3,該實(shí)施例應(yīng)用于服務(wù)器,并以SAN(Storage Area Network,存儲(chǔ)域網(wǎng)絡(luò))作為指定存儲(chǔ)區(qū)域?yàn)槔M(jìn)行說(shuō)明,事實(shí)上,指定存儲(chǔ)區(qū)域也可以是磁盤或NAS(Network Attached Storage,網(wǎng)絡(luò)附加存儲(chǔ))。該實(shí)施例具體步驟包括:
301、服務(wù)器接收更新請(qǐng)求,更新請(qǐng)求用于指示添加或刪除反向映射元數(shù)據(jù)。
在該步驟中,更新請(qǐng)求攜帶反向映射元數(shù)據(jù),且具有添加標(biāo)識(shí)或者刪除標(biāo)識(shí),添加標(biāo)識(shí)用于指示添加該反向映射元數(shù)據(jù),刪除標(biāo)識(shí)則用于指示刪除該反向映射元數(shù)據(jù)。其中,反向映射元數(shù)據(jù)用于描述一個(gè)數(shù)據(jù)塊所在的PLBA(Physical LUN Logic Block Address,物理邏輯區(qū)塊地址)到VLBA(Virtual LUN Logic Block Address,虛擬邏輯區(qū)塊地址)映射關(guān)系,顯然,反向映射元數(shù)據(jù)包括PLBA及VLBA。
由于應(yīng)用中對(duì)數(shù)據(jù)塊的需求可能隨時(shí)改變,一旦建立VLBA到PLBA引用的關(guān)系,或者取消VLBA到PLBA的引用關(guān)系,說(shuō)明PLBA所存儲(chǔ)的數(shù)據(jù)塊不再被VLBA對(duì)應(yīng)的應(yīng)用使用,此時(shí),生成更新請(qǐng)求,并觸發(fā)反向映射元數(shù)據(jù)的更新進(jìn)程。需要說(shuō)明的是,更新反向映射元數(shù)據(jù)的意義在于:如果某個(gè)數(shù)據(jù)塊被引用,則存在反向映射元數(shù)據(jù)對(duì)應(yīng)該數(shù)據(jù)塊所在的PLBA,使得回收進(jìn)程中不會(huì)刪除該數(shù)據(jù)塊,而是將數(shù)據(jù)塊復(fù)制到不被回收的存儲(chǔ)區(qū)域,再對(duì)原來(lái)PLBA所在的存儲(chǔ)區(qū)域進(jìn)行回收;如果某個(gè)數(shù)據(jù)塊不再被引用,則不存在反向映射元數(shù)據(jù)對(duì)應(yīng)該數(shù)據(jù)塊所在的PLBA,使得回收進(jìn)程中可以刪除該數(shù)據(jù)塊,回收PLBA所在的存儲(chǔ)區(qū)域。
302、服務(wù)器將更新請(qǐng)求存儲(chǔ)至系統(tǒng)日志。
一旦接收到更新請(qǐng)求,則服務(wù)器在系統(tǒng)日志進(jìn)行存儲(chǔ)。需要說(shuō)明的是,系統(tǒng)日志以保護(hù)反向映射元數(shù)據(jù)的完整性、安全性為目的,無(wú)論更新請(qǐng)求指示添加或刪除反向映射元數(shù)據(jù),系統(tǒng)日志均不對(duì)更新請(qǐng)求進(jìn)行進(jìn)一步處理。
303、服務(wù)器檢測(cè)是否啟動(dòng)回收進(jìn)程,如果是,執(zhí)行步驟304,如果否,執(zhí)行步驟306。
回收進(jìn)程是指回收存儲(chǔ)區(qū)域的進(jìn)程,用于刪除服務(wù)器中沒(méi)有被引用的數(shù)據(jù)塊,并回收這些數(shù)據(jù)塊占用的存儲(chǔ)資源。本發(fā)明實(shí)施例對(duì)回收進(jìn)程的觸發(fā)方式不做限定。
例如,周期性自動(dòng)啟動(dòng)回收進(jìn)程??梢栽诜?wù)器中存儲(chǔ)回收周期,并設(shè)置每次所要回收的存儲(chǔ)區(qū)域,使得服務(wù)器自動(dòng)完成回收進(jìn)程。例如,對(duì)邏輯單元號(hào)為L(zhǎng)UN1所對(duì)應(yīng)的存儲(chǔ)區(qū)域進(jìn)行回收,假設(shè)LUN1對(duì)應(yīng)的存儲(chǔ)區(qū)域的大小為2TB,劃分了210個(gè)大小均為2GB的存儲(chǔ)區(qū)域,設(shè)置回收周期為3天,則分4次回收這些存儲(chǔ)區(qū)域,每次回收28個(gè)存儲(chǔ)區(qū)域,12天可全范圍回收LUN1對(duì)應(yīng)的存儲(chǔ)區(qū)域。需要說(shuō)明的是,LUN對(duì)應(yīng)的是人為從SAN(Storage Area Network,存儲(chǔ)域網(wǎng)絡(luò))上劃分的一塊存儲(chǔ)區(qū)域,可用于存儲(chǔ)服務(wù)器中常用的數(shù)據(jù)塊。
另外,本發(fā)明實(shí)施例對(duì)回收進(jìn)程采用的回收時(shí)機(jī)不做限定。例如,對(duì)于上述舉例的觸發(fā)方式,可以在服務(wù)器中存儲(chǔ)回收列表,列表中的每個(gè)數(shù)據(jù)項(xiàng)至少包括所要回收的存儲(chǔ)區(qū)域的地址范圍。每次回收進(jìn)程啟動(dòng)時(shí),服務(wù)器基于回收列表中存儲(chǔ)區(qū)域的地址范圍,確定所要回收的存儲(chǔ)區(qū)域。
發(fā)明人認(rèn)識(shí)到,相關(guān)技術(shù)的回收進(jìn)程中,服務(wù)器鎖定一個(gè)存儲(chǔ)區(qū)域,對(duì)該存儲(chǔ)區(qū)域進(jìn)行回收,但回收過(guò)程中,不允許更新反向映射元數(shù)據(jù),當(dāng)該存儲(chǔ)區(qū)域回收完畢時(shí),才解鎖該存儲(chǔ)區(qū)域,再進(jìn)行下一個(gè)存儲(chǔ)區(qū)域的回收,導(dǎo)致回收進(jìn)程中服務(wù)器的并發(fā)處理能力差,也降低了反向映射元數(shù)據(jù)的更新效率。
為克服相關(guān)技術(shù)的問(wèn)題,本發(fā)明實(shí)施例中服務(wù)器支持更新進(jìn)程與回收進(jìn)程并發(fā)進(jìn)行。但是,考慮到回收進(jìn)程的工作狀態(tài)與更新過(guò)程會(huì)相互影響,因此,在本步驟中,服務(wù)器檢測(cè)回收進(jìn)程是否已經(jīng)啟動(dòng),以判斷后續(xù)的更新如何進(jìn)行。本發(fā)明實(shí)施例對(duì)檢測(cè)的方式不做限定。例如,服務(wù)器查詢回收進(jìn)程的標(biāo)志位,如果該標(biāo)志位為1,則確定當(dāng)前啟動(dòng)了回收進(jìn)程;如果該標(biāo)志位為0,則確定當(dāng)前未啟動(dòng)回收進(jìn)程。
304、如果啟動(dòng)回收進(jìn)程,則服務(wù)器判斷更新請(qǐng)求對(duì)應(yīng)的第一存儲(chǔ)區(qū)域是否處于回收進(jìn)程,如果是,執(zhí)行步驟305,如果否,執(zhí)行步驟306。
第一存儲(chǔ)區(qū)域是指更新請(qǐng)求攜帶的PLBA所在的一塊存儲(chǔ)區(qū)域。本發(fā)明實(shí)施例對(duì)第一存儲(chǔ)區(qū)域不做進(jìn)一步限定。例如,LUN2對(duì)應(yīng)的存儲(chǔ)區(qū)域上存儲(chǔ)服務(wù)器常用的數(shù)據(jù)塊,LUN2對(duì)應(yīng)的存儲(chǔ)區(qū)域的大小為2TB,第一存儲(chǔ)區(qū)域所占據(jù)的大小為1GB,地址范圍可以為L(zhǎng)UN2的0~233-1比特。
本發(fā)明實(shí)施例涉及的緩存用于存儲(chǔ)更新請(qǐng)求。需要說(shuō)明的是,對(duì)應(yīng)同一個(gè)PLBA的更新請(qǐng)求在緩存中有序存儲(chǔ),如果添加或刪除更新請(qǐng)求,則緩存中更新請(qǐng)求的存儲(chǔ)位置均會(huì)調(diào)整。本發(fā)明實(shí)施例對(duì)該存儲(chǔ)形式不做具體限定。例如,在緩存中以數(shù)組的形式存儲(chǔ)更新請(qǐng)求,對(duì)應(yīng)相同PLBA的更新請(qǐng)求歸為同一個(gè)數(shù)組。
當(dāng)然,本發(fā)明實(shí)施例對(duì)判斷第一存儲(chǔ)區(qū)域是否處于回收進(jìn)程的方式不做限定。例如,如果回收進(jìn)程是基于回收列表進(jìn)行回收,則服務(wù)器查詢?cè)摰谝淮鎯?chǔ)區(qū)域是否屬于該回收列表,如果查詢到第一存儲(chǔ)區(qū)域的地址范圍在回收列表所要回收的存儲(chǔ)區(qū)域的地址范圍內(nèi),則確定第一存儲(chǔ)區(qū)域處于回收進(jìn)程,進(jìn)一步地,可以執(zhí)行步驟305。
305、如果第一存儲(chǔ)區(qū)域處于回收進(jìn)程,則服務(wù)器判斷緩存是否已滿,如果否,則服務(wù)器確定在緩存中更新反向映射元數(shù)據(jù);如果是,則服務(wù)器確定在緩存中更新反向映射元數(shù)據(jù),并刪除緩存中對(duì)應(yīng)于同一個(gè)第二存儲(chǔ)區(qū)域且占用緩存空間最大的更新請(qǐng)求,且將第二存儲(chǔ)區(qū)域從回收列表中移除,或,服務(wù)器確定不在緩存中更新反向映射元數(shù)據(jù),并刪除緩存中對(duì)應(yīng)第一存儲(chǔ)區(qū)域的更新請(qǐng)求,且將第一存儲(chǔ)區(qū)域從回收列表中移除,回收列表用于指示本次回收進(jìn)程中所要回收的存儲(chǔ)區(qū)域。
如果更新請(qǐng)求對(duì)應(yīng)的第一存儲(chǔ)區(qū)域是否處于回收進(jìn)程,則服務(wù)器判斷緩存是否已滿,若查詢到可用的存儲(chǔ)位置,即緩存未滿時(shí),直接在緩存中進(jìn)行更新即可;若未查詢到可用的存儲(chǔ)位置,即緩存已滿時(shí),可以以至少兩種方式釋放緩存空間。
需要說(shuō)明的是,SAN是服務(wù)器所連接的存儲(chǔ)區(qū)域。本發(fā)明實(shí)施例是在回收進(jìn)程啟動(dòng)之前將系統(tǒng)日志中的反向映射元數(shù)據(jù)進(jìn)合并至SAN。在本步驟中,如果檢測(cè)到當(dāng)前啟動(dòng)了回收進(jìn)程,說(shuō)明在回收進(jìn)程與反向映射元數(shù)據(jù)的更新過(guò)程并發(fā)進(jìn)行,進(jìn)而表明該更新請(qǐng)求沒(méi)有被合并至SAN。為了提高回收的準(zhǔn)確性,使得回程進(jìn)程可以從緩存中讀取到最新的更新請(qǐng)求,則在上述緩存未滿的情況下,服務(wù)器在緩存中更新反向映射元數(shù)據(jù)。
考慮到更新請(qǐng)求可能是指示添加反向元數(shù)據(jù),也可能是刪除反向映射元數(shù)據(jù),因此,本發(fā)明實(shí)施例對(duì)以上兩種在緩存中更新反向映射元數(shù)據(jù)的情況分別進(jìn)行說(shuō)明。
第一種情況、更新請(qǐng)求指示添加反向映射元數(shù)據(jù)。
此時(shí),發(fā)明人認(rèn)識(shí)到,添加的反向映射元數(shù)據(jù)沒(méi)有被合并至SAN,從而不能在回收進(jìn)程中被讀取,如果除了該新添加的反向映射元數(shù)據(jù),回收進(jìn)程所讀取的反向映射元數(shù)據(jù)中,已經(jīng)沒(méi)有任何反向映射元數(shù)據(jù)對(duì)應(yīng)該第一存儲(chǔ)區(qū)域,則回收進(jìn)程對(duì)第一存儲(chǔ)區(qū)域進(jìn)行回收,會(huì)導(dǎo)致添加的反向映射元數(shù)據(jù)中的VLBA不能引用該第一存儲(chǔ)區(qū)域原有的數(shù)據(jù)塊。
因此,為了避免以上情況,從而提高回收的準(zhǔn)確性,本發(fā)明實(shí)施例將更新請(qǐng)求添加到緩存中對(duì)應(yīng)該P(yáng)LBA的存儲(chǔ)位置,完成緩存中反向映射元數(shù)據(jù)的更新。對(duì)于回收進(jìn)程來(lái)說(shuō),服務(wù)器可以在回收進(jìn)程啟動(dòng)后,從緩存中讀取到更新請(qǐng)求攜帶的反向映射元數(shù)據(jù),從而不會(huì)刪除第一存儲(chǔ)區(qū)域中的數(shù)據(jù)塊,使得數(shù)據(jù)塊仍然可以被引用。
第二種情況、更新請(qǐng)求指示刪除反向映射元數(shù)據(jù)。
此時(shí),發(fā)明人認(rèn)識(shí)到,所要?jiǎng)h除的反向映射元數(shù)據(jù)在回收進(jìn)程啟動(dòng)前已由系統(tǒng)日志合并至SAN中,從而會(huì)在回收進(jìn)程中被讀取,如果除了所要?jiǎng)h除的反向映射元數(shù)據(jù)對(duì)應(yīng)該第一存儲(chǔ)區(qū)域,回收進(jìn)程所讀取的反向映射元數(shù)據(jù)中,沒(méi)有任何反向映射元數(shù)據(jù)對(duì)應(yīng)第一存儲(chǔ)區(qū)域,則回收進(jìn)程不會(huì)對(duì)第一存儲(chǔ)區(qū)域進(jìn)行回收。然而,由于該反向映射元數(shù)據(jù)應(yīng)被刪除,說(shuō)明反向映射元數(shù)據(jù)中VLBA已經(jīng)不再引用第一存儲(chǔ)區(qū)域的數(shù)據(jù)塊。
因此,為了避免以上情況,從而提高回收效率,在第二種情況中,服務(wù)器基于更新請(qǐng)求攜帶的PLBA及VLBA,在緩存中對(duì)應(yīng)該P(yáng)LBA的存儲(chǔ)位置查找是否存在攜帶該VLBA的更新請(qǐng)求,如果是,則在緩存中刪除原有的更新請(qǐng)求,使得本次回收進(jìn)程可以對(duì)更新請(qǐng)求對(duì)應(yīng)的存儲(chǔ)區(qū)域進(jìn)行回收;如果否,說(shuō)明原有的反向映射元數(shù)據(jù)已合并至SAN上,則在緩存中添加該更新請(qǐng)求,使得在回收進(jìn)程進(jìn)行到合并SAN及緩存中的反向映射元數(shù)據(jù)時(shí),可以將原有的反向映射元數(shù)據(jù)刪除,從而在本次回收進(jìn)程可以對(duì)更新請(qǐng)求對(duì)應(yīng)的存儲(chǔ)區(qū)域進(jìn)行回收。
對(duì)于回收進(jìn)程來(lái)說(shuō),服務(wù)器可以在回收進(jìn)程啟動(dòng)后,從緩存中讀取到指示刪除該反向映射元數(shù)據(jù)的更新請(qǐng)求,進(jìn)而將第一存儲(chǔ)區(qū)域中的數(shù)據(jù)塊刪除;或者,服務(wù)器從緩存及SAN上均不會(huì)讀取到添加該反向映射元數(shù)據(jù)的更新請(qǐng)求,使得不具有任何反向映射元數(shù)據(jù)的數(shù)據(jù)塊可以被刪除。
為了充分釋放緩存空間,留出更多的存儲(chǔ)資源,以提高緩存的利用率,在緩存已滿時(shí),本發(fā)明實(shí)施例至少提供以下兩種釋放緩存空間的策略:
305A、如果緩存已滿,則服務(wù)器確定不在緩存中更新反向映射元數(shù)據(jù),并刪除緩存中對(duì)應(yīng)第一存儲(chǔ)區(qū)域的更新請(qǐng)求,且將第一存儲(chǔ)區(qū)域從回收列表中移除,回收列表用于指示本次回收進(jìn)程中所要回收的存儲(chǔ)區(qū)域。
在緩存已滿的情況下,為了釋放緩存空間,服務(wù)器刪除對(duì)應(yīng)于第一存儲(chǔ)區(qū)域原有的更新請(qǐng)求。當(dāng)然,為了避免刪除這些更新請(qǐng)求后,在回收進(jìn)程中誤刪第一存儲(chǔ)區(qū)域的數(shù)據(jù)塊,則將第一存儲(chǔ)區(qū)域從回收列表中移除,使得本次回收進(jìn)程不會(huì)回收第一存儲(chǔ)區(qū)域,也不會(huì)刪除第一存儲(chǔ)區(qū)域上的數(shù)據(jù)塊。
需要說(shuō)明的是,如果服務(wù)器執(zhí)行該步驟305A,則后續(xù)也可以執(zhí)行步驟306。另外,這種釋放緩存空間的方式不必在緩存中更新反向映射元數(shù)據(jù),則該方式與本實(shí)施例的其他步驟結(jié)合后,也可以解決現(xiàn)有技術(shù)在緩存中更新所帶來(lái)的時(shí)延問(wèn)題及占用內(nèi)存多的問(wèn)題。
305B、如果緩存已滿,則服務(wù)器確定在緩存中更新反向映射元數(shù)據(jù),并刪除緩存中對(duì)應(yīng)于同一個(gè)第二存儲(chǔ)區(qū)域且占用緩存空間最大的更新請(qǐng)求,且將第二存儲(chǔ)區(qū)域從回收列表中移除。
為了一次性釋放更多的緩存空間,并且能留出存儲(chǔ)資源以更新反向映射元數(shù)據(jù),服務(wù)器計(jì)算緩存中對(duì)應(yīng)同一個(gè)PLBA的更新請(qǐng)求所占用的存儲(chǔ)空間,如果確定某些更新請(qǐng)求所占用的存儲(chǔ)空間最大,則刪除這些對(duì)應(yīng)于同一個(gè)PLBA的更新請(qǐng)求,從而騰出緩存空間。當(dāng)然,為了避免刪除這些更新請(qǐng)求后,在回收進(jìn)程中誤刪第二存儲(chǔ)區(qū)域的數(shù)據(jù)塊,則為將第二存儲(chǔ)區(qū)域從回收列表中移除,使得本次回收進(jìn)程不會(huì)回收第二存儲(chǔ)區(qū)域,也不會(huì)刪除第二存儲(chǔ)區(qū)域上的數(shù)據(jù)塊。在該步驟305B中,服務(wù)在緩存中更新反向映射元數(shù)據(jù)的情況可參考本步驟305已說(shuō)明的兩種情況,此處不再贅述。
在該步驟中,如果第一存儲(chǔ)區(qū)域處于回收進(jìn)程,則確定在緩存中對(duì)更新請(qǐng)求進(jìn)行更新之后,如果回收進(jìn)程已完成從緩存及SAN中讀取對(duì)應(yīng)第一存儲(chǔ)區(qū)域的反向映射元數(shù)據(jù)的過(guò)程,說(shuō)明該更新請(qǐng)求仍然沒(méi)有在回收進(jìn)程中被讀取,如果更新請(qǐng)求指示添加反向映射元數(shù)據(jù),則為了避免回收進(jìn)程將第一存儲(chǔ)區(qū)域的數(shù)據(jù)塊刪除,導(dǎo)致反向映射元數(shù)據(jù)中的VLBA不能引用該數(shù)據(jù)塊,提出以下解決方案:服務(wù)器判斷回收進(jìn)程的進(jìn)度;如果回收進(jìn)程已完成從所述緩存及所述SAN中讀取對(duì)應(yīng)所述第一存儲(chǔ)區(qū)域的反向映射元數(shù)據(jù)的過(guò)程,且更新請(qǐng)求指示添加反向映射元數(shù)據(jù),則為第一存儲(chǔ)區(qū)域添加指定標(biāo)記。
306、如果未啟動(dòng)回收進(jìn)程,或如果第一存儲(chǔ)區(qū)域未處于回收進(jìn)程,則服務(wù)器確定不在緩存中更新反向映射元數(shù)據(jù)。
發(fā)明人認(rèn)識(shí)到,相關(guān)技術(shù)中,每次反向映射元數(shù)據(jù)的更新過(guò)程均會(huì)在緩存中進(jìn)行,而緩存中更新請(qǐng)求的存儲(chǔ)位置會(huì)重新調(diào)整,造成一定的時(shí)延,導(dǎo)致更新效率低,由于反向映射元數(shù)據(jù)的數(shù)據(jù)量大,則在緩存中存儲(chǔ)反向映射元數(shù)據(jù)會(huì)占用大量?jī)?nèi)存。
為解決上述問(wèn)題,本發(fā)明實(shí)施例提供不在緩存中更新反向映射元數(shù)據(jù)的解決方案,即如果回收進(jìn)程未啟動(dòng),或者,此時(shí)的更新請(qǐng)求對(duì)應(yīng)的存儲(chǔ)區(qū)域未處于回收進(jìn)程,則服務(wù)器不必在緩存中更新反向映射元數(shù)據(jù)。當(dāng)然,這并不會(huì)影響隨后的回收進(jìn)程,因?yàn)榉聪蛴成湓獢?shù)已經(jīng)在步驟302中在系統(tǒng)日志中進(jìn)行了全面的記錄,使得在回收進(jìn)程啟動(dòng)之前,讀取出系統(tǒng)日志中的反向映射元數(shù)據(jù)即可。
307、如果確定不在緩存中更新反向映射元數(shù)據(jù),則服務(wù)器直到回收進(jìn)程啟動(dòng)之前,或系統(tǒng)日志已滿時(shí),將系統(tǒng)日志中所存儲(chǔ)的更新請(qǐng)求合并至存儲(chǔ)區(qū)域網(wǎng)絡(luò)SAN中的反向映射元數(shù)據(jù)。
本發(fā)明實(shí)施中,鑒于反向映射元數(shù)據(jù)平時(shí)僅需進(jìn)行更新,基本僅在回收進(jìn)程中需要讀取,提供了不在緩存中更新反向映射元數(shù)據(jù)的方案。事實(shí)上,雖然系統(tǒng)日志的存儲(chǔ)空間很大,但總是會(huì)滿,則當(dāng)系統(tǒng)日志已滿時(shí),將其所存儲(chǔ)的反向映射元數(shù)據(jù)合并至存儲(chǔ)空間更大的SAN上長(zhǎng)期、有序地存儲(chǔ),以便于回收進(jìn)程進(jìn)行讀取;或者,為了使得回收進(jìn)程啟動(dòng)時(shí),能讀取到系統(tǒng)日志所存儲(chǔ)的、還未合并至SAN上反向映射元數(shù)據(jù),在回收進(jìn)程啟動(dòng)之前,整理系統(tǒng)日志所存儲(chǔ)的更新請(qǐng)求,從中提取反向映射元數(shù)據(jù),再合并至SAN上。此時(shí),系統(tǒng)日志中原有的反向映射元數(shù)據(jù)已備份至SAN上,則系統(tǒng)日志可以被清空,以釋放存儲(chǔ)空間。
另外,上述合并過(guò)程發(fā)生在回收進(jìn)程啟動(dòng)之前,也即是,在回收進(jìn)程將啟動(dòng)時(shí),服務(wù)器先進(jìn)行該合并過(guò)程。本發(fā)明實(shí)施對(duì)實(shí)現(xiàn)這種時(shí)序的方式不做限定。例如,在服務(wù)器中進(jìn)行設(shè)置時(shí)序,當(dāng)觸發(fā)回收進(jìn)程時(shí),首先進(jìn)行該合并過(guò)程,再啟動(dòng)回收進(jìn)程。
需要說(shuō)明的是,本步驟以不在緩存中更新反向映射元數(shù)據(jù)的情況為例,說(shuō)明了后續(xù)反向映射元數(shù)據(jù)在SAN中進(jìn)行更新的過(guò)程。事實(shí)上,無(wú)論反向映射元數(shù)據(jù)是否在緩存中進(jìn)行更新,一旦系統(tǒng)日志已滿或者回收進(jìn)程啟動(dòng)之前,均要將系統(tǒng)日志中的反向映射元數(shù)據(jù)合并至SAN,以確保系統(tǒng)日志能夠繼續(xù)存儲(chǔ)新的更新請(qǐng)求,且服務(wù)器在回收進(jìn)程中可以確定所要回收的存儲(chǔ)區(qū)域。
另外,還要說(shuō)明的是,本發(fā)明實(shí)施例是以反向映射元數(shù)據(jù)的更新過(guò)程為例進(jìn)行說(shuō)明,事實(shí)上,如果存在一類數(shù)據(jù)也具有反向映射元數(shù)據(jù)的兩個(gè)特點(diǎn),1、更新頻繁;2、使用頻率較低。即寫入頻繁,但很少被讀取的數(shù)據(jù)也可以運(yùn)用本發(fā)明實(shí)施例所示的方案進(jìn)行更新。
相關(guān)技術(shù)中,由于對(duì)應(yīng)同一個(gè)PLBA的更新請(qǐng)求在緩存中有序存儲(chǔ),則每次更新反向映射元數(shù)據(jù)時(shí),如,在緩存中插入新的更新請(qǐng)求或者刪除舊的更新請(qǐng)求,緩存中更新請(qǐng)求的存儲(chǔ)位置均會(huì)重新調(diào)整,造成一定的時(shí)延,由于反向映射元數(shù)據(jù)的數(shù)據(jù)量大,則在緩存中存儲(chǔ)反向映射元數(shù)據(jù)會(huì)占用大量?jī)?nèi)存。
本發(fā)明實(shí)施例中,根據(jù)回收進(jìn)程的工作狀態(tài),判斷是否在所述緩存中更新所述反向映射元數(shù)據(jù),提供不在緩存中更新反向映射元數(shù)據(jù)的方案,在回收進(jìn)程啟動(dòng)之前,從系統(tǒng)日志中已存儲(chǔ)的更新請(qǐng)求提取出反向映射元數(shù)據(jù),且合并至SAN上,以保證反向映射元數(shù)據(jù)的完整性。由于反向映射元數(shù)據(jù)更新頻繁,但是基本僅在回收進(jìn)程中使用,因此,本發(fā)明實(shí)施例對(duì)于多數(shù)更新反向映射元數(shù)據(jù)的過(guò)程可以減少時(shí)延,提高更新效率,并且占用較少內(nèi)存。
另外,在相關(guān)技術(shù)中,對(duì)于緩存已滿的情況,服務(wù)器將SAN中原有的大量反向映射元數(shù)據(jù)與緩存中的反向映射元數(shù)據(jù)合并,將合并后的反向映射元數(shù)據(jù)重新寫入SAN,由于緩存中的反向映射元數(shù)據(jù)遠(yuǎn)少于SAN中的反向映射元數(shù)據(jù),導(dǎo)致實(shí)際寫入SAN的反向映射元數(shù)據(jù)遠(yuǎn)大于需要寫入的反向映射元數(shù)據(jù),造成了嚴(yán)重的寫入放大的問(wèn)題。
本發(fā)明實(shí)施例在緩存已滿時(shí),無(wú)需將緩存中的反向映射元數(shù)據(jù)合并至SAN,不存在由緩存所導(dǎo)致的寫入放大問(wèn)題。而且,本發(fā)明實(shí)施例提供釋放緩存空間的策略,以留出緩存的存儲(chǔ)資源,提高緩存的利用率,進(jìn)一步提高服務(wù)器的讀寫效率。需要說(shuō)明的是,雖然系統(tǒng)日志滿時(shí),服務(wù)器將系統(tǒng)日志中的反向映射元數(shù)據(jù)合并至SAN,但是由于系統(tǒng)日志存儲(chǔ)空間很大,因此合并時(shí)實(shí)際寫入SAN的反向映射元數(shù)據(jù)與需要寫入的反向映射元數(shù)據(jù)并不會(huì)相差很多,相比現(xiàn)有技術(shù)很大程度上弱化了寫入放大的問(wèn)題。
另外,本發(fā)明實(shí)施例支持反向映射元數(shù)據(jù)的更新過(guò)程與回收進(jìn)程并發(fā)進(jìn)行,提高了服務(wù)器的并發(fā)處理能力;而且,回收進(jìn)程支持多個(gè)存儲(chǔ)區(qū)域同時(shí)進(jìn)行回收,增加了回收效率,也不會(huì)延遲反向映射元數(shù)據(jù)的更新效率。
本發(fā)明實(shí)施例支持上述實(shí)施例的更新過(guò)程與回收進(jìn)程同時(shí)進(jìn)行。為了更具體地體現(xiàn)本發(fā)明實(shí)施例所示的更新過(guò)程為回收進(jìn)程帶來(lái)的影響,本發(fā)明實(shí)施例以回收進(jìn)程這一側(cè)展開說(shuō)明。圖4是本發(fā)明實(shí)施例提供的一種回收方法流程圖。參見(jiàn)圖4,該實(shí)施例應(yīng)用于服務(wù)器,且基于圖3所示實(shí)施例以SAN作為指定存儲(chǔ)區(qū)域?yàn)槔M(jìn)行說(shuō)明,具體步驟包括:
400、回收進(jìn)程啟動(dòng)之前,服務(wù)器將系統(tǒng)日志中所存儲(chǔ)的更新請(qǐng)求合并至存儲(chǔ)區(qū)域網(wǎng)絡(luò)SAN中的反向映射元數(shù)據(jù)。
該步驟在圖3所示實(shí)施例的步驟307已做出說(shuō)明,不再贅述。
401、當(dāng)啟動(dòng)回收進(jìn)程時(shí),服務(wù)器讀取回收列表,回收列表用于指示回收進(jìn)程所要回收的存儲(chǔ)區(qū)域。
需要說(shuō)明的是,回收列表是指示所要回收的存儲(chǔ)區(qū)域的一種方式,在圖3所示實(shí)施例的步驟304已做出說(shuō)明。事實(shí)上,每次所要回收的存儲(chǔ)區(qū)域也可以是以地址段的方式記錄于服務(wù)器中,使得服務(wù)器每次對(duì)該次地址段范圍內(nèi)的存儲(chǔ)區(qū)域進(jìn)行回收。
402、基于回收列表,服務(wù)器讀取SAN及緩存中的反向映射元數(shù)據(jù)。
基于圖3所示實(shí)施例可知,反向映射元數(shù)據(jù)可能存儲(chǔ)于SAN上,也可能在回收進(jìn)程進(jìn)行時(shí)存儲(chǔ)于緩存中,因此,為了所讀取的反向映射元數(shù)據(jù)更全面,回收的準(zhǔn)確性更高,服務(wù)器讀取SAN及緩存中所有的反向映射元數(shù)據(jù)。
在該步驟中,服務(wù)器從回收列表中確定所要回收的存儲(chǔ)區(qū)域。在緩存中,對(duì)應(yīng)同一個(gè)PLBA的更新請(qǐng)求在緩存中有序存儲(chǔ),則服務(wù)器查詢對(duì)應(yīng)于這些存儲(chǔ)區(qū)域內(nèi)的PLBA的更新請(qǐng)求,再?gòu)乃樵兊母抡?qǐng)求中提取出反向映射元數(shù)據(jù)、刪除標(biāo)識(shí)或者添加標(biāo)識(shí)。在SAN中,對(duì)應(yīng)同一個(gè)PLBA的反向映射元數(shù)據(jù)有序存儲(chǔ),服務(wù)器直接讀取屬于這些存儲(chǔ)區(qū)域內(nèi)的PLBA的反向映射元數(shù)據(jù)。
403、服務(wù)器合并所讀取的反向映射元數(shù)據(jù)。
基于上述步驟402,進(jìn)一步地,服務(wù)器將從SAN及緩存中所讀取的反向映射元數(shù)據(jù)進(jìn)行合并,如果存在兩個(gè)相同的反向映射元數(shù)據(jù),且一個(gè)反向映射元數(shù)據(jù)具有刪除標(biāo)識(shí),另一個(gè)具有添加標(biāo)識(shí),則服務(wù)器確定不存在該反向映射元數(shù)據(jù),從而可能回收該反向映射元數(shù)據(jù)對(duì)應(yīng)的存儲(chǔ)區(qū)域;如果一個(gè)反向映射元數(shù)據(jù)與其他反向映射元數(shù)據(jù)均不同,則服務(wù)器確定不回收反向映射元數(shù)據(jù)對(duì)應(yīng)的存儲(chǔ)區(qū)域。
404、服務(wù)器將合并后的反向映射元數(shù)據(jù)對(duì)應(yīng)的存儲(chǔ)區(qū)域內(nèi)的數(shù)據(jù)塊復(fù)制到第三存儲(chǔ)區(qū)域,第三存儲(chǔ)區(qū)域是指不在回收列表中的存儲(chǔ)區(qū)域。
當(dāng)然,本發(fā)明實(shí)施例對(duì)第三存儲(chǔ)區(qū)域不做具體限定。例如,如果第一存儲(chǔ)區(qū)域是指邏輯單元號(hào)為L(zhǎng)UN1的存儲(chǔ)區(qū)域,則第三存儲(chǔ)區(qū)域可以是邏輯單元號(hào)為L(zhǎng)UN2的存儲(chǔ)區(qū)域。
本發(fā)明實(shí)施例中,回收進(jìn)程是針對(duì)于所要回收的存儲(chǔ)區(qū)域進(jìn)行。當(dāng)然,存在一種情況:所要回收的存儲(chǔ)區(qū)域的數(shù)據(jù)塊仍然被引用,也即是,存在反向映射元數(shù)據(jù)指向的PLBA位于所要回收的存儲(chǔ)區(qū)域內(nèi)。因此,在回收這些存儲(chǔ)區(qū)域時(shí),將合并后的反向映射元數(shù)據(jù)對(duì)應(yīng)的存儲(chǔ)區(qū)域內(nèi)的數(shù)據(jù)塊復(fù)制到第三存儲(chǔ)區(qū)域,避免這些數(shù)據(jù)塊被誤刪。
405、基于合并后的反向映射元數(shù)據(jù),服務(wù)器將VLBA所指向的PLBA修改為第三存儲(chǔ)區(qū)域的PLBA,并觸發(fā)反向映射元數(shù)據(jù)的更新過(guò)程。
當(dāng)然,將數(shù)據(jù)塊復(fù)制到第三存儲(chǔ)區(qū)域后,為了使得合并后的反向映射元數(shù)據(jù)中的VLBA還能引用該數(shù)據(jù)塊,要將VLBA原來(lái)指向的PLBA修改為第三存儲(chǔ)區(qū)域的PLBA,此時(shí),會(huì)觸發(fā)反向映射元數(shù)據(jù)的更新過(guò)程,即添加新的反向映射元數(shù)據(jù)(第三存儲(chǔ)區(qū)域內(nèi)的PLBA指向VLBA),并將原來(lái)的反向映射元數(shù)據(jù)(第一存儲(chǔ)區(qū)域內(nèi)的PLBA指向VLBA)刪除。由于該更新過(guò)程是在回收進(jìn)程中,則根據(jù)圖3所示實(shí)施例,服務(wù)器將具有刪除標(biāo)識(shí)的更新請(qǐng)求添加到緩存中。
406、服務(wù)器回收該回收列表中不具有指定標(biāo)記且不具有反向映射元數(shù)據(jù)的存儲(chǔ)區(qū)域。
基于上述步驟405的更新過(guò)程,為了確定當(dāng)前所要回收的存儲(chǔ)區(qū)域上的數(shù)據(jù)塊已經(jīng)不再被任何VLBA引用,則服務(wù)器再次讀取緩存及SAN中的反向映射元數(shù)據(jù),且進(jìn)行合并,也即是,從緩存中讀取到的具有刪除標(biāo)識(shí)的反向映射元數(shù)據(jù)、以及從SAN讀取到的反向映射元數(shù)據(jù)進(jìn)行合并,合并結(jié)果為不存在該反向映射元數(shù)據(jù)。此時(shí),服務(wù)器可以對(duì)回收列表中不具有反向映射元數(shù)據(jù)的存儲(chǔ)區(qū)域進(jìn)行回收。
當(dāng)然,為了釋放緩存空間,留出緩存的存儲(chǔ)資源,每次回收進(jìn)程完成對(duì)任一存儲(chǔ)區(qū)域的回收時(shí),刪除緩存中對(duì)應(yīng)任一存儲(chǔ)區(qū)域的反向映射元數(shù)據(jù)。
然而,考慮到圖3所示實(shí)施例,在回收進(jìn)程與反向映射元數(shù)據(jù)的更新同時(shí)進(jìn)行時(shí),存在以下兩種情況:
第一種情況、如果更新請(qǐng)求指示添加反向映射元數(shù)據(jù)。
在該情況中,以回收進(jìn)程是否完成從緩存及SAN中讀取對(duì)應(yīng)第一存儲(chǔ)區(qū)域的反向映射元數(shù)據(jù)的過(guò)程作為時(shí)間點(diǎn),如果未完成,則服務(wù)器在本次回收進(jìn)程中可以從緩存中讀取到反向映射元數(shù)據(jù),并進(jìn)行以上回收步驟;如果已完成,則第一存儲(chǔ)區(qū)域被添加了指定標(biāo)記。
在服務(wù)器已完成上述讀取的過(guò)程后,所添加的反向映射元數(shù)據(jù)不會(huì)在回收進(jìn)程被讀取到,該反向映射元數(shù)據(jù)中的VLBA仍然引用第一存儲(chǔ)區(qū)域的上的數(shù)據(jù)塊,因此,在本步驟中,為了使得VLBA能正常引用第一存儲(chǔ)區(qū)域上的數(shù)據(jù)塊,服務(wù)器不會(huì)回收具有指定標(biāo)記的第一存儲(chǔ)區(qū)域。
第二種情況、如果更新請(qǐng)求指示刪除反向映射元數(shù)據(jù)。
此時(shí),第一存儲(chǔ)區(qū)域的數(shù)據(jù)塊已被復(fù)制到第三存儲(chǔ)區(qū)域,如果更新請(qǐng)求指示刪除反向映射元數(shù)據(jù),則說(shuō)明該反向映射元數(shù)據(jù)中的VLBA不再引用第一存儲(chǔ)區(qū)域中的數(shù)據(jù)塊,則服務(wù)器可以刪除這些數(shù)據(jù)塊,回收第一存儲(chǔ)區(qū)域。
除以上兩種情況,如果確定更新反向映射元數(shù)據(jù)的過(guò)程中沒(méi)有進(jìn)行回收進(jìn)程,則回收列表中的存儲(chǔ)區(qū)域也不會(huì)具有指定標(biāo)記,此時(shí),服務(wù)器已經(jīng)完成復(fù)制數(shù)據(jù)塊到第三存儲(chǔ)區(qū)域、將VLBA原來(lái)指向的PLBA修改為第三存儲(chǔ)區(qū)域的PLBA、添加新的PLBA指向VLBA的反向映射元數(shù)據(jù)、以及刪除原來(lái)的PLBA指向VLBA的反向映射元數(shù)據(jù)。因此,服務(wù)器對(duì)回收列表中的存儲(chǔ)區(qū)域逐一進(jìn)行回收,即刪除回收列表中不具有反向映射元數(shù)據(jù)的存儲(chǔ)區(qū)域上的數(shù)據(jù)塊,從而留出存儲(chǔ)資源,提高SAN的利用率。
需要說(shuō)明的是,當(dāng)本次回收進(jìn)程結(jié)束時(shí),刪除指定標(biāo)記及緩存中所有的反向映射元數(shù)據(jù),使得原來(lái)具有指定標(biāo)記的存儲(chǔ)區(qū)域可以在之后的回收進(jìn)程中被回收,并釋放緩存空間,提高緩存的利用率。
本發(fā)明實(shí)施例基于圖3所示實(shí)施例以回收進(jìn)程這一側(cè)進(jìn)行說(shuō)明,與其并發(fā)進(jìn)行的更新過(guò)程同樣具備圖3所示實(shí)施例的有益效果。尤其是,本發(fā)明實(shí)施例提高了服務(wù)器的并發(fā)處理能力;而且,回收進(jìn)程支持多個(gè)存儲(chǔ)區(qū)域同時(shí)進(jìn)行回收,增加了回收效率,也不會(huì)延遲反向映射元數(shù)據(jù)的更新效率。
圖5是本發(fā)明實(shí)施例提供的一種更新反向映射元數(shù)據(jù)的裝置結(jié)構(gòu)示意圖。參見(jiàn)圖5,該裝置具體包括:
接收模塊501,用于執(zhí)行上述步驟301所涉及的過(guò)程。
存儲(chǔ)模塊502,用于執(zhí)行上述步驟302所涉及的過(guò)程。
判斷模塊503,用于執(zhí)行上述步驟303至步驟306所涉及的過(guò)程。
更新模塊504,用于執(zhí)行上述步驟307所涉及的過(guò)程。
相關(guān)技術(shù)中,由于對(duì)應(yīng)同一個(gè)PLBA的更新請(qǐng)求在緩存中有序存儲(chǔ),則每次更新反向映射元數(shù)據(jù)時(shí),如,在緩存中插入新的更新請(qǐng)求或者刪除舊的更新請(qǐng)求,緩存中更新請(qǐng)求的存儲(chǔ)位置均會(huì)重新調(diào)整,造成一定的時(shí)延,導(dǎo)致更新效率低,由于反向映射元數(shù)據(jù)的數(shù)據(jù)量大,則在緩存中存儲(chǔ)反向映射元數(shù)據(jù)會(huì)占用大量?jī)?nèi)存。
本發(fā)明實(shí)施例中,根據(jù)回收進(jìn)程的工作狀態(tài),判斷是否在所述緩存中更新所述反向映射元數(shù)據(jù),提供不在緩存中更新反向映射元數(shù)據(jù)的裝置,在回收進(jìn)程啟動(dòng)之前,從系統(tǒng)日志中已存儲(chǔ)的更新請(qǐng)求提取出反向映射元數(shù)據(jù),且合并至指定存儲(chǔ)區(qū)域上,以保證反向映射元數(shù)據(jù)的完整性。由于反向映射元數(shù)據(jù)更新頻繁,但是基本僅在回收進(jìn)程中使用,因此,本發(fā)明實(shí)施例對(duì)于多數(shù)更新反向映射元數(shù)據(jù)的過(guò)程可以減少時(shí)延,提高更新效率,且占用較少內(nèi)存。
需要說(shuō)明的是:上述實(shí)施例提供的更新反向映射元數(shù)據(jù)的裝置在更新反向映射元數(shù)據(jù)時(shí),僅以上述各功能模塊的劃分進(jìn)行舉例說(shuō)明,實(shí)際應(yīng)用中,可以根據(jù)需要而將上述功能分配由不同的功能模塊完成,即將裝置的內(nèi)部結(jié)構(gòu)劃分成不同的功能模塊,以完成以上描述的全部或者部分功能。另外,上述實(shí)施例提供的更新反向映射元數(shù)據(jù)的裝置與更新反向映射元數(shù)據(jù)的方法實(shí)施例屬于同一構(gòu)思,其具體實(shí)現(xiàn)過(guò)程詳見(jiàn)方法實(shí)施例,這里不再贅述。
以上所述僅為本發(fā)明的較佳實(shí)施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。