本發(fā)明涉發(fā)明存儲技術(shù),涉及于存儲領(lǐng)域技術(shù)的日志領(lǐng)域。
背景技術(shù):
在存儲領(lǐng)域,越來越多的分布式存儲采用基于對象的架構(gòu),該架構(gòu)分為上下兩層,其中上層為文件系統(tǒng),塊,S3/Swift等服務(wù)層,下層為分布式鍵值(key value,KV)存儲層。
分布式KV存儲層負(fù)責(zé)系統(tǒng)存儲空間的分配,保存和釋放,為上層服務(wù)層提供跨存儲節(jié)點的可靠性,同時需要支持磁盤等存儲介質(zhì)故障的自我修復(fù)功能。分布式KV可以通過伴生日志來實現(xiàn)自我修復(fù)功能,修復(fù)類的伴生日志也稱為恢復(fù)日志。
服務(wù)層除了提供文件系統(tǒng),塊,S3/Swift等基本服務(wù)外,還需要提供配額,遠(yuǎn)程復(fù)制等增值特性,而這些增值特性也需要保存配額的消費記錄,遠(yuǎn)程復(fù)制的增量變化記錄等。于是,這些增值特性對分布式存儲提出了額外的需求。分布式存儲也可以通過伴生日志提供了這些額外記錄的存儲和讀取方法,業(yè)務(wù)特性附加類伴生日志也稱為業(yè)務(wù)日志。
現(xiàn)有技術(shù)中,一種分布式存儲系統(tǒng)的校驗方法是:把業(yè)務(wù)數(shù)據(jù)拆分成數(shù)據(jù)分片,由數(shù)據(jù)分片計算出冗余分片;一部分存儲節(jié)點存儲業(yè)務(wù)數(shù)據(jù)分片,另外一部分存儲節(jié)點存儲冗余分片。例如:數(shù)據(jù)存儲節(jié)點的數(shù)量為N,每個數(shù)據(jù)存儲節(jié)點存儲一個數(shù)據(jù)分片;冗余存儲節(jié)點的數(shù)量為M,每個冗余存儲節(jié)點存儲一個校驗分片。
對業(yè)務(wù)數(shù)據(jù)而言,如果分布式存儲系統(tǒng)中存在故障存儲節(jié)點,在故障存儲節(jié)點的數(shù)量不超過M個的情況下,僅對余下存儲節(jié)點正常寫入數(shù)據(jù)(數(shù)據(jù)分片或者校驗分片)并不會造成數(shù)據(jù)丟失,因此寫入操作會被正常執(zhí)行。業(yè)務(wù)日志伴隨著分片進行存儲,每個存儲節(jié)點保存的業(yè)務(wù)日志相同。當(dāng)故障存儲節(jié)點恢復(fù)正常后,通過其他存儲節(jié)點的分片,可以恢復(fù)出未寫入的分片。然而,現(xiàn)有技術(shù)中,業(yè)務(wù)日志并沒有伴隨分片一起得到恢復(fù),因此所述恢復(fù)正常的存儲節(jié)點中雖然有分片,卻沒有業(yè)務(wù)日志。
在這種情況下,由于原本正常存儲節(jié)點,在接收完分片后也可能發(fā)生故障。這意味著,每個存儲節(jié)點的業(yè)務(wù)日志都不可靠的,因此如果想要從分布式存儲系統(tǒng)中讀取業(yè)務(wù)日志,主機必須從M+1個存儲節(jié)點中獲得業(yè)務(wù)日志,對獲得的業(yè)務(wù)日志進行合并歸納后才能獲得可靠的業(yè)務(wù)日志。獲取M+1個業(yè)務(wù)日志的并進行歸納整理的過程,加重了主機的運算資源消耗和時間等待。
技術(shù)實現(xiàn)要素:
提供一種日志,可以解決現(xiàn)有技術(shù)中,業(yè)務(wù)日志恢復(fù)速度慢的問題。
第一方面,本發(fā)明提供了一種日志恢復(fù)方法的實施例,應(yīng)用于目標(biāo)存儲節(jié)點,所述目標(biāo)存儲節(jié)點發(fā)生故障,所述目標(biāo)存儲節(jié)點位于分布式存儲系統(tǒng)中,所述分布式存儲系統(tǒng)包括所述目標(biāo)存儲節(jié)點和正常存儲節(jié)點,該方法包括:所述目標(biāo)存儲節(jié)點從故障狀態(tài)恢復(fù)到正常狀態(tài)后,向所述分布式存儲系統(tǒng)中的所述正常存儲節(jié)點發(fā)送獲取恢復(fù)日志的請求;所述目標(biāo)存儲節(jié)點接收其他存儲節(jié)點返回的所述恢復(fù)日志,所述恢復(fù)日志包括第一恢復(fù)日志記錄,所述第一恢復(fù)日志指示了需要恢復(fù)的業(yè)務(wù)日志;按照所述第一恢復(fù)日志的指示,所述目標(biāo)存儲節(jié)點向所述正常存儲節(jié)點發(fā)送獲取業(yè)務(wù)日志的請求;所述目標(biāo)存儲節(jié)點根據(jù)收到的業(yè)務(wù)日志,生成目標(biāo)業(yè)務(wù)日志;對所述目標(biāo)業(yè)務(wù)日志進行保存。應(yīng)用該方案,主機可以隨時獲取業(yè)務(wù)日志,并且只需要從一個存儲節(jié)點獲取業(yè)務(wù)日志即可。過程簡單、延時低。
第一方面的第一種可能實現(xiàn)方式,在主機檢測到所述目標(biāo)存儲節(jié)點發(fā)生故障后,所述主機向正常存儲節(jié)點發(fā)送第一恢復(fù)日志,所述正常存儲節(jié)點接收主機發(fā)送的所述第一恢復(fù)日志并存儲。該方案為后續(xù)利用第一恢復(fù)日志來恢復(fù)業(yè)務(wù)日志提供了基礎(chǔ)。
第一方面的第二種可能實現(xiàn)方式,其中,所述目標(biāo)存儲節(jié)點根據(jù)收到的業(yè)務(wù)日志生成所述目標(biāo)業(yè)務(wù)日志,具體包括:所述目標(biāo)存儲節(jié)點根據(jù)對收到的業(yè)務(wù)日志進行合并以及去除重復(fù)項目,生成所述目標(biāo)業(yè)務(wù)日志。該方案描述了目標(biāo)業(yè)務(wù)日志的生成過程,其他存儲節(jié)點發(fā)來的業(yè)務(wù)日志可能并不完整,因此要合并;合并后可能有重復(fù)內(nèi)容,因此要去除重復(fù)項。
第一方面的第三種可能實現(xiàn)方式,所述恢復(fù)日志記錄還包括第二恢復(fù)日志記錄,所述第二恢復(fù)日志記錄中記錄有分片位置信息,所述方法進一步包括:所述目標(biāo)存儲節(jié)點向分布式存儲系統(tǒng)中的其他存儲節(jié)點發(fā)送分片獲取請求,所述分片獲取請求攜帶所述分片位置信息;所述目標(biāo)存儲節(jié)點接收其他存儲節(jié)點發(fā)送的分片;所述目標(biāo)存儲節(jié)點使用接收到的分片,獲得本存儲節(jié)點的分片并保存。該方案描述了故障存儲節(jié)點分片是如何恢復(fù)的。
第一方面的第四種可能實現(xiàn)方式,該方法進一步包括:主機向所述目標(biāo)存儲節(jié)點發(fā)送業(yè)務(wù)日志獲取請求;所述目標(biāo)存儲節(jié)點把所述目標(biāo)業(yè)務(wù)日志發(fā)送給所述主機;所述主機按照所述目標(biāo)業(yè)務(wù)日志執(zhí)行操作。該方案描述了主機僅僅獲得目標(biāo)業(yè)務(wù)日志就可以執(zhí)行業(yè)務(wù)日志的操作,而不是從多個存儲節(jié)點獲得業(yè)務(wù)日志然后合并去重,才能執(zhí)行業(yè)務(wù)日志的操作。本方案相較于現(xiàn)有技術(shù),更加簡單高效。
第一方面的第五種可能實現(xiàn)方式,所述目標(biāo)存儲節(jié)點和所述正常存儲節(jié)點屬于同一個分區(qū)。
第二方面,本發(fā)明還提供一種業(yè)務(wù)日志存儲裝置的實施例,所述業(yè)務(wù)日志存儲裝置和正常存儲裝置通信,該業(yè)務(wù)日志存儲裝置包括:發(fā)送模塊,用于在所述業(yè)務(wù)日志存儲裝置從故障恢復(fù)正常后,向所述正常存儲裝置發(fā)送獲取恢復(fù)日志的請求;接收模塊,用于接收其他存儲節(jié)點返回的所述恢復(fù)日志,所述恢復(fù)日志包括第一恢復(fù)日志記錄,所述第一恢復(fù)日志指示了需要恢復(fù)的業(yè)務(wù)日志;處理模塊,用于按照所述第一恢復(fù)日志的指示,通過所述發(fā)送模塊向所述正常存儲裝置發(fā)送獲取業(yè)務(wù)日志的請求;所述處理模塊,還用于根據(jù)收到的業(yè)務(wù)日志,生成目標(biāo)業(yè)務(wù)日志;存儲模塊,用于對所述目標(biāo)業(yè)務(wù)日志進行保存。該第二方面方案(以及該第二方面方案的各種實現(xiàn)方式)和第一方面(以及第一方面的各種實現(xiàn)方式)的方案細(xì)節(jié)和技術(shù)效果類似,因此不做贅述。
第三方面,還提供一種業(yè)務(wù)日志存儲節(jié)點的實施例,所述業(yè)務(wù)日志存儲節(jié)點位于分布式存儲系統(tǒng)中,所述分布式存儲系統(tǒng)包括所述業(yè)務(wù)日志存儲節(jié)點和正常存儲節(jié)點,所述業(yè)務(wù)日志存儲節(jié)點包括處理器和存儲介質(zhì),所述處理器用于執(zhí)行:在所述業(yè)務(wù)日志存儲節(jié)點從故障恢復(fù)正常后,向所述正常存儲節(jié)點發(fā)送獲取恢復(fù)日志的請求;接收其他存儲節(jié)點返回的所述恢復(fù)日志,所述恢復(fù)日志包括第一恢復(fù)日志記錄,所述第一恢復(fù)日志指示了需要恢復(fù)的業(yè)務(wù)日志;按照所述第一恢復(fù)日志的指示,向所述正常存儲節(jié)點發(fā)送獲取業(yè)務(wù)日志的請求;根據(jù)收到的業(yè)務(wù)日志,生成目標(biāo)業(yè)務(wù)日志;把所述目標(biāo)業(yè)務(wù)日志保存到所述存儲介質(zhì)中。該第三方面方案(以及該第三方面方案的各種實現(xiàn)方式)和第一方面(以及第一方面的各種實現(xiàn)方式)的方案細(xì)節(jié)和技術(shù)效果類似,因此不做贅述。
附圖說明
圖1是存儲節(jié)點故障示意圖;
圖2是故障存儲節(jié)點中數(shù)據(jù)恢復(fù)后的示意圖;
圖3是本發(fā)明實施例存儲節(jié)點故障示意圖;
圖4是本發(fā)明實施例故障存儲節(jié)點中數(shù)據(jù)恢復(fù)后的示意圖;
圖5是本發(fā)明日志恢復(fù)方法實施例流程圖;
圖6是本發(fā)明業(yè)務(wù)日志存儲裝置實施例結(jié)構(gòu)圖;
圖7是本發(fā)明業(yè)務(wù)日志存儲節(jié)點實施例的拓?fù)鋱D
具體實施方式
本申請方案可以適用于分布式存儲系統(tǒng)。分布式存儲系統(tǒng)保存的數(shù)據(jù)可以存儲文件(或者文件的一部分)、對象或者鍵值(KV,key value)。下面的實施例中,在沒有特別說明的情況下,僅以對象存儲為例進行介紹。
伴生日志可以是分布式存儲系統(tǒng)在存儲數(shù)據(jù)的過程中,伴隨著數(shù)據(jù)的保存而產(chǎn)生的日志信息。伴生日志可以用于數(shù)據(jù)的故障恢復(fù),也可以用于記錄配額等增值特性,業(yè)務(wù)日志和恢復(fù)日志都屬于伴生日志。伴生日志可以具有特征:伴生性,伴隨對象的操作進行,不會單獨存在;可靠性,伴隨對象的操作進行,每個存儲節(jié)點都以鏡像的方式保存相同的伴生日志,其可靠性可以與對象的可靠性級別相同;一致性,伴隨對象的操作進行,存儲節(jié)點間一致性與對象相同;日志性,伴生日志對的操作是總是追加若干記錄到伴生日志對象中。本發(fā)明實施例中提及的各種日志可以是日志文件中的日志記錄。
參見圖1,分布式存儲系統(tǒng)包括:存儲節(jié)點1、存儲節(jié)點2和存儲節(jié)點3。數(shù)據(jù)(例如文件或者value)拆分成數(shù)據(jù)分片。冗余分片3是由數(shù)據(jù)分片1和數(shù)據(jù)分片2形成的校驗數(shù)據(jù),這三個分片預(yù)備存儲到不同的存儲節(jié)點中。如果在寫入數(shù)據(jù)的時候檢測到存儲節(jié)點2發(fā)生故障,那么原本需要寫入存儲節(jié)點2的數(shù)據(jù)分片2無法寫成功,數(shù)據(jù)分片1成功寫入存儲節(jié)點1,冗余分片3成功寫入存儲節(jié)點3。
類似的,業(yè)務(wù)日志和第二恢復(fù)日志在存儲節(jié)點1和存儲節(jié)點3中寫入成功,業(yè)務(wù)日志和第二恢復(fù)日志在存儲節(jié)點2無法寫入成功。數(shù)據(jù)分片和冗余分片統(tǒng)稱為分片。圖1中的第二恢復(fù)日志用于恢復(fù)數(shù)據(jù)分片或者冗余分片,對于N+M的冗余配比,只要獲得不少于N個分片,就可以恢復(fù)出余下的分片?;謴?fù)日志記錄了需要恢復(fù)分片的存儲節(jié)點ID、需要恢復(fù)的分片以及需要恢復(fù)分片的版本號。
參見圖2,在存儲節(jié)點2恢復(fù)正常工作后。通過存儲在存儲節(jié)點1的數(shù)據(jù)分片1和存儲在存儲節(jié)點3的冗余分片3可以計算出數(shù)據(jù)分片2,并把計算出的數(shù)據(jù)分片2寫入存儲節(jié)點2中,使得存儲節(jié)點2中的數(shù)據(jù)分片2得到恢復(fù)。然而,本應(yīng)該存儲的存儲節(jié)點2中伴生日志并沒有得到恢復(fù)。如果主機(主機和所有存儲節(jié)點通信)需要獲取業(yè)務(wù)日志,不得不分別從存儲節(jié)點1和存儲節(jié)點3讀取業(yè)務(wù)日志,進行合并整理后才能得到可靠的業(yè)務(wù)日志。
參見圖3,和圖1類似,存儲節(jié)點2發(fā)生了故障。和圖2不同之處在于,本發(fā)明實施例中有兩個恢復(fù)日志。除了第二恢復(fù)日志外,還有第一恢復(fù)日志,所述第一恢復(fù)日志用于恢復(fù)業(yè)務(wù)日志。
在存儲節(jié)點2故障的情況下,寫數(shù)據(jù)的過程可以按照兩階段(2PC)事務(wù)處理流程執(zhí)行,步驟如下。
(1)主機把待寫的文件或者對象拆分成數(shù)據(jù)分片,按照存儲節(jié)點的數(shù)量,選擇一定數(shù)量的數(shù)據(jù)分片計算出冗余分片。把選擇的數(shù)據(jù)分片和冗余分片發(fā)送給各個存儲節(jié)點。每個存儲節(jié)點發(fā)送一個或者多個分片。
(2)存儲節(jié)點接收分片后暫存在內(nèi)存中。再由存儲節(jié)點發(fā)送給自己的硬盤,每個硬盤發(fā)送一個分片。
(3)主機發(fā)送準(zhǔn)備(prepare)請求給各個存儲節(jié)點。
(4)收到prepare請求的存儲節(jié)點會在本地寫事務(wù)日志,然后發(fā)送響應(yīng)消息。由于存儲節(jié)點2發(fā)送故障,因此只有存儲節(jié)點1和存儲節(jié)點2發(fā)出了響應(yīng)消息。
(5)主機收到存儲節(jié)點1和存儲節(jié)點3的響應(yīng)消息后。進行判斷:當(dāng)所有收到prepare的存儲節(jié)點的響應(yīng)都被主機收到。主機下發(fā)交付(commit)請求給發(fā)出響應(yīng)消息的存儲節(jié)點;否則,主機下發(fā)中止(abort)請求給發(fā)送響應(yīng)消息的存儲節(jié)點。
(6)收到commit請求的存儲節(jié)點,把內(nèi)存中的分片進行持久化存儲,也就是存儲到非易失性存儲介質(zhì)(例如磁盤、固態(tài)硬盤)中。每個硬盤存儲一個分片。
參見圖4,在存儲節(jié)點2從故障恢復(fù)正常后。除了使用第一恢復(fù)日志恢復(fù)出業(yè)務(wù)日志之外,還可以使用第二恢復(fù)日志恢復(fù)出數(shù)據(jù)分片2。
恢復(fù)流程如下。
(1)存儲節(jié)點2恢復(fù)正常后,把自己恢復(fù)正常的消息通告給存儲節(jié)點1和存儲節(jié)點3。
(2)存儲節(jié)點1和存儲節(jié)點3收到通告消息后,把本地存儲的恢復(fù)日志發(fā)送給存儲節(jié)點2。
(3)存儲節(jié)點2按照第一恢復(fù)日志,獲取數(shù)據(jù)分片1和校驗分片3,依靠數(shù)據(jù)分片1和校驗分片3,可以恢復(fù)出數(shù)據(jù)分片2。把數(shù)據(jù)分片2發(fā)送給存儲節(jié)點2。存儲節(jié)點2保存數(shù)據(jù)分片2到非易失性存儲介質(zhì)中。
實際上,任意存儲節(jié)點只要獲得數(shù)據(jù)分片1和校驗分片3都可以計算出數(shù)據(jù)分片2,因此數(shù)據(jù)分片2的恢復(fù)過程也可以由存儲節(jié)點3或者存儲節(jié)點1執(zhí)行,此處不再贅述。
(4)存儲節(jié)點2按照第二恢復(fù)日志,存儲節(jié)點1和存儲節(jié)點3各自把本地的業(yè)務(wù)日志發(fā)送給存儲節(jié)點2。存儲節(jié)點2進行合并、去除重復(fù)項這兩項操作后就生成了自己的業(yè)務(wù)日志,并對生成的業(yè)務(wù)日志進行保存。
同樣的,這個操作也可以由其他存儲節(jié)點執(zhí)行。把生成的業(yè)務(wù)日志發(fā)送給存儲節(jié)點2進行保存即可。
參見圖5,是本發(fā)明日志恢復(fù)方法實施例流程圖。對圖3、圖4的過程進行更詳細(xì)的介紹。
11,主機在寫入業(yè)務(wù)日志前,先對分布式系統(tǒng)中的存儲節(jié)點進行檢查,以便獲知存儲節(jié)點的狀態(tài)(狀態(tài)包括:正常、故障)。把業(yè)務(wù)日志和第一恢復(fù)日志寫入正常存儲節(jié)點。業(yè)務(wù)日志描述對象的屬性,第一恢復(fù)日志用于對所述業(yè)務(wù)日志進行恢復(fù)。對于故障存儲節(jié)點,不會寫入業(yè)務(wù)日志和第一恢復(fù)日志。存儲節(jié)點故障是指存儲節(jié)點無法寫入數(shù)據(jù),既包括存儲節(jié)點本身的故障,也包括主機通往存儲節(jié)點的鏈路發(fā)生故障。為了方便描述,后面把發(fā)生故障的存儲接的稱為目標(biāo)存儲節(jié)點。
本步驟所涉及的存儲節(jié)點范圍是分區(qū)所在的存儲節(jié)點。每個分區(qū)的存儲空間由多個存儲節(jié)點提供。每個存儲節(jié)點也同時為多個分區(qū)提供存儲空間。
例如分布式存儲系統(tǒng)中一個有10個存儲節(jié)點,而本實施例所要寫入數(shù)據(jù)的分區(qū)分布于4個存儲節(jié)點,則本步驟檢查的存儲節(jié)點是這4個存儲節(jié)點是否發(fā)生故障,對于其余6個存儲節(jié)點,可以不予檢查。在沒有特別說明的情況下,本實施例及其他實施例所提及的正常存儲節(jié)點和目標(biāo)存儲節(jié)點,都是針對一個特定的分區(qū)而言。指的是這個分區(qū)所分布的存儲節(jié)點。換言之,所述正常存儲節(jié)點和所述目標(biāo)存儲節(jié)點組成的集合,是由所述分區(qū)的存儲空間所在的存儲節(jié)點共同組成。每個存儲空間可以用一段地址范圍描述。
第一恢復(fù)日志攜帶了需要恢復(fù)的業(yè)務(wù)日志的信息,由業(yè)務(wù)日志的信息可以定位到需要恢復(fù)的日志。業(yè)務(wù)日志的信息形式可以有多種。例如(1)業(yè)務(wù)日志的信息可以是業(yè)務(wù)日志的標(biāo)識符(ID),由標(biāo)識符可以定位到一條具體的業(yè)務(wù)日志;(2)業(yè)務(wù)日志的信息可以是描述業(yè)務(wù)日志類型和生成業(yè)務(wù)日志的時間段。
可選的,還把分片和第二恢復(fù)日志寫入正常存儲節(jié)點。具體而言,按照存儲空間的數(shù)量,存儲到每個存儲空間中。不同存儲空間所存儲的分片不同,每個分片是所述對象的N個數(shù)據(jù)分片中的一個,或者是M個校驗分片中的一個;不同存儲空間存儲的第二恢復(fù)日志相同。需要說明的是,如果故障存儲節(jié)點的數(shù)量過多,導(dǎo)致正常存儲節(jié)點的數(shù)量(或者說正常存儲節(jié)點提供的分片的數(shù)量)難以形成校驗關(guān)系,則步驟11不執(zhí)行,整個流程終止。
第二恢復(fù)日志記錄存儲節(jié)點ID和對象ID;也可以是其他信息,例如存儲節(jié)點ID和分片在硬盤中的地址;還可以有其他形式,只要在對故障存儲節(jié)點的分片進行恢復(fù)的時候,可以找到所述正常存儲節(jié)點中的分片即可。
分布式存儲中,分區(qū)(partition)由一組存儲空間組成,這一組存儲空間來自于不同存儲節(jié)點的硬盤,每個硬盤提供一個存儲空間。把業(yè)務(wù)日志和第一恢復(fù)日志寫入正常存儲節(jié)點中,是指對業(yè)務(wù)日志和第一恢復(fù)日志在正常存儲節(jié)點的各個存儲空間中進行鏡像存儲。把對象存儲到分區(qū)中后,分區(qū)為對象提供數(shù)據(jù)保護能力,保護算法例如是糾刪碼(erasure code,EC)和鏡像(mirror)。以糾刪碼的保護算法為例,一種具體做法是:把一組分片存儲到一個分區(qū)中,組成分區(qū)的空間來自于多個硬盤,每個硬盤提供存儲一個分片的存儲空間,這些硬盤來自于多個存儲節(jié)點。這一組分片包括校驗分片也包括數(shù)據(jù)分片,數(shù)據(jù)分片由對象拆分而成,校驗分片由數(shù)據(jù)分片生成,數(shù)據(jù)分片和校驗分片共同形成校驗關(guān)系。以N+M的冗余配比為例,獲得分區(qū)中至少N個存儲節(jié)點的分片后,使用糾刪碼算法就可以恢復(fù)出其余存儲節(jié)點中的分片,本步驟可以執(zhí)行。如果正常存儲節(jié)點數(shù)量小于N個,則不滿足校驗關(guān)系,本步驟不執(zhí)行。
可選的,本步驟還可以包括:按照所述正常存儲節(jié)點所提供的存儲空間的數(shù)量,把分片寫入所述正常存儲節(jié)點,每個存儲空間可以存儲一個分片。
12,所述目標(biāo)存儲節(jié)點恢復(fù)正常后,向所述正常存儲節(jié)點發(fā)送獲取恢復(fù)日志的請求。
為了方便進行區(qū)分,在沒有特別說明的情況下,本實施例以及其他各個實施例中,正常存儲節(jié)點指的是原本就是正常狀態(tài)的存儲節(jié)點,或者說在模板存儲節(jié)點故障期間處于正常狀態(tài)的存儲節(jié)點,因此正常狀態(tài)的存儲節(jié)點不包括目標(biāo)存儲節(jié)點?;謴?fù)日志的請求中可以攜帶需要獲得恢復(fù)日志的時間段(也就是目標(biāo)存儲節(jié)點發(fā)生故障的時間段)。
需要說明的是,包括目標(biāo)存儲節(jié)點在內(nèi)的、分區(qū)所分布的各個存儲節(jié)點中,記錄有分區(qū)的信息,例如分區(qū)分布在哪些存儲節(jié)點。因此對一個特定分區(qū)而言,目標(biāo)存儲節(jié)點可以獲知這個分區(qū)的其他空間位于哪些存儲節(jié)點。
本步驟可以向一個正常存儲節(jié)點(例如分區(qū)中的主存儲節(jié)點)發(fā)送恢復(fù)日志請求。也可以向所有正常存儲節(jié)點發(fā)送恢復(fù)日志請求。
13,所述正常存儲節(jié)點,在收到所述獲取恢復(fù)日志的請求后,通過調(diào)用日志接口程序,獲取恢復(fù)日志。把目標(biāo)存儲節(jié)點故障期間的恢復(fù)日志發(fā)送給所述目標(biāo)存儲節(jié)點。
如果僅一個正常存儲節(jié)點收到所述獲取恢復(fù)日志的請求,則由這個正常存儲節(jié)點反饋恢復(fù)日志。一種方案是獲取本地恢復(fù)日志,作為反饋給目標(biāo)存儲節(jié)點的恢復(fù)日志,這種方案可以適用于本地恢復(fù)日志完整的情況。另外一種方案是從本地獲得恢復(fù)日志,還從其他正常存儲節(jié)點獲取恢復(fù)日志,進行合并、去除重復(fù)項后,作為反饋給目標(biāo)存儲節(jié)點的恢復(fù)日志,這種方案可以適用于本地恢復(fù)日志不完整的情況。
對于被獲取本地恢復(fù)日志的正常存儲節(jié)點,如果同一個正常存儲節(jié)點中有多份恢復(fù)日志(例如有多個存儲空間,每個存儲空間存儲一個恢復(fù)日志),可以只發(fā)送其中一個恢復(fù)日志,也可以發(fā)送其中多個恢復(fù)日志。
如果多個正常存儲節(jié)點收到所述獲取恢復(fù)日志的請求,則各自把本地的恢復(fù)日志反饋給所述目標(biāo)存儲節(jié)點,由目標(biāo)存儲節(jié)點進行合并、去除重復(fù)項后,再執(zhí)行步驟14的操作。
對本步驟而言,正常存儲節(jié)點獲取本地存儲的恢復(fù)日志,具體是指獲取本存儲節(jié)點中屬于所述分區(qū)的空間存儲的日志,如果有多個存儲空間屬于所述分區(qū),每個存儲空間存儲一份恢復(fù)日志,則任意獲取其中一份恢復(fù)日志即可。
需要說明的是,如前所述,分區(qū)由多個存儲空間組成。組成同一個分區(qū)的多個存儲空間來自于多個存儲節(jié)點。其中,每個存儲節(jié)點可以提供一個存儲空間;也可以提供多個存儲空間。每個存儲空間存儲一個分片;以及存儲日志(恢復(fù)日志、業(yè)務(wù)日志等),不同存儲空間的日志是鏡像關(guān)系。
在同一個存儲節(jié)點提供多個存儲空間的情況下,不同的存儲空間可以來自于不同的硬盤,以提高系統(tǒng)可靠性。例如,一個存儲節(jié)點提供3個存儲空間時,這3個存儲空間分別來自于這個存儲節(jié)點的三個硬盤。由于日志伴隨分片存儲,所以每個存儲空間都可以存儲一份日志。因此日志數(shù)量和分片數(shù)量相同。
14,目標(biāo)存儲節(jié)點接收到恢復(fù)日志后,按照恢復(fù)日志的指示,向所述正常存儲節(jié)點發(fā)送恢復(fù)請求?;謴?fù)請求的發(fā)送范圍可以是所有正常存儲節(jié)點。
對于業(yè)務(wù)日志的恢復(fù),目標(biāo)存儲節(jié)點按照第一恢復(fù)日志描述的信息向所述正常存儲節(jié)點發(fā)送業(yè)務(wù)日志恢復(fù)請求。
對于分片的恢復(fù),目標(biāo)存儲節(jié)點按照第二恢復(fù)日志描述的信息向所述正常存儲節(jié)點發(fā)送業(yè)務(wù)日志恢復(fù)請求。
15,正常存儲節(jié)點,在收到恢復(fù)請求后,按照恢復(fù)請求記錄的信息的發(fā)送數(shù)據(jù)給所述目標(biāo)存儲節(jié)點。
對于第一恢復(fù)日志,如果第一恢復(fù)日志所攜帶的信息是業(yè)務(wù)日志的標(biāo)識符,則直接把標(biāo)識符對應(yīng)的業(yè)務(wù)日志給所述目標(biāo)存儲節(jié)點。如果第一恢復(fù)日志所攜帶的信息描述的是業(yè)務(wù)日志類型和生成業(yè)務(wù)日志的時間段。則把滿足業(yè)務(wù)日志的信息(指定的時間段內(nèi)的、指定業(yè)務(wù)日志類型)的業(yè)務(wù)日志發(fā)送給所述目標(biāo)存儲節(jié)點。
如果在同一個存儲節(jié)點中,有多份滿足條件的業(yè)務(wù)日志(例如有多個存儲空間,每個存儲空間存儲一個業(yè)務(wù)日志),可以全部發(fā)送給所述目標(biāo)存儲節(jié)點,也可以只發(fā)其中一份。
對于第二恢復(fù)日志,按照第二恢復(fù)日志攜帶的分片信息找到本存儲節(jié)點的分片,然后發(fā)送給所述目標(biāo)存儲節(jié)點。例如可以按照所述存儲節(jié)點ID和所述對象ID找到本存儲節(jié)點的分片。對于每個發(fā)送分片的正常存儲節(jié)點,其發(fā)送的范圍是位于所述分區(qū)的滿足條件的所有分片。也就是說,如果同一個正常存儲節(jié)點有多個分片,這些分片都要發(fā)送給所述目標(biāo)存儲節(jié)點。
16,目標(biāo)存儲節(jié)點接收其他存儲節(jié)點發(fā)來的業(yè)務(wù)日志,生成目標(biāo)業(yè)務(wù)日志。然后對生成的業(yè)務(wù)日志進行保存。
當(dāng)?shù)谝换謴?fù)日志的信息是業(yè)務(wù)日志的標(biāo)識符,則把收到的業(yè)務(wù)日志進行合并,就可以生成目標(biāo)業(yè)務(wù)日志。這樣就恢復(fù)了原本需要存儲到目標(biāo)存儲節(jié)點的業(yè)務(wù)日志。在一些情況下,合并之后還可以再做去除重復(fù)項的操作,以生成原本需要存儲到目標(biāo)存儲節(jié)點的業(yè)務(wù)日志。
當(dāng)?shù)谝换謴?fù)日志所攜帶的信息描述的是業(yè)務(wù)日志類型和生成業(yè)務(wù)日志的時間段。則把收到的業(yè)務(wù)日志進行合并,然后去除重復(fù)項后就生成所述目標(biāo)業(yè)務(wù)日志。這樣就恢復(fù)了原本需要存儲到目標(biāo)存儲節(jié)點的業(yè)務(wù)日志。
此外,目標(biāo)存儲節(jié)點還可以對分片進行恢復(fù)。其做法是:對收到的分片進行校驗計算,生成原本需要存儲到目標(biāo)存儲節(jié)點的分片。本實施例由所述目標(biāo)存儲節(jié)點獲取分片并進行數(shù)據(jù)恢復(fù)的操作;可以理解的是,在其他實施例中,也可以由其他存儲節(jié)點獲取分片并進行數(shù)據(jù)恢復(fù)的操作,把恢復(fù)得到的分片發(fā)送給所述目標(biāo)存儲節(jié)點即可。
17,主機從目標(biāo)存儲節(jié)點讀取業(yè)務(wù)日志獲取請求,按照獲得的業(yè)務(wù)日志執(zhí)行下一步操作。例如,業(yè)務(wù)日志描述分區(qū)的存儲空間配額的消費情況,則按照存儲空間配額的消費情況確定是否繼續(xù)往分區(qū)寫入數(shù)據(jù)。
基于本實施例提供的業(yè)務(wù)日志恢復(fù)方案,主機需要讀取業(yè)務(wù)日志時,只需要向一個存儲節(jié)點讀取業(yè)務(wù)日志即可,不需要讀取多份業(yè)務(wù)日志,因此時延更短,而且過程也更簡單,此外也節(jié)約了主機和分布式存儲系統(tǒng)之間的網(wǎng)絡(luò)帶寬。
參見圖6,是一種業(yè)務(wù)日志存儲裝置實施例結(jié)構(gòu)圖,可以執(zhí)行上述日志恢復(fù)方法,由于在日志恢復(fù)方法實施例中已經(jīng)有詳細(xì)說明,因此下面僅進行簡單介紹。所述業(yè)務(wù)日志存儲裝置2和正常存儲裝置通信,其特征在于,該業(yè)務(wù)日志存儲裝置2包括:
發(fā)送模塊21,用于在所述業(yè)務(wù)日志存儲裝置從故障恢復(fù)正常后,向所述正常存儲裝置發(fā)送獲取恢復(fù)日志的請求;
接收模塊22,用于接收其他存儲節(jié)點返回的所述恢復(fù)日志,所述恢復(fù)日志包括第一恢復(fù)日志記錄,所述第一恢復(fù)日志指示了需要恢復(fù)的業(yè)務(wù)日志;處理模塊23,用于按照所述第一恢復(fù)日志的指示,通過所述發(fā)送模塊21向所述正常存儲裝置發(fā)送獲取業(yè)務(wù)日志的請求;所述處理模塊23,還用于根據(jù)收到的業(yè)務(wù)日志,生成目標(biāo)業(yè)務(wù)日志;存儲模塊24,用于對所述目標(biāo)業(yè)務(wù)日志進行保存,例如保存到存儲介質(zhì)中。
其中,所述接收模塊22還用于:在所述業(yè)務(wù)日志存儲裝置發(fā)生故障后,接收主機發(fā)送的所述第一恢復(fù)日志并存儲。
其中,所述處理模塊23根據(jù)收到的業(yè)務(wù)日志生成所述目標(biāo)業(yè)務(wù)日志,具體包括:所述處理模塊23根據(jù)對收到的業(yè)務(wù)日志進行合并以及去除重復(fù)項目,生成所述目標(biāo)業(yè)務(wù)日志。
其中,所述恢復(fù)日志記錄還包括第二恢復(fù)日志記錄,所述第二恢復(fù)日志記錄中記錄有分片位置信息;所述發(fā)送模塊21還用于向所述存儲裝置發(fā)送分片獲取請求,所述分片獲取請求攜帶所述分片位置信息;所述接收模塊22,還用于接收其他存儲裝置發(fā)送的分片;所述處理模塊23,還用于使用接收到的所述分片,獲得本存儲節(jié)點的分片并保存。
更進一步的,主機和所述業(yè)務(wù)日志存儲裝置通信。主機用于向所述業(yè)務(wù)日志存儲裝置發(fā)送業(yè)務(wù)日志獲取請求。所述接收模塊22收到所述業(yè)務(wù)日志獲取請求后,所述發(fā)送模塊21,還用于把所述目標(biāo)業(yè)務(wù)日志發(fā)送給所述主機;所述主機還用于按照所述目標(biāo)業(yè)務(wù)日志執(zhí)行操作。
所述業(yè)務(wù)日志存儲裝置2和所述正常存儲裝置屬于同一個分區(qū)。
所述業(yè)務(wù)日志存儲裝置可以是硬件,例如存儲節(jié)點,本發(fā)明可以稱之為業(yè)務(wù)日志存儲節(jié)點。物理上可以是存儲控制器,或者存儲服務(wù)器,或者存儲控制器和存儲介質(zhì)的組合。
參見圖7,是本發(fā)明業(yè)務(wù)日志存儲節(jié)點實施例的拓?fù)鋱D。
業(yè)務(wù)日志存儲節(jié)點3,所述業(yè)務(wù)日志存儲節(jié)點3位于分布式存儲系統(tǒng)中,所述分布式存儲系統(tǒng)包括所述業(yè)務(wù)日志存儲節(jié)點3和正常存儲節(jié)點(未圖示),所述業(yè)務(wù)日志存儲節(jié)點3包括處理器31、內(nèi)存32和存儲介質(zhì)33。所述內(nèi)存32中有程序,所述處理器31用于通過運行內(nèi)存中的程序,以執(zhí)行:在所述業(yè)務(wù)日志存儲節(jié)點從故障恢復(fù)正常后,向所述正常存儲節(jié)點發(fā)送獲取恢復(fù)日志的請求;接收其他存儲節(jié)點返回的所述恢復(fù)日志,所述恢復(fù)日志包括第一恢復(fù)日志記錄,所述第一恢復(fù)日志指示了需要恢復(fù)的業(yè)務(wù)日志;按照所述第一恢復(fù)日志的指示,向所述正常存儲節(jié)點發(fā)送獲取業(yè)務(wù)日志的請求;根據(jù)收到的業(yè)務(wù)日志,生成目標(biāo)業(yè)務(wù)日志;把所述目標(biāo)業(yè)務(wù)日志保存到所述存儲介質(zhì)33中。
在另外一些實施例中,例如處理器是現(xiàn)場可編程門陣列(FPGA)時,處理器本身有記憶程序的能力,因此不需要內(nèi)存。
本發(fā)明還提供光盤/U盤等存儲介質(zhì)的實施例,光盤/U盤中存儲計算機程序,把該程序安裝到計算機、存儲服務(wù)器或者存儲控制器中后,通過運行程序,可以執(zhí)行步驟11-16提及的方法。