本申請涉及計算機技術領域,尤其涉及一種數據存儲方法、讀取方法、刪除方法和數據操作系統。
背景技術:
ceph指的是一個開源的分布式統一存儲系統,ceph的設計目標是在廉價的存儲介質上構建一套高性能、高擴展性和高可用性的存儲系統,對外提供文件存儲、塊存儲和對象存儲的一套統一存儲系統。
然而基于ceph的存儲介質在存儲數據時,由于用戶可能會對相同的數據存儲多次,那么相應的在存儲介質上便會存儲多份相同的數據,這無疑浪費了存儲介質的存儲空間。
技術實現要素:
有鑒于此,本申請提供一種數據存儲方法、讀取方法、刪除方法和數據操作系統,以節省存儲介質的存儲空間。技術方案如下:
基于本申請的一方面,本申請提供一種數據存儲方法,包括:
確定欲存儲的第一數據塊,以及所述第一數據塊的第一標識;
判斷存儲的哈希值與對象標識的對應關系中,是否包括所述第一標識;其中所述哈希值與對象標識的對應關系中的對象標識為已存儲數據塊的標識;
如果包括,則依據所述第一數據塊的數據塊長度以及所述第一標識對應的已存在的第二數據塊的數據塊長度,確定對所述第一數據塊執行的寫操作類型,并對所述第一數據塊采用所述寫操作類型對應的寫操作方法進行處理,得到目標數據塊;
如果不包括,則確定所述第一數據塊為目標數據塊;
計算所述目標數據塊的目標哈希值;
若在所述哈希值與對象標識的對應關系中,查找到所述目標哈希值,則不存儲所述目標數據塊,并依據所述目標哈希值查找到所述目標哈希值對應的原始數據塊,將所述原始數據塊中的引用計數值加一;
若在所述哈希值與對象標識的對應關系中,未查找到所述目標哈希值,則在所述哈希值與對象標識的對應關系中,增加所述目標哈希值與所述第一標識的對應關系,并對所述目標數據塊進行壓縮處理,存儲壓縮處理后的目標數據塊,以及將所述目標數據塊中的引用計數值加一。
優選地,所述依據所述第一數據塊的數據塊長度以及所述第一標識對應的已存在的第二數據塊的數據塊長度,確定對所述第一數據塊執行的寫操作類型包括:
所述第一數據塊的數據塊長度等于所述第一標識對應的已存在的第二數據塊的數據塊長度時,確定對所述第一數據塊執行的寫操作類型為重寫;
所述第一數據塊的數據塊長度小于所述第一標識對應的已存在的第二數據塊的數據塊長度時,確定對所述第一數據塊執行的寫操作類型為修改寫。
優選地,當確定對所述第一數據塊執行的寫操作類型為重寫時,所述對所述第一數據塊采用所述寫操作類型對應的寫操作方法進行處理,得到目標數據塊包括:
從所述哈希值與對象標識的對應關系中,刪除所述第一標識與所述第二數據塊的哈希值的對應關系,并將所述第二數據塊中的引用計數值減一;
確定所述第一數據塊為目標數據塊。
優選地,當確定對所述第一數據塊執行的寫操作類型為修改寫時,所述對所述第一數據塊采用所述寫操作類型對應的寫操作方法進行處理,得到目標數據塊包括:
從所述哈希值與對象標識的對應關系中,刪除所述第一標識與所述第二數據塊的哈希值的對應關系,并將所述第二數據塊中的引用計數值減一;
解壓縮所述第二數據塊,得到所述第二數據塊的第二數據內容;
合并所述第二數據內容與所述第一數據塊的第一數據內容,并將合并后得到的數據塊確定為目標數據塊。
優選地,所述方法還包括:
當所述第二數據塊中的引用計數值為0時,刪除所述第二數據塊。
基于本申請的另一方面,本申請還提供一種數據讀取方法,包括:
確定欲讀取的目標數據塊的目標標識;
從存儲的哈希值與對象標識的對應關系中,獲取與所述目標標識對應的目標哈希值;
基于所述目標哈希值獲取所述目標數據塊;
解壓縮所述目標數據塊,讀取所述目標數據塊的數據。
優選地,所述確定欲讀取的目標數據塊的目標標識之后,所述方法還包括:
判斷所述哈希值與對象標識的對應關系中,是否包括所述目標標識;其中所述哈希值與對象標識的對應關系中的對象標識為已存儲數據塊的標識;
如果包括,執行所述從存儲的哈希值與對象標識的對應關系中,獲取與所述目標標識對應的目標哈希值的步驟;
如果不包括,反饋錯誤提示信息,其中,所述錯誤提示信息用于表示存儲設備中不存在所述目標標識。
基于本申請的再一方面,本申請還提供一種數據刪除方法,包括:
確定欲刪除的目標數據塊的目標標識;
從存儲的哈希值與對象標識的對應關系中,獲取與所述目標標識對應的目標哈希值;
從存儲的哈希值與對象標識的對應關系中,刪除所述目標標識與所述目標哈希值的對應記錄;
基于所述目標哈希值獲取所述目標數據塊,將所述目標數據塊中的引用計數值減一。
優選地,所述方法還包括:
當所述目標數據塊中的引用計數值為0時,刪除所述目標數據塊。
優選地,所述確定欲刪除的目標數據塊的目標標識之后,所述方法還包括:
判斷所述哈希值與對象標識的對應關系中,是否包括所述目標標識;其中所述哈希值與對象標識的對應關系中的對象標識為已存儲數據塊的標識;
如果包括,執行所述從存儲的哈希值與對象標識的對應關系中,獲取與所述目標標識對應的目標哈希值的步驟;
如果不包括,反饋錯誤提示信息,其中,所述錯誤提示信息用于表示存儲設備中不存在所述目標標識。
基于本申請的再一方面,本申請還提供一種數據操作系統,包括:
終端,用于發送文件到分布式設備;
分布式設備,用于對文件執行池化操作獲得多個數據塊,其中每個數據塊的首部包括元數據信息,所述元數據信息包含數據塊的引用計數信息,以及設置哈希值與對象標識的對應關系,利用所述哈希值與對象標識的對應關系,執行數據存儲操作、數據讀取操作以及數據刪除操作。
本申請在存儲數據時,如果哈希值與對象標識的對應關系中已包括目標數據塊的目標哈希值,則不再存儲目標數據塊,而是將目標哈希值對應的原始數據塊中的引用計數值加一,而如果哈希值與對象標識的對應關系中不包括目標數據塊的目標哈希值,則存儲所述目標哈希值與第一標識的對應關系,并對目標數據塊進行壓縮處理,存儲壓縮處理后的目標數據塊。本申請在數據存儲過程中針對多份相同的數據不會重復存儲,保證存儲空間僅存儲一份相同的數據,節省了存儲介質的存儲空間。且本申請在存儲數據時,存儲的是壓縮處理后的數據塊,這相比于現有技術直接存儲數據的手段,本申請減少了數據塊所需的存儲空間,節省了存儲介質的存儲空間。
附圖說明
為了更清楚地說明本申請實施例或現有技術中的技術方案,下面將對實施例或現有技術描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本申請的實施例,對于本領域普通技術人員來講,在不付出創造性勞動的前提下,還可以根據提供的附圖獲得其他的附圖。
圖1為本申請實施例提供的一種數據操作系統的結構示意圖;
圖2為本申請中osd端存儲的數據塊的格式示意圖;
圖3為本申請實施例提供的一種數據存儲方法的流程圖;
圖4為本申請實施例提供的一種數據讀取方法的流程圖;
圖5為本申請實施例提供的一種數據刪除方法的流程圖。
具體實施方式
下面將結合本申請實施例中的附圖,對本申請實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本申請一部分實施例,而不是全部的實施例。基于本申請中的實施例,本領域普通技術人員在沒有做出創造性勞動前提下所獲得的所有其他實施例,都屬于本申請保護的范圍。
術語解釋:
分布式存儲:將數據分散存儲到多個數據存儲服務器上。
pg:placementgroups,放置組。分布式設備中的虛擬概念。
osd:object-basedstoragedevice,對象存儲設備。
哈希值:在本實施例中對對象執行哈希操作后得到的數據值,稱為哈希值。
為了方便本領域技術人員了解本申請的應用場景,提供了一種數據操作系統。參見圖1,具體包括終端100和分布式設備200。
終端100用于發送文件至分布式設備200。
分布式設備200用于對文件執行池化操作獲得多個數據塊(oid),其每個數據塊具有一個對象標識(oid_id)。其中每個數據塊的首部包括元數據信息,所述元數據信息包含數據塊的引用計數信息,以及分布式設備200設置有哈希值與對象標識的對應關系,利用哈希值與對象標識的對應關系,執行數據存儲操作、數據刪除操作以及數據讀取操作。
本申請中,數據塊會在執行重刪后,再進行壓縮處理,由于壓縮后的數據塊的長度并不一致,因此在osd端存儲的數據塊的長度不是固定的。其中,數據塊存儲在osd端的格式如圖2所示,每一個數據塊的大小都不是固定長度。特別地,本申請在數據塊的首部增加了元數據信息,該元數據信息包含該數據塊的引用計數、所用哈希算法和壓縮算法等信息,后端存儲了壓縮處理后的數據塊的真實數據。
引用計數表示相同數據的存儲次數,亦表示數據塊被重復存儲的次數。
分布式設備200中存儲有哈希值與對象標識的對應關系。哈希值為對數據塊執行哈希操作后得到的數據值,用于唯一表示一個數據塊。對象標識為分布式設備中表示一個數據塊的標識。在分布式設備中,當一個數據塊被存儲至osd后,在哈希值與對象標識的對應關系中建立該數據塊的對象標識和哈希值的對應關系。
具體地,分布式設備200可以利用指紋庫存儲哈希值與對象標識的對應關系。指紋庫是通過一個分布式kv(key-value,鍵值)數據庫實現,存儲了數據塊hash數值與數據塊標識oid間的對應關系。在分布式實現方案中,為了避免單點故障導致指紋數據丟失的問題,在各個客戶端以及各個存儲節點上基于redis建立一個分布式數據庫,用來存儲kv數據庫。redis作為一個可靠的分布式數據庫,能夠使數據指紋在各個客戶端保持數據一致性,同步效率比較高,且能夠保證單個存儲節點指紋數據出現故障時,在環境重啟時恢復指紋數據。
本申請針對ceph構建一套分布式重刪壓縮存儲方法,對原始數據流下發過程中的數據塊的對象標識(oid_id)進行劫持并進行重定向,繼而執行后續重刪壓縮存儲操作。本申請中操作的輸入對象是ceph中的數據分塊(以下簡稱數據塊),數據重刪將以數據塊為對象執行重刪,數據壓縮則對需要存儲的數據塊進行壓縮,進而下發到后端存儲(硬盤)中存儲。
本申請提供的數據存儲方法、數據讀取方法和數據刪除方法在rados層中實現,對上層rbd、rgw和文件系統透明,無需要修改上層代碼。
具體參閱圖1,其示出了本申請提供的一種數據存儲方法的流程圖,包括:
步驟101,確定欲存儲的第一數據塊,以及所述第一數據塊的第一標識。
步驟102,判斷存儲的哈希值與對象標識的對應關系中,是否包括所述第一標識。如果包括,執行步驟103,如果不包括,執行步驟104。其中所述哈希值與對象標識的對應關系中的對象標識為已存儲數據塊的標識。
分布式設備200中存儲有哈希值與對象標識的對應關系,該哈希值與對象標識的對應關系可以具體為一表格。基于該表格可以查找其上是否存在第一標識。如果存在,則說明當前底層已存儲有具有第一標識的數據塊。
步驟103,依據所述第一數據塊的數據塊長度以及所述第一標識對應的已存在的第二數據塊的數據塊長度,確定對所述第一數據塊執行的寫操作類型,并對所述第一數據塊采用所述寫操作類型對應的寫操作方法進行處理,得到目標數據塊。
本申請中的寫操作類型可以包括重寫和修改寫。
重寫指的是待寫入的數據塊(即第一數據塊)在存儲系統中存在,但是該待寫入的數據塊的數據塊長度等于存儲系統中已存在的數據塊的數據塊長度,要將該待寫入的數據塊整塊覆蓋掉存儲系統中已存在的數據塊。
修改寫指的是待寫入的數據塊(即第一數據塊)在存儲系統中存在,且該待寫入的數據塊的數據塊長度只是存儲系統中已存在的數據塊的數據塊長度中的一部分。
由此,當第一數據塊的數據塊長度等于第一標識對應的已存在的第二數據塊的數據塊長度時,確定對所述第一數據塊執行的寫操作類型為重寫;當第一數據塊的數據塊長度小于第一標識對應的已存在的第二數據塊的數據塊長度時,確定對所述第一數據塊執行的寫操作類型為修改寫。
具體地,當確定對所述第一數據塊執行的寫操作類型為重寫時,本申請從哈希值與對象標識的對應關系中,刪除所述第一標識與所述第二數據塊的哈希值的對應關系,并將所述第二數據塊中的引用計數值減一。且確定該重寫入的第一數據塊為目標數據塊。
當確定對所述第一數據塊執行的寫操作類型為修改寫時,本申請從哈希值與對象標識的對應關系中,刪除所述第一標識與所述第二數據塊的哈希值的對應關系,并將所述第二數據塊中的引用計數值減一。同時從底層獲取第二數據塊,解壓縮所述第二數據塊,得到所述第二數據塊的第二數據內容。進而合并所述第二數據內容與所述第一數據塊的第一數據內容,并將合并后得到的數據塊確定為目標數據塊。
本申請中涉及的合并處理過程會根據第二數據內容與第一數據內容的不同而不同。例如,若第一數據內容是對第二數據內容中的部分數據進行替換,則將第一數據內容替換掉第二數據內容中相應部分的部分數據內容。若第一數據內容是對第二數據內容增加部分內容,則在第二數據內容中增加第一數據內容。本申請中對于數據合并的處理方法為現有成熟技術,申請人在此不再贅述。
特別地在本申請中,當第二數據塊中的引用計數值為0時,本申請直接刪除所述第二數據塊。
步驟104,確定所述第一數據塊為目標數據塊。
如果哈希值與對象標識的對應關系中不包括所述第一標識,直接確定該第一數據塊為目標數據塊。
步驟105,計算所述目標數據塊的目標哈希值。
本申請采用預置的哈希算法計算所述目標數據塊的目標哈希值,針對該目標數據塊采用的哈希算法信息會存儲在目標數據塊的首部元數據信息中。
步驟106,若在所述哈希值與對象標識的對應關系中,查找到所述目標哈希值,則不存儲所述目標數據塊,并依據所述目標哈希值查找到所述目標哈希值對應的原始數據塊,將所述原始數據塊中的引用計數值加一。
優選地,本申請還可以存儲所述目標哈希值與所述第一標識的對應關系。
步驟107,若在所述哈希值與對象標識的對應關系中,未查找到所述目標哈希值,則在所述哈希值與對象標識的對應關系中,增加所述目標哈希值與所述第一標識的對應關系,并對所述目標數據塊進行壓縮處理,存儲壓縮處理后的目標數據塊,以及將所述目標數據塊中的引用計數值加一。
本申請在存儲所述目標哈希值與所述第一標識的對應關系時,會將該目標哈希值與第一標識的對應關系同步更新到kv數據庫中。
為了避免存儲重復,本申請在計算得到所述目標數據塊的目標哈希值后,對目標數據塊進行存儲之前,首先在哈希值與對象標識的對應關系中,查找是否包括所述目標哈希值。若包括,則表示目標數據塊已經存儲至osd中;若不包括,則表示目標數據塊未存儲至osd中。
本申請中,若在哈希值與對象標識的對應關系中,查找到所述目標哈希值,則表示目標數據塊已經存儲過,因此為了避免重復存儲,不再存儲所述目標數據塊,并依據目標哈希值查找到所述目標哈希值對應的原始數據塊,將所述原始數據塊中的引用計數值加一,以表示所述目標數據塊又被存儲一次。
作為本申請優選地,如果在哈希值與對象標識的對應關系中,不存在所述目標哈希值與所述第一標識的對應關系,則在哈希值與對象標識的對應關系中增加所述目標哈希值與所述第一標識的對應關系,即實現對該目標哈希值與第一標識的對應關系的存儲。
若在哈希值與對象標識的對應關系中,未查找到所述目標哈希值,則表示目標數據塊未存儲在osd中。因此,存儲所述目標哈希值與所述第一標識的對應關系,即在哈希值與對象標識的對應關系中增加所述目標哈希值與所述第一標識的對應關系,并對所述目標數據塊進行壓縮處理,進而基于目標哈希值確定目標數據塊的存儲區域(目標osd),將壓縮處理后的目標數據塊存儲至確定的存儲區域。同時,本申請將所述目標數據塊中的引用計數值加一。對于首次存儲的數據塊而言,其引用計數值加一后的具體數值為1。
需要說明的是,對于本申請步驟107中涉及的對所述目標數據塊進行壓縮處理的步驟,也可在步驟105之后執行,即計算所述目標數據塊的目標哈希值后,便對目標數據塊進行壓縮處理,本申請對此執行順序不作限定。
本申請上述實施例提供了數據的重刪壓縮存儲實現方法,重刪系統采用在線、定長、塊級、源端重刪的方法,在寫入數據塊時,重刪執行完畢后,再對數據塊進行壓縮處理,進而發送到osd端存儲。
因此應用本申請提供的數據存儲方法,在存儲數據時,如果哈希值與對象標識的對應關系中已包括目標數據塊的目標哈希值,則不再存儲目標數據塊,而是將目標哈希值對應的原始數據塊中的引用計數值加一,而如果哈希值與對象標識的對應關系中不包括目標數據塊的目標哈希值,則存儲所述目標哈希值與第一標識的對應關系,并對目標數據塊進行壓縮處理,存儲壓縮處理后的目標數據塊。本申請在數據存儲過程中針對多份相同的數據不會重復存儲,保證存儲空間僅存儲一份相同的數據,節省了存儲介質的存儲空間。且本申請在存儲數據時,存儲的是壓縮處理后的數據塊,這相比于現有技術直接存儲數據的手段,減少了數據塊所需的存儲空間,節省了存儲介質的存儲空間。
基于本申請上述實施例,在圖3所示的數據存儲方法的基礎上,本申請還提供了數據讀取方法,如圖4所示,包括:
步驟201,確定欲讀取的目標數據塊的目標標識。
步驟202,判斷所述哈希值與對象標識的對應關系中,是否包括所述目標標識。如果包括,執行步驟203,如果不包括,執行步驟206。其中所述哈希值與對象標識的對應關系中的對象標識為已存儲數據塊的標識。
步驟203,從存儲的哈希值與對象標識的對應關系中,獲取與所述目標標識對應的目標哈希值。
步驟204,基于所述目標哈希值獲取所述目標數據塊。
本申請中,通過所述目標哈希值計算得到pg標識,通過pg標識計算得到osd標識,利用osd標識在osd中獲取目標數據塊。對于本申請步驟204的具體實現方法現有技術已非常成熟,申請人在此不再贅述。
步驟205,解壓縮所述目標數據塊,讀取所述目標數據塊的數據。
步驟206,反饋錯誤提示信息,其中,所述錯誤提示信息用于表示存儲設備中不存在所述目標標識。
若所述哈希值與對象標識的對應關系中不包括所述目標標識,則表示未存儲過所述目標標識對應的目標數據塊,因此向終端反饋錯誤提示信息,以提示用戶目標標識有誤。
基于本申請上述實施例,在圖3所示的數據存儲方法的基礎上,本申請還提供了數據刪除方法,如圖5所示,包括:
步驟301,確定欲刪除的目標數據塊的目標標識。
步驟302,判斷哈希值與對象標識的對應關系中,是否包括所述目標標識。如果包括,執行步驟303,如果不包括,執行步驟306。其中所述哈希值與對象標識的對應關系中的對象標識為已存儲數據塊的標識。
步驟303,從哈希值與對象標識的對應關系中,獲取與所述目標標識對應的目標哈希值。
步驟304,從存儲的哈希值與對象標識的對應關系中,刪除所述目標標識與所述目標哈希值的對應記錄。
步驟305,基于所述目標哈希值獲取所述目標數據塊,將所述目標數據塊中的引用計數值減一。
特別地,當所述目標數據塊中的引用計數值為0時,說明所有用戶均已經刪除目標哈希值對應的目標對象,由此可以刪除所述目標數據塊,以釋放存儲介質的存儲空間。
步驟306,反饋錯誤提示信息。其中,所述錯誤提示信息用于表示存儲設備中不存在所述目標標識。
若所述哈希值與對象標識的對應關系中不包括所述目標標識,則表示未存儲過所述目標標識對應的目標數據塊,因此向終端反饋錯誤提示信息,以提示用戶目標標識有誤。
本實施例方法所述的功能如果以軟件功能單元的形式實現并作為獨立的產品銷售或使用時,可以存儲在一個計算設備可讀取存儲介質中。基于這樣的理解,本申請實施例對現有技術做出貢獻的部分或者該技術方案的部分可以以軟件產品的形式體現出來,該軟件產品存儲在一個存儲介質中,包括若干指令用以使得一臺計算設備(可以是個人計算機,服務器,移動計算設備或者網絡設備等)執行本申請各個實施例所述方法的全部或部分步驟。而前述的存儲介質包括:u盤、移動硬盤、只讀存儲器(rom,read-onlymemory)、隨機存取存儲器(ram,randomaccessmemory)、磁碟或者光盤等各種可以存儲程序代碼的介質。
本說明書中各個實施例采用遞進的方式描述,每個實施例重點說明的都是與其它實施例的不同之處,各個實施例之間相同或相似部分互相參見即可。
對所公開的實施例的上述說明,使本領域專業技術人員能夠實現或使用本申請。對這些實施例的多種修改對本領域的專業技術人員來說將是顯而易見的,本文中所定義的一般原理可以在不脫離本申請的精神或范圍的情況下,在其它實施例中實現。因此,本申請將不會被限制于本文所示的這些實施例,而是要符合與本文所公開的原理和新穎特點相一致的最寬的范圍。