本發(fā)明涉及數(shù)據(jù)存儲技術(shù)領(lǐng)域,尤其涉及一種存儲設(shè)備,還涉及基于該存儲設(shè)備的分塊存儲方法。
背景技術(shù):
針對監(jiān)控存儲的數(shù)據(jù)特點,使用底層的數(shù)據(jù)塊作為基本的存儲單元,實現(xiàn)對監(jiān)控存儲的結(jié)構(gòu)化管理成為業(yè)界發(fā)展的方向。分塊存儲將存儲設(shè)備空間分成塊,其中,一些塊用來存放數(shù)據(jù)信息,稱為元數(shù)據(jù)塊;另一些塊用來存放數(shù)據(jù)本身,稱為數(shù)據(jù)塊。
目前一般情況是在存儲設(shè)備上劃分一片區(qū)域集中存放所有元數(shù)據(jù),另一片區(qū)域集中存放所有數(shù)據(jù)。這種方式方便管理。然而,這種方式的缺點包括:元數(shù)據(jù)塊和數(shù)據(jù)塊的偏移較大,在對數(shù)據(jù)塊寫完數(shù)據(jù)后,更新元數(shù)據(jù)會增加尋道時間;另外,元數(shù)據(jù)的集中存儲容易導(dǎo)致元數(shù)據(jù)的連續(xù)損壞,這樣,完好的數(shù)據(jù)塊也會由于元數(shù)據(jù)的損壞而無法進行正常的數(shù)據(jù)存儲。為了增強可靠性,不得不增加額外資源進行保護。
技術(shù)實現(xiàn)要素:
本發(fā)明所要解決的技術(shù)問題是:采用現(xiàn)有技術(shù)中存儲設(shè)備的分塊存儲方式,元數(shù)據(jù)塊和數(shù)據(jù)塊的偏移較大,在對數(shù)據(jù)塊寫完數(shù)據(jù)后,更新元數(shù)據(jù)會增加尋道時間;另外,元數(shù)據(jù)的集中存儲容易導(dǎo)致元數(shù)據(jù)的連續(xù)損壞,這樣,完好的數(shù)據(jù)塊也會由于元數(shù)據(jù)的損壞而無法進行正常的數(shù)據(jù)存儲。
為了解決上述技術(shù)問題,本發(fā)明提供了一種存儲設(shè)備及基于該存儲設(shè)備的分塊存儲方法,提高了存儲性能的同時,大大降低了由于多個元數(shù)據(jù)區(qū)連續(xù)損壞而導(dǎo)致的數(shù)據(jù)不可用的概率。
根據(jù)本發(fā)明的一個方面,提供了一種存儲設(shè)備,所述存儲設(shè)備的磁盤空間包括具有多個首尾相鄰的數(shù)據(jù)塊單元的數(shù)據(jù)區(qū),所述數(shù)據(jù)塊單元包括彼此相鄰的元 數(shù)據(jù)塊和數(shù)據(jù)塊;其中,容量為預(yù)設(shè)的第一容量的所述數(shù)據(jù)塊設(shè)置為存儲目標(biāo)數(shù)據(jù),容量為預(yù)設(shè)的第二容量的所述元數(shù)據(jù)塊設(shè)置為存儲所述目標(biāo)數(shù)據(jù)的數(shù)據(jù)信息。
優(yōu)選的是,所述存儲設(shè)備的磁盤空間還包括具有控制塊頭部和塊位圖的控制塊;其中,所述控制塊頭部設(shè)置為存儲所述數(shù)據(jù)塊單元的個數(shù)、所述第一容量和所述第二容量;所述塊位圖設(shè)置為存儲各個數(shù)據(jù)塊單元的使用狀態(tài)的狀態(tài)信息。
優(yōu)選的是,所述控制塊的首地址為所述磁盤空間的首地址,且所述控制塊與所述數(shù)據(jù)區(qū)中的第一個數(shù)據(jù)塊單元相鄰。
優(yōu)選的是,所述存儲設(shè)備的磁盤空間還包括作為所述控制塊的冗余備份的冗余控制塊。
優(yōu)選的是,所述冗余控制塊的尾地址為所述磁盤空間的尾地址。
根據(jù)本發(fā)明的另一個方面,提供了一種基于上述存儲設(shè)備的分塊存儲方法,該方法包括:
格式化存儲設(shè)備,并使所述存儲設(shè)備的磁盤空間包括具有多個首尾相鄰的數(shù)據(jù)塊單元的數(shù)據(jù)區(qū),所述數(shù)據(jù)塊單元包括彼此相鄰的元數(shù)據(jù)塊和數(shù)據(jù)塊;其中,容量為預(yù)設(shè)的第一容量的所述數(shù)據(jù)塊設(shè)置為存儲目標(biāo)數(shù)據(jù),容量為預(yù)設(shè)的第二容量的所述元數(shù)據(jù)塊設(shè)置為存儲所述目標(biāo)數(shù)據(jù)的數(shù)據(jù)信息;
在所述數(shù)據(jù)區(qū)中確定目標(biāo)數(shù)據(jù)塊單元;
將待存儲數(shù)據(jù)存儲到所述目標(biāo)數(shù)據(jù)塊單元中。
優(yōu)選的是,所述格式化存儲設(shè)備,還使得所述存儲設(shè)備的磁盤空間還包括具有控制塊頭部和塊位圖的控制塊、以及作為所述控制塊的冗余備份的冗余控制塊;其中,所述控制塊頭部設(shè)置為存儲所述數(shù)據(jù)塊單元的個數(shù)、所述第一容量和所述第二容量;所述塊位圖設(shè)置為存儲各個數(shù)據(jù)塊單元的使用狀態(tài)的狀態(tài)信息。
優(yōu)選的是,所述在數(shù)據(jù)區(qū)中確定目標(biāo)數(shù)據(jù)塊單元的方法包括:
判斷內(nèi)存中的未滿塊鏈表是否非空;
判斷出所述未滿塊鏈表非空時,根據(jù)所述未滿塊鏈表確定最小數(shù)據(jù)塊單元,并將所述最小數(shù)據(jù)塊單元確定為所述目標(biāo)數(shù)據(jù)塊單元。
優(yōu)選的是,所述在數(shù)據(jù)區(qū)中確定目標(biāo)數(shù)據(jù)塊單元的方法還包括:
判斷出所述未滿塊鏈表為空時,根據(jù)所述塊位圖判斷所述數(shù)據(jù)區(qū)中是否存在空閑數(shù)據(jù)塊單元;
判斷出所述數(shù)據(jù)區(qū)中存在空閑數(shù)據(jù)塊單元時,將所述數(shù)據(jù)區(qū)中地址最靠前的空閑數(shù)據(jù)塊單元確定為最小空閑數(shù)據(jù)塊單元,并將所述最小空閑數(shù)據(jù)塊單元確定為所述目標(biāo)數(shù)據(jù)塊單元;
判斷出所述數(shù)據(jù)區(qū)中不存在空閑數(shù)據(jù)塊單元時,確定不存在目標(biāo)數(shù)據(jù)塊單元并退出,或者對回收指令涉及的指定數(shù)據(jù)塊單元進行回收,并將經(jīng)回收的指定數(shù)據(jù)塊單元確定為所述目標(biāo)數(shù)據(jù)塊單元。
優(yōu)選的是,所述對回收指令涉及的指定數(shù)據(jù)塊單元進行回收包括:
將所述指定數(shù)據(jù)塊單元的元數(shù)據(jù)塊清零,更新塊位圖中存儲的對應(yīng)所述指定數(shù)據(jù)塊單元的狀態(tài)信息;
判斷未滿塊鏈表中是否存儲有所述指定數(shù)據(jù)塊單元的數(shù)據(jù)塊存儲的數(shù)據(jù)信息;
判斷出未滿塊鏈表中存儲有所述指定數(shù)據(jù)塊單元的數(shù)據(jù)塊存儲的數(shù)據(jù)信息時,將所述數(shù)據(jù)信息從未滿塊鏈表中刪除。
優(yōu)選的是,所述將待存儲數(shù)據(jù)存儲到目標(biāo)數(shù)據(jù)塊單元中包括:
根據(jù)所述待存儲數(shù)據(jù)的大小和所述目標(biāo)數(shù)據(jù)塊單元的數(shù)據(jù)塊存儲的目標(biāo)數(shù)據(jù)的大小,判斷所述目標(biāo)數(shù)據(jù)塊單元的數(shù)據(jù)塊的剩余容量是否充足;
如果是,則將所述待存儲數(shù)據(jù)劃分為多個數(shù)據(jù)段,依次對每個數(shù)據(jù)段,將所述數(shù)據(jù)段寫入所述目標(biāo)數(shù)據(jù)塊單元的數(shù)據(jù)塊中,并將所述數(shù)據(jù)段的數(shù)據(jù)信息寫入所述目標(biāo)數(shù)據(jù)塊單元的元數(shù)據(jù)塊中。
與現(xiàn)有技術(shù)相比,上述方案中的一個或多個實施例可以具有如下優(yōu)點或有益效果:
應(yīng)用所述的存儲設(shè)備,采用元數(shù)據(jù)分散存儲,每一個元數(shù)據(jù)塊和數(shù)據(jù)塊作為整體來存放,減少寫數(shù)據(jù)后更新元數(shù)據(jù)地址偏移,從而提高了元數(shù)據(jù)的更新效率,從整體上提高了存儲設(shè)備的存儲性能。另外,采用元數(shù)據(jù)分散存儲,大大降低由于多個元數(shù)據(jù)塊連續(xù)損壞而導(dǎo)致的數(shù)據(jù)不可用的概率,克服了現(xiàn)有技術(shù)中由于元數(shù)據(jù)的連續(xù)損壞導(dǎo)致的完好的數(shù)據(jù)塊無法進行正常的數(shù)據(jù)存儲的缺陷。
本發(fā)明的其它特征和優(yōu)點將在隨后的說明書中闡述,并且部分地從說明書中變得顯而易見,或者通過實施本發(fā)明而了解。本發(fā)明的目的和其他優(yōu)點可通過在說明書、權(quán)利要求書以及附圖中所特別指出的結(jié)構(gòu)來實現(xiàn)和獲得。
附圖說明
附圖用來提供對本發(fā)明的進一步理解,并且構(gòu)成說明書的一部分,與本發(fā)明的實施例共同用于解釋本發(fā)明,并不構(gòu)成對本發(fā)明的限制。在附圖中:
圖1示出了存儲設(shè)備的磁盤空間劃分示意圖;
圖2示出了基于上述存儲設(shè)備的分塊存儲方法的流程圖;
圖3示出了在數(shù)據(jù)區(qū)中確定目標(biāo)數(shù)據(jù)塊單元的方法的流程圖;
圖4示出了對回收指令涉及的指定數(shù)據(jù)塊單元進行回收的方法的流程圖;以及
圖5示出了將待存儲數(shù)據(jù)存儲到目標(biāo)數(shù)據(jù)塊單元中的方法的流程圖。
具體實施方式
以下將結(jié)合附圖及實施例來詳細(xì)說明本發(fā)明的實施方式,借此對本發(fā)明如何應(yīng)用技術(shù)手段來解決技術(shù)問題,并達成技術(shù)效果的實現(xiàn)過程能充分理解并據(jù)以實施。需要說明的是,只要不構(gòu)成沖突,本發(fā)明中的各個實施例以及各實施例中的各個特征可以相互結(jié)合,所形成的技術(shù)方案均在本發(fā)明的保護范圍之內(nèi)。
本發(fā)明所要解決的技術(shù)問題是:采用現(xiàn)有技術(shù)中存儲設(shè)備的分塊存儲方式,元數(shù)據(jù)塊和數(shù)據(jù)塊的偏移較大,在對數(shù)據(jù)塊寫完數(shù)據(jù)后,更新元數(shù)據(jù)會增加尋道時間;另外,元數(shù)據(jù)的集中存儲容易導(dǎo)致元數(shù)據(jù)的連續(xù)損壞,這樣,完好的數(shù)據(jù)塊也會由于元數(shù)據(jù)的損壞而無法進行正常的數(shù)據(jù)存儲。為解決上述技術(shù)問題,本發(fā)明實施例提供了一種存儲設(shè)備。
在詳細(xì)闡述以下各個實施例之前,先對術(shù)語“塊數(shù)據(jù)存儲”、“塊位圖”、“元數(shù)據(jù)”和“未滿塊鏈表”進行解釋。
塊數(shù)據(jù)存儲:針對監(jiān)控存儲的數(shù)據(jù)特點,采用底層的數(shù)據(jù)塊作為基本的存儲單元,采用一種專用于監(jiān)控存儲的專用數(shù)據(jù)結(jié)構(gòu),通過數(shù)據(jù)塊+專用數(shù)據(jù)結(jié)構(gòu)兩部分結(jié)合,來實現(xiàn)對監(jiān)控存儲的結(jié)構(gòu)化管理。
塊位圖:管理磁盤上的存儲塊已保證給定的磁盤塊在一個時刻僅用于一種目的。使用塊位圖來管理空閑存儲塊,易于存儲,并可以節(jié)省空間。為了建立一個空閑塊位圖,需要在磁盤上保留足夠大的連續(xù)空間,為每個存儲塊設(shè)置一個位。
元數(shù)據(jù):描述數(shù)據(jù)的結(jié)構(gòu)和意義,用來支持如指示存儲位置、歷史數(shù)據(jù)、資源查找、文件記錄等功能。
未滿塊鏈表:存儲數(shù)據(jù)區(qū)中所有未滿數(shù)據(jù)塊單元的元數(shù)據(jù)塊存儲的數(shù)據(jù)信息。在寫入數(shù)據(jù)時,優(yōu)先考慮將數(shù)據(jù)寫入未滿塊數(shù)據(jù)塊單元,從而能夠避免未滿數(shù)據(jù)塊單元過多造成的存儲空間的浪費。
圖1示出了存儲設(shè)備的磁盤空間劃分示意圖。如圖1所示,從存儲設(shè)備的整個磁盤空間中劃分出數(shù)據(jù)區(qū),用于集中存儲成對的元數(shù)據(jù)塊21和數(shù)據(jù)塊22,元數(shù)據(jù)塊21和數(shù)據(jù)塊22相鄰存放,作為一個整體單元,在本文中將這個整體單元稱為數(shù)據(jù)塊單元2。
具體地,數(shù)據(jù)區(qū)包括多個首尾相鄰的數(shù)據(jù)塊單元2,數(shù)據(jù)塊單元2包括彼此相鄰的元數(shù)據(jù)塊21和數(shù)據(jù)塊22,元數(shù)據(jù)塊21的首地址通常位于數(shù)據(jù)塊22的首地址之前。數(shù)據(jù)塊22設(shè)置為存儲目標(biāo)數(shù)據(jù),在視頻監(jiān)控領(lǐng)域,本實施例涉及的目標(biāo)數(shù)據(jù)指的是視頻數(shù)據(jù)。元數(shù)據(jù)塊21設(shè)置為存儲其所屬數(shù)據(jù)塊單元2的數(shù)據(jù)塊22存儲的目標(biāo)數(shù)據(jù)的數(shù)據(jù)信息(這里數(shù)據(jù)信息也稱為元數(shù)據(jù))。在本實施例中,數(shù)據(jù)塊22設(shè)置為存儲順次排列的多個數(shù)據(jù)段,這里所有數(shù)據(jù)段構(gòu)成了上述目標(biāo)數(shù)據(jù),其中,每個數(shù)據(jù)段分別為一段視頻數(shù)據(jù)。相應(yīng)地,在元數(shù)據(jù)塊21中,按照數(shù)據(jù)段在數(shù)據(jù)塊22中的排列順序,依次存儲有對應(yīng)各個數(shù)據(jù)段的段信息,所有段信息的總和構(gòu)成了上述數(shù)據(jù)信息。一般地,對應(yīng)一個數(shù)據(jù)段的段信息包括但不限于:塊號(即所屬數(shù)據(jù)塊單元2的編號)、前端設(shè)備號(即該數(shù)據(jù)段對應(yīng)的視頻輸出設(shè)備的編號)、段號(即該數(shù)據(jù)段排在元數(shù)據(jù)塊21存儲的所有數(shù)據(jù)段中的次序)、塊內(nèi)偏移、段長度、i幀數(shù)量和i幀信息。
為了方便推算各個元數(shù)據(jù)塊21和各個數(shù)據(jù)塊22的首地址,將所有數(shù)據(jù)塊22的總?cè)萘吭O(shè)置為預(yù)設(shè)的第一容量,同時將所有元數(shù)據(jù)塊21的總?cè)萘吭O(shè)置為預(yù)設(shè)的第二容量。
應(yīng)用本實施例所述的存儲設(shè)備,采用元數(shù)據(jù)分散存儲,每一個元數(shù)據(jù)塊21和數(shù)據(jù)塊22作為整體來存放,減少寫數(shù)據(jù)后更新元數(shù)據(jù)地址偏移,從而提高了元數(shù)據(jù)的更新效率,從整體上提高了存儲設(shè)備的存儲性能。另外,采用元數(shù)據(jù)分散存儲,大大降低由于多個元數(shù)據(jù)塊21連續(xù)損壞而導(dǎo)致的數(shù)據(jù)不可用的概率,克服了現(xiàn)有技術(shù)中由于元數(shù)據(jù)的連續(xù)損壞導(dǎo)致的完好的數(shù)據(jù)塊22無法進行正常的數(shù)據(jù)存儲的缺陷。
在一優(yōu)選的實施例中,存儲設(shè)備的磁盤空間還包括控制塊1,存儲存儲設(shè)備的整個磁盤的相關(guān)信息。為了方便推算數(shù)據(jù)區(qū)中各個元數(shù)據(jù)塊21和數(shù)據(jù)塊22的 首地址,將控制塊1的總?cè)萘抗潭ㄔO(shè)置為1M,同時特別地,將控制塊1的首地址設(shè)置為整個存儲設(shè)備的磁盤空間的首地址,另外,控制塊1與數(shù)據(jù)區(qū)中的第一個數(shù)據(jù)塊單元2相鄰。
具體地,控制塊1包括控制塊頭部和塊位圖,控制塊頭部的首地址位于塊位圖的首地址之前??刂茐K頭部設(shè)置為存儲數(shù)據(jù)區(qū)中數(shù)據(jù)塊單元2的個數(shù)、第一容量、第二容量、標(biāo)簽、crc校驗(Cyclic Redundancy Check,循環(huán)冗余校驗碼)值等信息??刂茐K頭部占用的空間很小,控制塊1的絕大部分空間用于存放塊位圖。塊位圖設(shè)置為存儲數(shù)據(jù)區(qū)中各個數(shù)據(jù)塊單元2的使用狀態(tài)的狀態(tài)信息,塊位圖的每一位對應(yīng)數(shù)據(jù)區(qū)的一個數(shù)據(jù)塊單元2,用于表示該數(shù)據(jù)塊單元2是否已被使用。通常采用二進制數(shù)表示數(shù)據(jù)塊單元2的使用狀態(tài),如果塊位圖記載的數(shù)據(jù)塊單元2對應(yīng)的狀態(tài)信息為0,則表示該數(shù)據(jù)塊單元2未被使用,即該數(shù)據(jù)塊單元2的元數(shù)據(jù)塊21和數(shù)據(jù)塊22中均存儲有數(shù)據(jù);反過來,如果塊位圖記載的數(shù)據(jù)塊單元2對應(yīng)的狀態(tài)信息為1,則表示該數(shù)據(jù)塊單元2已被使用,即該數(shù)據(jù)塊單元2的元數(shù)據(jù)塊21中未存儲任何數(shù)據(jù)。
在本實施例中,采用塊位圖進行數(shù)據(jù)塊22的管理,克服了由于元數(shù)據(jù)的分散存儲帶來的搜索耗時、不方便管理的缺陷。另外,元數(shù)據(jù)的完整性不完全依賴于位于存儲設(shè)備的上一層的管理節(jié)點,在管理節(jié)點管理的元數(shù)據(jù)(存儲在管理節(jié)點中的元數(shù)據(jù))失效(例如丟失)時,能根據(jù)塊位圖從存儲設(shè)備恢復(fù)。
進一步地,存儲設(shè)備的磁盤空間還包括作為控制塊1的冗余備份的冗余控制塊3。換言之,冗余控制塊3為上述控制塊1的拷貝,冗余控制塊3的總?cè)萘颗c控制塊1的總?cè)萘肯嗤鶅?yōu)選為1M。類似地,冗余控制塊3也包括控制塊頭部和塊位圖??刂茐K頭部設(shè)置為存儲數(shù)據(jù)區(qū)中數(shù)據(jù)塊單元2的個數(shù)、第一容量、第二容量、標(biāo)簽、crc校驗(Cyclic Redundancy Check,循環(huán)冗余校驗碼)值等信息。塊位圖設(shè)置為存儲數(shù)據(jù)區(qū)中各個數(shù)據(jù)塊單元2的使用狀態(tài)的狀態(tài)信息,塊位圖的每一位對應(yīng)數(shù)據(jù)區(qū)的一個數(shù)據(jù)塊單元2,用于表示該數(shù)據(jù)塊單元2是否已被使用。
為了避免由于控制塊1失效導(dǎo)致的無法確定冗余控制塊3的起始地址,更無法讀取磁盤關(guān)鍵信息,冗余控制塊3無法發(fā)揮其冗余效果的技術(shù)缺陷,在本明一優(yōu)選的實施例中,將冗余控制塊3的尾地址設(shè)置為磁盤空間的尾地址,冗余控制塊3的首地址與數(shù)據(jù)區(qū)的尾地址之間為預(yù)留空間。
下面結(jié)合圖1,具體闡述存儲設(shè)備的磁盤空間的各個數(shù)據(jù)存儲區(qū)的首地址的確定過程:控制塊1的總?cè)萘俊⒃獢?shù)據(jù)塊21的總?cè)萘?、?shù)據(jù)塊22的總?cè)萘吭O(shè)定后,如果各區(qū)域地址順次首尾相鄰,則所有區(qū)域的起止地址是固定的。假設(shè)存儲設(shè)備的磁盤容量設(shè)定為常數(shù)DEV_CAPACITY,控制塊1的總?cè)萘吭O(shè)定為1M,冗余控制塊3的總?cè)萘恳苍O(shè)定為1M,第二容量(即元數(shù)據(jù)塊21的總?cè)萘?設(shè)定為常數(shù)INFO_BLK_SIZE,第一容量(即數(shù)據(jù)塊22的總?cè)萘?設(shè)定為DATA_BLK_SIZE,則數(shù)據(jù)區(qū)中數(shù)據(jù)塊單元2的個數(shù)可通過下式確定:(DEV_CAPACITY-1M*2)/(INFO_BLK_SIZE+DATA_BLK_SIZE)??刂茐K1的起始地址為0。第n個元數(shù)據(jù)塊21的起始地址為1M+(n-1)*(INFO_BLK_SIZE+DATA_BLK_SIZE)。特別地,冗余控制塊3存放在磁盤空間的最尾端,即冗余控制塊3的尾地址設(shè)定為存儲設(shè)備的磁盤空間的尾地址,冗余控制塊3的起始地址為DEV_CAPACITY-1M。如果數(shù)據(jù)區(qū)的總?cè)萘坎皇窃獢?shù)據(jù)塊21的總?cè)萘颗c數(shù)據(jù)塊22的總?cè)萘康目偤偷恼麛?shù)倍,則設(shè)置在數(shù)據(jù)區(qū)最末尾的數(shù)據(jù)塊22與冗余控制塊3之間預(yù)留一段空間。這里,需要說明的是,將冗余控制塊3存放在磁盤空間的最尾端相比于緊鄰數(shù)據(jù)區(qū)的尾端存放的優(yōu)勢在于:如果冗余控制塊3與數(shù)據(jù)區(qū)中最后一個數(shù)據(jù)塊22相鄰,則該冗余控制塊3的起始地址需要根據(jù)設(shè)定的第一容量和第二容量計算得到,這些關(guān)鍵信息記錄在控制塊1中。然而,一旦控制塊1失效,則會導(dǎo)致無法確定冗余控制塊3起始地址,更無法讀取磁盤空間的關(guān)鍵信息,從而冗余控制塊3沒有發(fā)揮其冗余效果。在上述優(yōu)選地實施例中,將冗余控制塊3固定在存放在磁盤空間的最尾端,其起始地址是恒定的,從而當(dāng)控制塊1失效時,系統(tǒng)仍可依照冗余控制塊3中備份的關(guān)鍵信息維持存儲設(shè)備的正常工作,充分發(fā)揮了冗余控制塊3的冗余備份作用。
本發(fā)明實施例還提供了基于上述存儲設(shè)備的分塊存儲方法。如圖2所示,是基于上述存儲設(shè)備的分塊存儲方法的流程圖,該分塊存儲方法包括以下步驟:
步驟101:格式化存儲設(shè)備,并使存儲設(shè)備的磁盤空間包括具有多個首尾相鄰的數(shù)據(jù)塊單元2的數(shù)據(jù)區(qū),數(shù)據(jù)塊單元2包括彼此相鄰的元數(shù)據(jù)塊21和數(shù)據(jù)塊22;其中,容量為預(yù)設(shè)的第一容量的數(shù)據(jù)塊22設(shè)置為存儲目標(biāo)數(shù)據(jù),容量為預(yù)設(shè)的第二容量的元數(shù)據(jù)塊21設(shè)置為存儲目標(biāo)數(shù)據(jù)的數(shù)據(jù)信息。
具體地,存儲設(shè)備必須經(jīng)過格式化后才能被存儲系統(tǒng)使用。存儲設(shè)備的格式化過程為:按照預(yù)設(shè)的第一容量和第二容量,對存儲設(shè)備的磁盤空間進行劃分, 然后,填充控制塊頭部信息,并將塊位圖清零;最后將控制塊1拷貝到冗余控制塊3。
步驟102:在數(shù)據(jù)區(qū)中確定目標(biāo)數(shù)據(jù)塊單元。
具體地,此步驟涉及數(shù)據(jù)塊單元2的申請與回收,以在數(shù)據(jù)區(qū)中確定合適的用于承載待存儲數(shù)據(jù)的目標(biāo)數(shù)據(jù)塊單元。下文將結(jié)合圖3和圖4分別詳細(xì)地闡述目標(biāo)數(shù)據(jù)塊單元的申請方法和指定數(shù)據(jù)塊單元的回收方法。
步驟103:將待存儲數(shù)據(jù)存儲到目標(biāo)數(shù)據(jù)塊單元中。
具體地,在確定目標(biāo)數(shù)據(jù)塊單元后,如果目標(biāo)數(shù)據(jù)塊單元的數(shù)據(jù)塊22的剩余容量足以存儲待存儲數(shù)據(jù),則將待存儲數(shù)據(jù)存儲到目標(biāo)數(shù)據(jù)塊單元中。數(shù)據(jù)塊22的剩余容量可以根據(jù)數(shù)據(jù)塊22的總?cè)萘亢痛鎯υ谠摂?shù)據(jù)塊22的所有數(shù)據(jù)段的數(shù)據(jù)段長度得到。下文將結(jié)合圖5詳細(xì)地闡述待存儲數(shù)據(jù)的存儲過程。
應(yīng)用本實施例所述的存儲設(shè)備的分塊存儲方法,采用元數(shù)據(jù)分散存儲,每一個元數(shù)據(jù)塊21和數(shù)據(jù)塊22作為整體來存放,減少寫數(shù)據(jù)后更新元數(shù)據(jù)地址偏移,從而提高了元數(shù)據(jù)的更新效率,從整體上提高了存儲設(shè)備的存儲性能。另外,采用元數(shù)據(jù)分散存儲,大大降低由于多個元數(shù)據(jù)塊21連續(xù)損壞而導(dǎo)致的數(shù)據(jù)不可用的概率,克服了現(xiàn)有技術(shù)中由于元數(shù)據(jù)的連續(xù)損壞導(dǎo)致的完好的數(shù)據(jù)塊22無法進行正常的數(shù)據(jù)存儲的缺陷。
在一優(yōu)選的實施例中,通過格式化存儲設(shè)備,還使得存儲設(shè)備的磁盤空間還包括具有控制塊頭部和塊位圖的控制塊1、以及作為控制塊1的冗余備份的冗余控制塊3;其中,控制塊頭部設(shè)置為存儲數(shù)據(jù)區(qū)中數(shù)據(jù)塊單元2的個數(shù)、第一容量和第二容量;塊位圖設(shè)置為存儲數(shù)據(jù)區(qū)中各個數(shù)據(jù)塊單元2的使用狀態(tài)的狀態(tài)信息。
在本實施例中,采用塊位圖進行數(shù)據(jù)塊22的管理,克服了由于元數(shù)據(jù)的分散存儲帶來的搜索耗時、不方便管理的缺陷。另外,元數(shù)據(jù)的完整性不完全依賴于位于存儲設(shè)備的上一層的管理節(jié)點,在管理節(jié)點管理的元數(shù)據(jù)(存儲在管理節(jié)點中的元數(shù)據(jù))失效(例如丟失)時,能根據(jù)塊位圖從存儲設(shè)備恢復(fù)。
圖3示出了在數(shù)據(jù)區(qū)中確定目標(biāo)數(shù)據(jù)塊單元的方法的流程圖。如圖3所示,在數(shù)據(jù)區(qū)中確定目標(biāo)數(shù)據(jù)塊單元的方法包括:
步驟201:判斷內(nèi)存中的未滿塊鏈表是否非空,未滿塊鏈表設(shè)置為存儲數(shù)據(jù)區(qū)中所有未滿數(shù)據(jù)塊單元的元數(shù)據(jù)塊21存儲的數(shù)據(jù)信息;其中,未滿數(shù)據(jù)塊單 元的數(shù)據(jù)塊22中存儲的目標(biāo)數(shù)據(jù)的大小小于第一容量,并且未滿數(shù)據(jù)塊單元的元數(shù)據(jù)塊21中存儲的數(shù)據(jù)信息的大小小于第二容量。
具體地,當(dāng)視頻監(jiān)控前端設(shè)備有數(shù)據(jù)進入存儲系統(tǒng)時,首先為該設(shè)備申請合適的塊,即申請目標(biāo)數(shù)據(jù)塊單元。本文采用的數(shù)據(jù)塊單元2的申請策略為,優(yōu)先將待存儲數(shù)據(jù)寫入數(shù)據(jù)區(qū)位置靠前的未滿數(shù)據(jù)塊單元中,如果數(shù)據(jù)區(qū)中不存在未滿數(shù)據(jù)塊單元,則將待存儲數(shù)據(jù)寫入數(shù)據(jù)區(qū)位置靠前的空閑數(shù)據(jù)塊單元中,如果數(shù)據(jù)區(qū)中也不存在空閑數(shù)據(jù)塊單元,則認(rèn)為申請失敗并退出,或者根據(jù)存儲系統(tǒng)發(fā)送的回收指令,回收指定數(shù)據(jù)塊單元,并將等存儲數(shù)據(jù)寫入指定數(shù)據(jù)塊單元中。
此步驟中涉及的未滿塊鏈表存儲在存儲系統(tǒng)的內(nèi)存中,該鏈表隨著數(shù)據(jù)的不斷寫入實時更新。該未滿塊鏈表設(shè)置為存儲數(shù)據(jù)區(qū)中所有未滿數(shù)據(jù)塊單元的元數(shù)據(jù)塊21存儲的數(shù)據(jù)信息。一般地,對于某個數(shù)據(jù)塊單元2來說,如果其元數(shù)據(jù)塊21的剩余容量為零或不足(即小于設(shè)定的最小容量),或者其數(shù)據(jù)塊22的剩余容量為零或不足(即小于設(shè)定的最小容量)的情況,都認(rèn)為該數(shù)據(jù)塊單元2寫滿。反過來,如果其元數(shù)據(jù)塊21的剩余容量充足,并且其數(shù)據(jù)塊22的剩余容量充足的情況,都認(rèn)為該數(shù)據(jù)塊單元2未滿。
步驟202:如果未滿塊鏈表非空,則根據(jù)未滿塊鏈表確定最小數(shù)據(jù)塊單元,并將最小數(shù)據(jù)塊單元確定為目標(biāo)數(shù)據(jù)塊單元。
具體地,當(dāng)未滿塊鏈表非空時,即表示數(shù)據(jù)區(qū)內(nèi)存在未滿數(shù)據(jù)塊單元時,根據(jù)未滿塊鏈表的數(shù)據(jù)信息,確定最小數(shù)據(jù)塊單元并將該最小數(shù)據(jù)塊單元確定為目標(biāo)數(shù)據(jù)塊單元。這里最小數(shù)據(jù)塊單元指的是數(shù)據(jù)區(qū)中所有未滿數(shù)據(jù)塊單元中存儲位置最靠前(地址最小)的那個未滿數(shù)據(jù)塊單元。
步驟203:如果未滿塊鏈表為空,根據(jù)塊位圖判斷數(shù)據(jù)區(qū)中是否存在空閑數(shù)據(jù)塊單元;其中,空閑數(shù)據(jù)塊單元的數(shù)據(jù)塊22的剩余容量等于第一容量,空閑數(shù)據(jù)塊單元的元數(shù)據(jù)塊21的剩余容量等于第二容量。
步驟204:如果數(shù)據(jù)區(qū)中存在空閑數(shù)據(jù)塊單元,則將數(shù)據(jù)區(qū)中地址最靠前的空閑數(shù)據(jù)塊單元確定為最小空閑數(shù)據(jù)塊單元,并將最小空閑數(shù)據(jù)塊單元確定為目標(biāo)數(shù)據(jù)塊單元。
具體地,當(dāng)未滿塊鏈表為空時,即表示數(shù)據(jù)區(qū)內(nèi)不存在未滿數(shù)據(jù)塊單元時,計劃把待存儲數(shù)據(jù)寫入數(shù)據(jù)區(qū)的最小空閑數(shù)據(jù)塊單元中。隨著數(shù)據(jù)的不斷寫入,最小空閑數(shù)據(jù)塊單元也隨之改變。最小空閑數(shù)據(jù)塊單元的獲取方法為:系統(tǒng)初始 化讀取存儲設(shè)備控制塊1的塊位圖到內(nèi)存塊位圖中。從塊位圖的第一位開始查詢是否有未使用的數(shù)據(jù)塊單元2,直到最后一個數(shù)據(jù)塊單元2。一旦找到未使用的數(shù)據(jù)塊單元2,即將該數(shù)據(jù)塊單元2記錄為最小空閑數(shù)據(jù)塊單元。否則,將最小空閑數(shù)據(jù)塊單元設(shè)置為無效值。該最小空閑數(shù)據(jù)塊單元記錄在存儲系統(tǒng)的內(nèi)存中。一旦最小空閑數(shù)據(jù)塊單元被確定為目標(biāo)數(shù)據(jù)塊單元,即將塊位圖中該數(shù)據(jù)塊單元2對應(yīng)的狀態(tài)信息標(biāo)記為已使用,更新內(nèi)存塊位圖并將更新后的內(nèi)存塊位圖重新寫入到控制塊1的塊位圖,并將該最小數(shù)據(jù)塊單元對應(yīng)的數(shù)據(jù)信息(包括前端設(shè)備號)記錄到未滿塊鏈表中。在該最小數(shù)據(jù)塊單元寫滿后,將其對應(yīng)的數(shù)據(jù)信息從未滿塊鏈表中刪除。另外,一旦最小空閑數(shù)據(jù)塊單元被確定為目標(biāo)數(shù)據(jù)塊單元,即重新向下搜索,以確定新的最小空閑數(shù)據(jù)塊單元。如果從當(dāng)前數(shù)據(jù)塊單元2往后一直查找到最后一個數(shù)據(jù)塊單元2,也沒有找到未使用的數(shù)據(jù)塊單元2,則從頭開始查找,如果找到未使用的數(shù)據(jù)塊單元2,則將該數(shù)據(jù)塊單元2記錄為最小空閑數(shù)據(jù)塊單元,如果沒有找到未使用的數(shù)據(jù)塊單元2,則將最小空閑數(shù)據(jù)塊單元設(shè)置為無效值。這樣做,一方面避免過多的未滿數(shù)據(jù)塊單元浪費存儲空間,另一方面,保證數(shù)據(jù)盡量順序?qū)懭耄岣邔懶阅堋?/p>
步驟205:如果數(shù)據(jù)區(qū)中不存在空閑數(shù)據(jù)塊單元,則確定不存在目標(biāo)數(shù)據(jù)塊單元并退出,或者對回收指令涉及的指定數(shù)據(jù)塊單元進行回收,并將經(jīng)回收的指定數(shù)據(jù)塊單元確定為目標(biāo)數(shù)據(jù)塊單元。
具體地,如果數(shù)據(jù)區(qū)中即不存在未滿數(shù)據(jù)塊單元,也不存在空閑數(shù)據(jù)塊單元,則確定不存在目標(biāo)數(shù)據(jù)塊單元并退出,需要換其他存儲設(shè)備繼續(xù)寫入數(shù)據(jù)?;蛘?,根據(jù)存儲系統(tǒng)的回收指令對存儲有過時數(shù)據(jù)的數(shù)據(jù)塊單元2進行回收,以保證待存儲數(shù)據(jù)的存儲能持續(xù)進行,避免了過時數(shù)據(jù)占用存儲空間的情況,提高了存儲設(shè)備的實用性。這里值得說明的是,存儲系統(tǒng)可以在存儲設(shè)備沒有多余的存儲空間時發(fā)出回收指令,以進行一個或多個指定數(shù)據(jù)塊單元的回收,也可以隨時發(fā)出回收指令,對數(shù)據(jù)區(qū)的一個或多個指定數(shù)據(jù)塊單元進行回收。這里,對指定數(shù)據(jù)塊單元的回收涉及,使該指定數(shù)據(jù)塊單元的元數(shù)據(jù)塊21清零,使塊位圖中記載的對應(yīng)該指定數(shù)據(jù)塊單元的狀態(tài)信息置零,如果該指定數(shù)據(jù)塊單元之前為未滿數(shù)據(jù)塊單元,則將指定數(shù)據(jù)塊單元對應(yīng)的數(shù)據(jù)信息從未滿塊鏈表中刪除。應(yīng)注意,回收過程可以不涉及對指定數(shù)據(jù)塊單元的數(shù)據(jù)塊22進行清零的動作,這是因為一旦該指定數(shù)據(jù)塊單元的元數(shù)據(jù)塊21清零后,其數(shù)據(jù)塊22中存儲的數(shù)據(jù)都會被 后續(xù)寫入的數(shù)據(jù)覆蓋掉。
圖4示出了對回收指令涉及的指定數(shù)據(jù)塊單元進行回收的方法的流程圖。如圖4所示,對回收指令涉及的指定數(shù)據(jù)塊單元進行回收包括以下步驟:
步驟301:將指定數(shù)據(jù)塊單元的元數(shù)據(jù)塊21清零,更新塊位圖中存儲的對應(yīng)指定數(shù)據(jù)塊單元的狀態(tài)信息。
步驟302:判斷未滿塊鏈表中是否存儲有指定數(shù)據(jù)塊單元的數(shù)據(jù)塊22存儲的數(shù)據(jù)信息。
步驟303:如果未滿塊鏈表中存儲有指定數(shù)據(jù)塊單元的數(shù)據(jù)塊22存儲的數(shù)據(jù)信息,則將數(shù)據(jù)信息從未滿塊鏈表中刪除。
具體地,首先根據(jù)指定數(shù)據(jù)塊單元的塊號計算其元數(shù)據(jù)的首地址,并將元數(shù)據(jù)塊21清零。然后將內(nèi)存塊位圖對應(yīng)的狀態(tài)信息設(shè)置為未使用,將內(nèi)存塊位圖更新到控制塊1。最后在判斷出指定數(shù)據(jù)塊單元為未滿數(shù)據(jù)塊單元時,將該指定數(shù)據(jù)塊單元對應(yīng)的數(shù)據(jù)信息從未滿塊鏈表中刪除。
找到合適的目標(biāo)數(shù)據(jù)塊單元后,視頻數(shù)據(jù)按段寫入塊。每個數(shù)據(jù)段生成一條段信息,并寫入到該數(shù)據(jù)塊單元2對應(yīng)的元數(shù)據(jù)塊21中。由于每個數(shù)據(jù)段包含的i幀數(shù)量不一樣,所以每條數(shù)據(jù)段的信息長度也不一致。
圖5示出了將待存儲數(shù)據(jù)存儲到目標(biāo)數(shù)據(jù)塊單元中的方法的流程圖。如圖5所示,將待存儲數(shù)據(jù)存儲到目標(biāo)數(shù)據(jù)塊單元中的方法包括以下步驟:
步驟401:根據(jù)待存儲數(shù)據(jù)的大小和目標(biāo)數(shù)據(jù)塊單元的數(shù)據(jù)塊22存儲的目標(biāo)數(shù)據(jù)的大小,判斷目標(biāo)數(shù)據(jù)塊單元的數(shù)據(jù)塊22的剩余容量是否充足。
步驟402:如果目標(biāo)數(shù)據(jù)塊單元的數(shù)據(jù)塊22的剩余容量充足,則將待存儲數(shù)據(jù)劃分為多個數(shù)據(jù)段,依次對每個數(shù)據(jù)段,將數(shù)據(jù)段寫入目標(biāo)數(shù)據(jù)塊單元的數(shù)據(jù)塊22中,并將數(shù)據(jù)段的數(shù)據(jù)信息寫入目標(biāo)數(shù)據(jù)塊單元的元數(shù)據(jù)塊21中。
具體地,當(dāng)目標(biāo)數(shù)據(jù)塊單元的數(shù)據(jù)塊22的剩余容量充足時,根據(jù)數(shù)據(jù)塊單元2的塊號確定其元數(shù)據(jù)塊21的起始偏移,讀取元數(shù)據(jù)塊21到內(nèi)存,得到數(shù)據(jù)塊單元2的數(shù)據(jù)塊22的已使用容量,計算得到待存儲數(shù)據(jù)的起始地址,并寫入數(shù)據(jù)。在內(nèi)存記錄的元數(shù)據(jù)塊21中增加一條段信息并進行填充,將內(nèi)存中的元數(shù)據(jù)塊21重新寫回到存儲設(shè)備該塊對應(yīng)的元數(shù)據(jù)塊21上,釋放內(nèi)存中的元數(shù)據(jù)塊21。
步驟403:如果目標(biāo)數(shù)據(jù)塊單元的數(shù)據(jù)塊22的剩余容量不充足,則將目標(biāo)數(shù) 據(jù)塊22從未滿塊鏈表中刪除,然后重新確定目標(biāo)數(shù)據(jù)塊單元,并執(zhí)行步驟401判斷確定的目標(biāo)數(shù)據(jù)塊單元的數(shù)據(jù)塊22的剩余容量是否充足,當(dāng)剩余容量充足時執(zhí)行步驟402寫入數(shù)據(jù);如果沒有找到合適的目標(biāo)數(shù)據(jù)塊單元,則確定寫入失敗。
雖然本發(fā)明所公開的實施方式如上,但所述的內(nèi)容只是為了便于理解本發(fā)明而采用的實施方式,并非用以限定本發(fā)明。任何本發(fā)明所屬技術(shù)領(lǐng)域內(nèi)的技術(shù)人員,在不脫離本發(fā)明所公開的精神和范圍的前提下,可以在實施的形式上及細(xì)節(jié)上作任何的修改與變化,但本發(fā)明的保護范圍,仍須以所附的權(quán)利要求書所界定的范圍為準(zhǔn)。