本申請(qǐng)涉及數(shù)據(jù)存儲(chǔ)技術(shù)領(lǐng)域,尤其涉及一種數(shù)據(jù)塊的多副本存儲(chǔ)方法、存儲(chǔ)設(shè)備、數(shù)據(jù)讀取方法。
背景技術(shù):
數(shù)據(jù)安全是計(jì)算機(jī)以及網(wǎng)絡(luò)等學(xué)科的重要研究課題之一,它不僅關(guān)系到個(gè)人、企業(yè),更重要的是它可能直接影響國家安全,因此對(duì)于重要的數(shù)據(jù),需要進(jìn)行備份等操作,避免由于底層存儲(chǔ)異常導(dǎo)致數(shù)據(jù)丟失,例如避免由于raid(redundantarraysofindependentdisks,獨(dú)立磁盤冗余陣列)故障丟失數(shù)據(jù)。
針對(duì)上述場(chǎng)景需求,現(xiàn)有技術(shù)中有多種解決方案,例如,數(shù)據(jù)備份、數(shù)據(jù)鏡像、雙活、以及遠(yuǎn)程復(fù)制等。但是存在的問題是,目前重要數(shù)據(jù)和非重要數(shù)據(jù)一般位于同一個(gè)lun(logicalunitnumber,邏輯單元)上,很難進(jìn)行分離,因此只能針對(duì)整個(gè)lun進(jìn)行備份等操作,那么很多非重要數(shù)據(jù)也會(huì)被順帶一起備份等操作,就會(huì)導(dǎo)致存儲(chǔ)空間的嚴(yán)重浪費(fèi)。
為解決上述備份等操作中存儲(chǔ)空間浪費(fèi)的問題,現(xiàn)有技術(shù)中提出一種針對(duì)文件級(jí)別的數(shù)據(jù)的處理方案,即使用特定軟件針對(duì)部分重要的文件進(jìn)行備份等操作。這種方法可以在很大程度上節(jié)省存儲(chǔ)空間,但是存在的問題是如果文件損壞,需要通過對(duì)應(yīng)的軟件來進(jìn)行修復(fù),必須等待文件從備份數(shù)據(jù)中修復(fù)之后,才能恢復(fù)業(yè)務(wù),該修復(fù)過程需要一定的時(shí)間,對(duì)于業(yè)務(wù)的連續(xù)性造成一定的影響。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本申請(qǐng)?zhí)峁┮环N數(shù)據(jù)塊的多副本存儲(chǔ)方法、存儲(chǔ)設(shè)備、數(shù)據(jù)讀取方法,在確保數(shù)據(jù)高可靠性的前提下,解決了現(xiàn)有技術(shù)中數(shù)據(jù)備份等操作導(dǎo)致的存儲(chǔ)資源浪費(fèi)以及文件修復(fù)造成的業(yè)務(wù)連續(xù)性受損的技術(shù)問題。
具體地,本申請(qǐng)是通過如下技術(shù)方案實(shí)現(xiàn)的:
第一方面,本申請(qǐng)實(shí)施例提供了一種數(shù)據(jù)塊的多副本存儲(chǔ)方法,應(yīng)用于存儲(chǔ)設(shè)備,所述方法包括如下步驟:
接收用于對(duì)數(shù)據(jù)塊執(zhí)行寫操作的scsi寫命令;
從所述scsi寫命令中獲取指定字段,所述指定字段用于指示所述數(shù)據(jù)塊的副本的數(shù)量;
根據(jù)所述指定字段指示的數(shù)量寫入所述數(shù)據(jù)塊的副本。
可選地,所述根據(jù)所述指定字段指示的數(shù)量寫入所述數(shù)據(jù)塊的副本包括如下步驟:
確定所述數(shù)據(jù)塊寫入的raid;
從除所述raid之外的raid中選擇與所述數(shù)量相同的raid,將所述副本分別寫入至選擇的各個(gè)raid。
可選地,所述方法還包括如下步驟:
在所述數(shù)據(jù)塊對(duì)應(yīng)的元數(shù)據(jù)中設(shè)置副本標(biāo)識(shí),并利用所述元數(shù)據(jù)記錄所述副本的位置。
可選地,所述指定字段指示的數(shù)據(jù)塊的副本數(shù)量是由與所述存儲(chǔ)設(shè)備連接的外部服務(wù)器依據(jù)用戶發(fā)送的拷貝命令設(shè)置,所述拷貝命令中包含數(shù)據(jù)塊的副本數(shù)量。
可選地,所述指定字段指示的數(shù)據(jù)塊的副本數(shù)量是由與所述存儲(chǔ)設(shè)備連接的外部服務(wù)器依據(jù)從本地?cái)?shù)據(jù)輸入端口獲取的副本數(shù)量設(shè)置。
第二方面,本申請(qǐng)實(shí)施例提供了一種存儲(chǔ)設(shè)備,所述設(shè)備包括:
命令接收單元,用于接收用于對(duì)數(shù)據(jù)塊執(zhí)行寫操作的scsi寫命令;
字段獲取單元,用于從所述scsi寫命令中獲取指定字段,所述指定字段用于指示所述數(shù)據(jù)塊的副本的數(shù)量;
數(shù)據(jù)寫入單元,用于根據(jù)所述指定字段指示的數(shù)量寫入所述數(shù)據(jù)塊的副本。
可選地,所述數(shù)據(jù)寫入單元包括:
數(shù)據(jù)塊raid確定子單元,用于確定所述數(shù)據(jù)塊寫入的raid;
寫入子單元,用于從除所述raid之外的raid中選擇與所述數(shù)量相同的raid,并將所述副本分別寫入至選擇的各個(gè)raid。
可選地,所述存儲(chǔ)設(shè)備還包括元數(shù)據(jù)記錄標(biāo)識(shí)單元,所述元數(shù)據(jù)記錄標(biāo)識(shí)單元用于在所述數(shù)據(jù)塊對(duì)應(yīng)的元數(shù)據(jù)中設(shè)置副本標(biāo)識(shí),并利用所述元數(shù)據(jù)記錄所述副本的位置。
第三方面,本申請(qǐng)實(shí)施例提供了一種數(shù)據(jù)讀取方法,所述方法包括如下步驟:
接收數(shù)據(jù)塊讀取指令;
根據(jù)所述數(shù)據(jù)塊讀取指令確定所要讀取的數(shù)據(jù)塊的位置;
從所述數(shù)據(jù)塊的位置開始讀取所述數(shù)據(jù)塊;若讀取失敗,則判斷所述數(shù)據(jù)塊是否具有副本標(biāo)識(shí);其中,所述副本標(biāo)識(shí)用于指示所述數(shù)據(jù)塊具有副本;
若所述數(shù)據(jù)塊具有所述副本標(biāo)識(shí),則查找所述數(shù)據(jù)塊的副本的位置,并根據(jù)所述副本的位置讀取所述數(shù)據(jù)塊的副本。
第四方面,本申請(qǐng)實(shí)施例提供了一種存儲(chǔ)設(shè)備,所述存儲(chǔ)設(shè)備包括:
指令接收單元,用于接收數(shù)據(jù)塊讀取指令;
位置確定單元,用于根據(jù)所述數(shù)據(jù)塊讀取指令確定所要讀取的數(shù)據(jù)塊的位置;
數(shù)據(jù)讀取單元,用于從所述數(shù)據(jù)塊的位置開始讀取所述數(shù)據(jù)塊;
若讀取失敗,所述數(shù)據(jù)讀取單元還用于則判斷所述數(shù)據(jù)塊是否具有副本標(biāo)識(shí);若所述數(shù)據(jù)塊具有所述副本標(biāo)識(shí),則查找所述數(shù)據(jù)塊的副本的位置,并根據(jù)所述副本的位置讀取所述數(shù)據(jù)塊的副本;其中,所述副本標(biāo)識(shí)用于指示所述數(shù)據(jù)塊具有副本。
由上述技術(shù)方案可知,本申請(qǐng)實(shí)施例在存儲(chǔ)數(shù)據(jù)時(shí),存儲(chǔ)設(shè)備從接收的scsi寫命令中獲取指定字段,并根據(jù)指定字段指示的副本的數(shù)量寫入數(shù)據(jù)塊的副本。本申請(qǐng)能夠以數(shù)據(jù)塊為單位形成多副本,保證了重要數(shù)據(jù)的高可靠性,同時(shí)避免了對(duì)整個(gè)lun進(jìn)行備份、鏡像等操作,極大地節(jié)省了存儲(chǔ)設(shè)備的存儲(chǔ)空間。
本發(fā)明申請(qǐng)實(shí)施例在讀取數(shù)據(jù)塊時(shí),存儲(chǔ)設(shè)備根據(jù)數(shù)據(jù)塊讀取指令從數(shù)據(jù)塊的位置開始讀取數(shù)據(jù)塊。若讀取失敗,則判斷該數(shù)據(jù)塊是否具有副本,若該數(shù)據(jù)塊具有副本,則從副本的位置處讀取該數(shù)據(jù)塊的副本。本申請(qǐng)?jiān)跀?shù)據(jù)塊讀取失敗時(shí),能夠直接利用存儲(chǔ)設(shè)備自動(dòng)檢測(cè)副本并讀取副本,整個(gè)數(shù)據(jù)讀取過程的最長時(shí)間是毫秒量級(jí)的,完全避免了現(xiàn)有技術(shù)中利用修復(fù)軟件修復(fù)文件等操作造成的業(yè)務(wù)連續(xù)性受損的缺陷,大大提高了副本讀取的流暢性,提高了用戶體驗(yàn)度。
附圖說明
圖1是本申請(qǐng)一示例性實(shí)施例示出的一種數(shù)據(jù)塊的多副本存儲(chǔ)方法流程框圖;
圖2是本申請(qǐng)一示例性實(shí)施例示出的另一種數(shù)據(jù)塊的多副本存儲(chǔ)方法流程框圖;
圖3是本申請(qǐng)一示例性實(shí)施例示出的一種數(shù)據(jù)讀取方法流程框圖;
圖4是本申請(qǐng)一示例性實(shí)施例示出的另一種數(shù)據(jù)讀取方法流程框圖;
圖5是本申請(qǐng)一示例性實(shí)施例示出的一種存儲(chǔ)設(shè)備框圖;
圖6是本申請(qǐng)一示例性實(shí)施例示出的另一種存儲(chǔ)設(shè)備框圖;
圖7~圖11是本申請(qǐng)實(shí)施例中scsi寫命令中指定地段位置示意圖。
具體實(shí)施方式
這里將詳細(xì)地對(duì)示例性實(shí)施例進(jìn)行說明,其示例表示在附圖中。下面的描述涉及附圖時(shí),除非另有表示,不同附圖中的相同數(shù)字表示相同或相似的要素。以下示例性實(shí)施例中所描述的實(shí)施方式并不代表與本申請(qǐng)相一致的所有實(shí)施方式。相反,它們僅是與如所附權(quán)利要求書中所詳述的、本申請(qǐng)的一些方面相一致的裝置和方法的例子。
在本申請(qǐng)使用的術(shù)語是僅僅出于描述特定實(shí)施例的目的,而非旨在限制本申請(qǐng)。在本申請(qǐng)和所附權(quán)利要求書中所使用的單數(shù)形式的“一種”、“所述”和“該”也旨在包括多數(shù)形式,除非上下文清楚地表示其他含義。還應(yīng)當(dāng)理解,本文中可能使用到的術(shù)語“和/或”是指并包含一個(gè)或多個(gè)相關(guān)聯(lián)的列出項(xiàng)目的任何或所有可能組合。
應(yīng)當(dāng)理解,盡管在本申請(qǐng)可能采用術(shù)語第一、第二、第三等來描述各種信息,但這些信息不應(yīng)限于這些術(shù)語。這些術(shù)語僅用來將同一類型的信息彼此區(qū)分開。例如,在不脫離本申請(qǐng)范圍的情況下,第一信息也可以被稱為第二信息,類似地,第二信息也可以被稱為第一信息。取決于語境,如在此所使用的詞語“如果”可以被解釋成為“在……時(shí)”或“當(dāng)……時(shí)”或“響應(yīng)于確定”。
為方便理解,本申請(qǐng)先對(duì)下文中可能用到的名詞進(jìn)行說明。
raid:redundantarraysofindependentdisks,獨(dú)立磁盤冗余陣列,其是由很多價(jià)格較便宜的磁盤,組合成一個(gè)容量巨大的磁盤組,利用個(gè)別磁盤提供數(shù)據(jù)所產(chǎn)生加成效果提升整個(gè)磁盤系統(tǒng)效能。
scsi:smallcomputersysteminterface,是一種主機(jī)和存儲(chǔ)設(shè)備之間傳送命令、狀態(tài)和塊數(shù)據(jù)等通信操作的規(guī)范的集合。
sbc:scsiblockcommands,scsi塊設(shè)備指令集。
metadata:元數(shù)據(jù),一種記錄管理相關(guān)信息的數(shù)據(jù),也可以理解為是一種用來描述數(shù)據(jù)的數(shù)據(jù),元數(shù)據(jù)存儲(chǔ)在存儲(chǔ)設(shè)備上,例如,lun的元數(shù)據(jù)存儲(chǔ)在raid上。
為解決現(xiàn)有技術(shù)中由備份、鏡像等操作造成的存儲(chǔ)資源浪費(fèi)的技術(shù)問題,本申請(qǐng)實(shí)施例提供了一種數(shù)據(jù)塊的多副本存儲(chǔ)方法,應(yīng)用于存儲(chǔ)設(shè)備,如圖1所示,該方法包括如下步驟:
s11、接收用于對(duì)數(shù)據(jù)塊執(zhí)行寫操作的scsi寫命令;
該步驟s11中,執(zhí)行一次scsi寫命令可以形成一個(gè)數(shù)據(jù)塊;
s12、從scsi寫命令中獲取指定字段,指定字段用于指示數(shù)據(jù)塊的副本的數(shù)量;
具體地,可以利用該指定字段對(duì)應(yīng)的字節(jié)的預(yù)定位來指示副本的數(shù)量,其中預(yù)定位中設(shè)置為二進(jìn)制數(shù)據(jù),利用設(shè)置的二進(jìn)制數(shù)據(jù)指示副本的數(shù)量。例如利用該指定字段對(duì)應(yīng)的字節(jié)的第5、6位來定義需要寫入的副本的數(shù)量,如果該字節(jié)的第5、6位設(shè)置為01表示該數(shù)據(jù)塊需要寫入的副本的數(shù)量為1個(gè),如果該字節(jié)的第5、6位設(shè)置為10表示該數(shù)據(jù)塊需要寫入的副本的數(shù)量為2個(gè),如果該字節(jié)的第5、6位設(shè)置為11表示該數(shù)據(jù)塊需要寫入的副本的數(shù)量為3個(gè)。當(dāng)然該指定字段對(duì)應(yīng)的字節(jié)的第5、6位還可以設(shè)置為00,表示該數(shù)據(jù)塊不需要寫入副本。副本的具體份數(shù)可以根據(jù)在不同的應(yīng)用場(chǎng)景中數(shù)據(jù)塊的重要程度進(jìn)行靈活設(shè)置,保證了重要數(shù)據(jù)的高可靠性,同時(shí)有效降低了存儲(chǔ)資源的浪費(fèi)。另外,本申請(qǐng)不限于用兩位作為預(yù)定位來指示副本的數(shù)量,可以用3位或4位等作為預(yù)定位來指示副本的數(shù)量,例如可以用該指定字段對(duì)應(yīng)的字節(jié)的第4、5、6位作為預(yù)定位,來定義需要寫入的副本的數(shù)量。
s13、根據(jù)指定字段指示的數(shù)量寫入數(shù)據(jù)塊的副本。
本領(lǐng)域技術(shù)人員應(yīng)當(dāng)知道的是,本申請(qǐng)?jiān)趯懭?個(gè)或多個(gè)副本的同時(shí)、之前或之后也寫入了數(shù)據(jù)塊本身。
上述數(shù)據(jù)塊的多副本存儲(chǔ)方法,只是對(duì)現(xiàn)有scsi協(xié)議中的write指令進(jìn)行了一點(diǎn)改進(jìn),即在scsi寫指令的預(yù)留字段中設(shè)置了副本的數(shù)量,在執(zhí)行scsi寫指令時(shí)就可以在存儲(chǔ)設(shè)備中形成數(shù)據(jù)塊的多個(gè)副本,操作簡單便捷,有效保證了數(shù)據(jù)塊的安全性,同時(shí)由于本申請(qǐng)是以數(shù)據(jù)塊為單位形成的副本,因此有效節(jié)省了存儲(chǔ)設(shè)備的存儲(chǔ)空間,避免了存儲(chǔ)資源的浪費(fèi)。
需要說明的是,上述步驟s12中,指定字段是預(yù)先指定的scsi寫命令中任意未定義的字段,在一種實(shí)施例中,上述指定字段可以是scsi寫命令中的保留字段,即圖7~圖11中示出的reserved字段。利用保留字段reserved指定副本的數(shù)量不會(huì)對(duì)原scsi寫命令產(chǎn)生任何影響。sbc協(xié)議中的每個(gè)寫指令,即每個(gè)scsi寫命令都會(huì)有幾個(gè)未使用的保留字段,如圖7~圖11所示,每個(gè)scsi寫命令中保留地段的位置不同,存儲(chǔ)設(shè)備解析scsi協(xié)議時(shí),會(huì)根據(jù)不同的寫指令在對(duì)應(yīng)的位置查找保留字段,繼而解析各個(gè)scsi寫指令的相關(guān)保留字段中的預(yù)留位,確定副本的數(shù)量。
通過執(zhí)行步驟s13形成了數(shù)據(jù)塊的1個(gè)或多個(gè)副本。應(yīng)當(dāng)說明的是,每個(gè)副本分別位于一個(gè)raid中,即不同的副本位于不同raid中,這樣在其中一個(gè)raid故障或損壞時(shí)不至于影響其他raid中存儲(chǔ)的副本的安全,即實(shí)現(xiàn)了在其中一個(gè)存儲(chǔ)有副本的raid出現(xiàn)故障時(shí),可以從其他存儲(chǔ)有副本的raid中讀取副本。同樣的,用于存儲(chǔ)數(shù)據(jù)塊的raid與存儲(chǔ)各個(gè)副本的raid均不相同,這樣在存儲(chǔ)數(shù)據(jù)塊的raid故障或損壞時(shí)不至于影響存儲(chǔ)在其他raid中的副本安全,即實(shí)現(xiàn)了存儲(chǔ)數(shù)據(jù)塊的raid故障時(shí),可以從其他存儲(chǔ)有副本的raid中讀取副本。上述在不同的raid中存儲(chǔ)數(shù)據(jù)塊和副本的方法有效地提高了存儲(chǔ)有重要數(shù)據(jù)的數(shù)據(jù)塊的安全性。實(shí)現(xiàn)上述寫入操作具體地包括如下步驟:
s131、確定數(shù)據(jù)塊寫入的raid;
s132、從除raid之外的raid中選擇與副本的數(shù)量相同的raid,將副本分別寫入至選擇的各個(gè)raid。
需要說明的是,本申請(qǐng)中各個(gè)副本還可以位于不同的磁盤柜中或的不同的存儲(chǔ)設(shè)備上。
執(zhí)行上述步驟s11~s13后在存儲(chǔ)設(shè)備中形成的數(shù)據(jù)塊的1個(gè)或多個(gè)副本,但是只存儲(chǔ)下來,而不能讀取出來是毫無意義的,為實(shí)現(xiàn)對(duì)存儲(chǔ)的副本的讀取,上述方法還需包括如下步驟:
s14、在lun的元數(shù)據(jù)中,具體地在數(shù)據(jù)塊對(duì)應(yīng)的元數(shù)據(jù)中設(shè)置副本標(biāo)識(shí),并利用元數(shù)據(jù)記錄副本的位置。
該步驟s14中,設(shè)置副本標(biāo)識(shí)用于指示哪些數(shù)據(jù)塊具有副本,在讀取數(shù)據(jù)塊失敗時(shí),首先判斷該數(shù)據(jù)塊是否具有副本標(biāo)識(shí),即首先判斷該數(shù)據(jù)塊是否具有副本。在確定具有副本之后,在記錄各個(gè)數(shù)據(jù)塊的副本的位置的元數(shù)據(jù)中查找該數(shù)據(jù)塊的副本的位置,例如,查找副本所在raid的uuid(用于標(biāo)識(shí)副本所在raid)和副本在該raid中的偏移(用于標(biāo)識(shí)副本在該raid中的位置),根據(jù)這2個(gè)信息就可以確定副本的位置。之后根據(jù)副本的位置就可從存儲(chǔ)設(shè)備中讀取副本。
在數(shù)據(jù)塊對(duì)應(yīng)的元數(shù)據(jù)中記錄副本標(biāo)識(shí)以及副本的位置后,在后面讀取副本的過程,存儲(chǔ)設(shè)備可以自動(dòng)完成,讀取副本的時(shí)間是毫秒量級(jí)的,完全避免了由于現(xiàn)有技術(shù)中文件修復(fù)等操作造成的業(yè)務(wù)中斷。
需要說明的是,上述執(zhí)行數(shù)據(jù)塊寫操作的scsi寫命令由與存儲(chǔ)設(shè)備連接的外部服務(wù)器生成和發(fā)送。scsi寫命令中的指定字段中的副本數(shù)量是由外部服務(wù)器依據(jù)用戶發(fā)送的拷貝命令設(shè)置。在一種實(shí)施例中,該外部服務(wù)器通過下面的步驟設(shè)置指定字段中的副本數(shù)量:
s31、外部服務(wù)器接收拷貝命令;
其中該拷貝命令是文件系統(tǒng)中自定義的一個(gè)特殊的拷貝命令,用戶或應(yīng)用層通過該拷貝命令可以設(shè)置需要寫入的副本的數(shù)量,例如該拷貝命令是copy2,那么表示目標(biāo)文件中所有數(shù)據(jù)塊需要生成的副本的數(shù)量均是2份。
s32、對(duì)拷貝命令進(jìn)行解析得到副本的數(shù)量,并根據(jù)副本的數(shù)量設(shè)置指定字段。具體地,在調(diào)用底層封裝scsi協(xié)議的模塊時(shí),即scsi指令封裝層封裝scsi指令時(shí),會(huì)把生成目標(biāo)文件的所有scsi寫指令中的指定字段均填入解析得到的副本的數(shù)量。
本領(lǐng)域技術(shù)人員應(yīng)當(dāng)清楚的是,從文件系統(tǒng)的角度上,文件是最小的存儲(chǔ)單位,文件所包含的任意一個(gè)數(shù)據(jù)塊異常時(shí),該文件都不能正常讀取。因此即使該文件中只有一個(gè)數(shù)據(jù)塊的重要,為保證該重要的數(shù)據(jù)塊能夠正常讀取,該文件的其他數(shù)據(jù)塊也必須能夠正常讀取,那么該文件的所有數(shù)據(jù)塊均需要存儲(chǔ)副本。上述第一服務(wù)器將預(yù)定拷貝命令中攜帶的副本的數(shù)量,填入了生成該目標(biāo)文件的所有scsi寫命令的指定字段,那么該目標(biāo)文件的所有數(shù)據(jù)塊具有相同數(shù)量的副本,充分保證了目標(biāo)文件的安全,從而保證了目標(biāo)文件中重要數(shù)據(jù)塊的安全。
需要說明的是,在另一個(gè)實(shí)施例中上述執(zhí)行數(shù)據(jù)塊寫操作的scsi寫命令中指定字段指示的數(shù)據(jù)塊的副本數(shù)量還可以由與存儲(chǔ)設(shè)備連接的外部服務(wù)器依據(jù)從本地?cái)?shù)據(jù)輸入端口獲取的副本數(shù)量設(shè)置。具體步驟如下:
s41、外部務(wù)器獲取預(yù)定標(biāo)識(shí)位信息;
該預(yù)定標(biāo)識(shí)位信息可以是在目標(biāo)文件打開的時(shí)候自定義的,該預(yù)定標(biāo)識(shí)位會(huì)傳遞到scsi指令封裝層,即底層封裝scsi協(xié)議的模塊,表示生成該目標(biāo)文件所需要執(zhí)行的所有scsi寫命令的指定字段均需要填入副本數(shù)量。
s42、從數(shù)據(jù)輸入端口獲取副本數(shù)量,并根據(jù)副本的數(shù)量設(shè)置生成該目標(biāo)文件所需要執(zhí)行的所有scsi寫命令中的指定字段。此步驟中,應(yīng)用層在數(shù)據(jù)輸入端口設(shè)置需要寫入的副本的數(shù)量。
在上述實(shí)施例中也將生成目標(biāo)文件的所有scsi寫命令的指定字段填入了相同的數(shù)量,即生成的目標(biāo)文件的所有數(shù)據(jù)塊都具有相同數(shù)量的副本。上述步驟s31中拷貝命令中攜帶的副本的數(shù)量以及步驟s41中通過數(shù)據(jù)輸入端口獲取的副本的數(shù)量都是應(yīng)用層根據(jù)實(shí)際的需要靈活設(shè)置的。如圖2所示,獲取副本的數(shù)量之后,scsi指令封裝層根據(jù)上述數(shù)量在每個(gè)scsi寫指令的指定字段填入相應(yīng)的副本數(shù)量,至此完成了scsi寫指令的改進(jìn)。
上述利用外部服務(wù)器設(shè)置指定字段的實(shí)施例只是利用文件系統(tǒng)封裝scsi指令的一種情景,當(dāng)然還可以利用其它手段封裝scsi指令,例如直接針對(duì)塊設(shè)備進(jìn)行讀寫的應(yīng)用,這些應(yīng)用就可以直接封裝scsi指令,并下發(fā)給存儲(chǔ)設(shè)備。
需要說明的是,如圖2所示,為判斷是否成功地寫入了數(shù)據(jù)塊和/或其副本,在寫入數(shù)據(jù)塊和/或其副本完成之后需要返回寫入成功得標(biāo)識(shí),具體包括兩種情景,第一種情景是,在數(shù)據(jù)塊不需要存儲(chǔ)副本時(shí),寫入數(shù)據(jù)塊完成之后,即可返回一個(gè)寫入成功的標(biāo)識(shí)。第二種情景是,在數(shù)據(jù)塊需要存儲(chǔ)副本時(shí),需要在數(shù)據(jù)塊以及所有副本都寫入成功之后,才能夠返回寫入成功的標(biāo)識(shí)。
如圖2所示,應(yīng)用層設(shè)定的需要寫入的副本的數(shù)量也可能是0,那么就不需要寫入副本,那么scsi寫指令正常寫入數(shù)據(jù)塊后返回寫入成功的標(biāo)識(shí)即可。
如圖2所示,在寫入的副本的數(shù)量不為0時(shí),寫入副本的raid一定是可用的raid,即該raid的剩余空間能夠容納副本。
在存儲(chǔ)設(shè)備上寫入副本的具體操作中,以定長的數(shù)據(jù)塊作為副本的最小存儲(chǔ)單位,例如該定長的數(shù)據(jù)塊為4kb。
綜上所述,上述多副本存儲(chǔ)方法的實(shí)施例能夠以數(shù)據(jù)塊為單位對(duì)重要數(shù)據(jù)生成多副本,確保了重要數(shù)據(jù)的安全,同時(shí)節(jié)省了寶貴的存儲(chǔ)資源。同時(shí)由于存儲(chǔ)設(shè)備中存儲(chǔ)了副本標(biāo)識(shí)以及副本的位置,使得與該方法對(duì)應(yīng)的存儲(chǔ)設(shè)備可以自動(dòng)完成副本的讀取,提高了數(shù)據(jù)塊讀取故障的情境中,相關(guān)讀取業(yè)務(wù)的連續(xù)性,提高了用戶體驗(yàn)度。
與前述多副本存儲(chǔ)方法的實(shí)施例相對(duì)應(yīng),本申請(qǐng)還提供了一種存儲(chǔ)設(shè)備的實(shí)施例。如圖5所示,該設(shè)備包括:
命令接收單元,用于接收用于對(duì)數(shù)據(jù)塊執(zhí)行寫操作的scsi寫命令;
字段獲取單元,用于從scsi寫命令中獲取指定字段,指定字段用于指示數(shù)據(jù)塊的副本的數(shù)量;
數(shù)據(jù)寫入單元,用于根據(jù)指定字段指示的數(shù)量寫入數(shù)據(jù)塊的副本。
需要說明的是,數(shù)據(jù)寫入單元包括:
數(shù)據(jù)塊raid確定子單元,用于確定數(shù)據(jù)塊寫入的raid;
寫入子單元,用于從除raid之外的raid中選擇與數(shù)量相同的raid,并將副本分別寫入至選擇的各個(gè)raid。
需要說明的是,存儲(chǔ)設(shè)備還包括元數(shù)據(jù)記錄標(biāo)識(shí)單元,元數(shù)據(jù)記錄標(biāo)識(shí)單元用于在數(shù)據(jù)塊對(duì)應(yīng)的元數(shù)據(jù)中設(shè)置副本標(biāo)識(shí),并利用元數(shù)據(jù)記錄副本的位置。
上述存儲(chǔ)設(shè)備中各個(gè)單元或子單元的功能和作用的實(shí)現(xiàn)過程具體詳見上述多副本存儲(chǔ)方法中對(duì)應(yīng)步驟的實(shí)現(xiàn)過程,在此不再贅述。
上述實(shí)施例提供了多副本存儲(chǔ)方法,實(shí)現(xiàn)了對(duì)副本的存儲(chǔ),下面實(shí)施例對(duì)應(yīng)于上述的存儲(chǔ)的副本,提供了一種數(shù)據(jù)讀取方法,如圖3所示,該方法包括如下步驟:
s21、接收數(shù)據(jù)塊讀取指令;
此步驟中的數(shù)據(jù)塊讀取指令是由前端應(yīng)用下發(fā)給存儲(chǔ)設(shè)備的,用于讀取數(shù)據(jù)塊;
s22、根據(jù)數(shù)據(jù)塊讀取指令確定所要讀取的數(shù)據(jù)塊的位置;
s23、從數(shù)據(jù)塊的位置開始讀取數(shù)據(jù)塊;若讀取失敗,則判斷數(shù)據(jù)塊是否具有副本標(biāo)識(shí);其中,副本標(biāo)識(shí)用于指示數(shù)據(jù)塊具有副本;
若數(shù)據(jù)塊具有副本標(biāo)識(shí),則根據(jù)副本標(biāo)識(shí)查找數(shù)據(jù)塊的副本的位置,并根據(jù)副本的位置讀取數(shù)據(jù)塊的副本;
此步驟s23中,具體地在元數(shù)據(jù)中查找副本標(biāo)識(shí)以及副本的位置。
需要說明的是,步驟s22中,根據(jù)數(shù)據(jù)塊讀取指令確定所要讀取的數(shù)據(jù)塊的位置具體包括兩種情景,第一種情景是,數(shù)據(jù)塊的位置直接攜帶于數(shù)據(jù)塊讀取指令中,通過解析該數(shù)據(jù)塊讀取指令就能直接確定數(shù)據(jù)塊的位置。第二種情景是,數(shù)據(jù)塊的位置并未攜帶于數(shù)據(jù)塊讀取指令中,數(shù)據(jù)塊去讀取指令中只攜帶有該數(shù)據(jù)塊的一個(gè)標(biāo)識(shí),需要進(jìn)一步的根據(jù)該標(biāo)識(shí)確定該數(shù)據(jù)塊的位置。
需要說明的是,步驟s23中,根據(jù)副本的位置讀取數(shù)據(jù)塊的副本包括兩種情景,第一種情景是,副本讀取成功,此時(shí)返回讀取的副本即可;第二種情景是,所有副本讀取均失敗,此時(shí)該數(shù)據(jù)塊的讀取徹底失敗,需要返回?cái)?shù)據(jù)讀取失敗的信息。
需要說明的是,上述步驟s23中詳細(xì)說明了數(shù)據(jù)塊讀取失敗時(shí)讀取副本的步驟,但是在實(shí)際讀取過程中存在數(shù)據(jù)塊讀取成功得情景,如圖4所示,若數(shù)據(jù)塊讀取成功,則只需要返回從數(shù)據(jù)塊中讀取到的數(shù)據(jù),不需要進(jìn)一步判斷該數(shù)據(jù)塊是否具有副本標(biāo)識(shí)。
上述步驟s23中詳細(xì)說明了數(shù)據(jù)塊讀取失敗,并且該數(shù)據(jù)塊具有副本時(shí)的處理步驟,但是在實(shí)際的讀取過程中存在該數(shù)據(jù)塊不具有副本的情景,如圖4所示,此時(shí)該數(shù)據(jù)塊的數(shù)據(jù)讀取徹底失敗,需要返回?cái)?shù)據(jù)讀取失敗的信息。
上述實(shí)施例提供的多數(shù)據(jù)讀取方法實(shí)現(xiàn)了存儲(chǔ)設(shè)備自動(dòng)跳轉(zhuǎn)到副本位置處讀取副本的功能,整個(gè)讀取數(shù)據(jù)的時(shí)間是毫秒量級(jí)的,不會(huì)對(duì)客戶讀取數(shù)據(jù)的連續(xù)性造成影響,提高了用戶體驗(yàn)度,同時(shí)保證了數(shù)據(jù)的高可靠性。
與前述數(shù)據(jù)讀取方法的實(shí)施例相對(duì)應(yīng),本申請(qǐng)還提供了另一種存儲(chǔ)設(shè)備的實(shí)施例。如圖6所示,該設(shè)備包括:
指令接收單元,用于接收數(shù)據(jù)塊讀取指令;
位置確定單元,用于根據(jù)數(shù)據(jù)塊讀取指令確定所要讀取的數(shù)據(jù)塊的位置;
數(shù)據(jù)讀取單元,用于從數(shù)據(jù)塊的位置開始讀取數(shù)據(jù)塊;
若讀取失敗,數(shù)據(jù)讀取單元還用于判斷數(shù)據(jù)塊是否具有副本標(biāo)識(shí);若數(shù)據(jù)塊具有副本標(biāo)識(shí),則查找數(shù)據(jù)塊的副本的位置,并根據(jù)副本的位置讀取數(shù)據(jù)塊的副本;其中,副本標(biāo)識(shí)用于指示數(shù)據(jù)塊具有副本。
上述存儲(chǔ)設(shè)備中各個(gè)單元的功能和作用的實(shí)現(xiàn)過程具體詳見上述數(shù)據(jù)讀取方法中對(duì)應(yīng)步驟的實(shí)現(xiàn)過程,在此不再贅述。
以上所述僅為本申請(qǐng)的較佳實(shí)施例而已,并不用以限制本申請(qǐng),凡在本申請(qǐng)的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本申請(qǐng)保護(hù)的范圍之內(nèi)。