本發(fā)明涉及計算存儲領(lǐng)域,特別涉及一種數(shù)據(jù)遷移方法和裝置。
背景技術(shù):
分布式存儲系統(tǒng)可以提供分級存儲功能:將存儲空間劃分為不同的存儲級別,根據(jù)文件的優(yōu)先級把文件存放在不同的存儲級別上,滿足用戶對文件處理速度、傳輸帶寬和存儲容量的多樣需求,以達到合理利用存儲空間、提升存儲系統(tǒng)訪問性能、降低總體部署成本的目的。
現(xiàn)有技術(shù)中,把文件寫入存儲系統(tǒng)的一種典型做法是;先把文件寫入高性能存儲介質(zhì);掃描符合條件的文件(比如創(chuàng)建超過一段時間,或者少于一定訪問量的文件),把符合條件的文件重新讀取出來,遷移到低成本的存儲介質(zhì)中。
把符合條件的文件讀出,以及再寫入新的存儲介質(zhì)的這一個過程需要耗費存儲系統(tǒng)的資源。例如采用數(shù)據(jù)打散+ec計算冗余的方式進行數(shù)據(jù)存儲的存儲系統(tǒng)中。其分級存儲的具體做法是:首先要把一個文件的全部分片從高性能存儲器中讀到主機中,然后進行ec校驗,在校驗成功后,再由主機把文件再次拆分成分片,把拆分獲得的文件分片寫入低性能的存儲器。參見附圖1,先把位于第一存儲池的文件分片讀出,主機把讀到的分片進行校驗并生成文件,然后重新把我文件打散成分片,寫入第二存儲池。
這種遷移方案中,先對文件分片進行匯聚,然后做ec校驗,接著又要把文件再次拆成文件分片,這些操作對存儲系統(tǒng)資源的耗費更大。
技術(shù)實現(xiàn)要素:
本發(fā)明第一種可能的實現(xiàn)方式,提供一種數(shù)據(jù)遷移方法,該方法包括:從元數(shù)據(jù)中查找滿足遷移條件的數(shù)據(jù)單元,獲得所述數(shù)據(jù)單元的分片的鍵key、鍵-值key-value所在的源存儲節(jié)點標識、以及目的存儲池標識,其中,每個鍵對應(yīng)一個值value;從所述目的存儲池標識代表的目的存儲池中,選擇用于存儲所述key-value的目的存儲節(jié)點;指令所述源存儲節(jié)點使用所述key從所述源存儲節(jié)點獲得所述key-value,把獲得的所述key-value發(fā)送給所述目的存儲節(jié)點。
使用該數(shù)據(jù)遷移方法,可以在kv協(xié)議的基礎(chǔ)上,實現(xiàn)把一個文件的分片在不同存儲節(jié)點的直接遷移。避免了先對文件分片進行匯聚,然后做ec校驗,接著又要把文件再次拆成文件分片,這些操作對存儲系統(tǒng)資源的耗費更大。
在第一種可能的實現(xiàn)方式種,可選的,遷移條件包括條件中的至少一個:數(shù)據(jù)單元的創(chuàng)建時間、數(shù)據(jù)單元的大小、數(shù)據(jù)單元名稱、數(shù)據(jù)單元所在存儲池。
在第一種可能的實現(xiàn)方式種,可選的,其中:所述源存儲節(jié)點所在的存儲池和所述目的存儲池提供的存儲性能不同。
在第一種可能的實現(xiàn)方式種,可選的,其中:源存儲節(jié)點在需要讀取和所述key-value相鄰的數(shù)據(jù)時,執(zhí)行把所述key-value發(fā)送給所述目的存儲節(jié)點的操作。
在第一種可能的實現(xiàn)方式種,可選的,所述數(shù)據(jù)單元是下面其中一種:文件、對象、塊或者文件的一部分。
本發(fā)明第二種可能的實現(xiàn)方式,提供一種遷移裝置,該裝置包括:查找模塊,用于從元數(shù)據(jù)中查找滿足遷移條件的數(shù)據(jù)單元,獲得所述數(shù)據(jù)單元的分片的鍵key、鍵-值key-value所在的源存儲節(jié)點標識、以及目的存儲池標識,其中,每個鍵對應(yīng)一個值value;目的存儲節(jié)點確定模塊,用于從所述目的存儲池標識代表的目的存儲池中,選擇用于存儲所述key-value的目的存儲節(jié)點;遷移模塊,用于指令所述源存儲節(jié)點使用所述key從所述源存儲節(jié)點獲得所述key-value,把獲得的所述key-value發(fā)送給所述目的存儲節(jié)點。
在第二種可能的實現(xiàn)方式中,可選的,遷移條件包括條件中的至少一個:數(shù)據(jù)單元的創(chuàng)建時間、數(shù)據(jù)單元的大小、數(shù)據(jù)單元名稱、數(shù)據(jù)單元所在存儲池。
在第二種可能的實現(xiàn)方式,可選的:所述源存儲節(jié)點所在的存儲池和所述目的存儲池提供的存儲性能不同。
在第二種可能的實現(xiàn)方式中,可選的:所述源存儲節(jié)點用于:在需要讀取和所述key-value相鄰的數(shù)據(jù)時,執(zhí)行把所述key-value發(fā)送給所述目的存儲節(jié)點的操作。
在第二種可能的實現(xiàn)方式中,可選的,所述數(shù)據(jù)單元是下面其中一種:文件、對象、塊或者文件的一部分。
附圖說明
為了更清楚地說明本發(fā)明實施例的方案,下面對實施例描述中所需要使用的附圖作簡單地介紹,下面描述中的附圖僅僅是本發(fā)明的一些實施例,還可以根據(jù)這些附圖獲得其他的附圖。
圖1是現(xiàn)有技術(shù)數(shù)據(jù)遷移方案的示意圖。
圖2是本發(fā)明實施例數(shù)據(jù)遷移方案的示意圖。
圖3是本發(fā)明實施例數(shù)據(jù)遷移方法的流程圖圖。
圖4是本發(fā)明實施例數(shù)據(jù)遷移裝置的結(jié)構(gòu)圖。
具體實施方式
下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明的技術(shù)方案進行描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例。基于本發(fā)明中的實施例所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。
本發(fā)明實施例中的分布式存儲系統(tǒng)可以用于存儲文件、對象(object)、塊(block)或者文件的一部分、對象的一部分。為了方便說明,下面以文件為例進行介紹,可以理解的是,在沒有特別聲明的情況下,后文提及的“文件”可以用“對象”、塊、“文件的一部分”或者“對象的一部分”替換。
基于鍵值(keyvalue,kv)存儲的分布式存儲系統(tǒng),是分布式存儲系統(tǒng)的一種存在形式。分布式存儲系統(tǒng)可以包括存儲池,存儲池(pool)是一個提供存儲空間的邏輯上的單位,存儲池包括存儲節(jié)點,不同的存儲池的性能級別可以不同。把一個文件存儲到存儲池中,具體而言是:把文件拆分從成文件分片(數(shù)據(jù)分片+校驗分片),把不同的文件分片存儲到不同的存儲節(jié)點中,或者是把不同的文件分片存儲到不同的存儲器(此種情況不對存儲器所屬于的存儲節(jié)點進行區(qū)分,由于一個存儲節(jié)點可以有多個存儲器,因此有可能有部分文件分片存儲在同一個存儲節(jié)點)中。
例如:采用分布式哈希表(dht)算法或者范圍分區(qū)(rangepartition)算法確定文件分片的具體存儲器,然后把這些分片存儲到不同的存儲器中。此外,還有多副本的存儲方式,也就是把同一個文件/文件分片存儲到多個存儲器中。前一種存儲方式,如果有文件分片丟失,可以用余下的分片通過校驗算法恢復(fù)出丟失的文件分片。后一種存儲方式,由于各個副本的內(nèi)容相同,如果有副本丟失,讀取其他副本即可。
本發(fā)明實施例提供的方案,可以把一個存儲池的文件遷移到另外一個資源池。由于不同資源池的性能不同,因此本發(fā)明實施例可以實現(xiàn)把文件從高性能存儲器遷移到低性能存儲器;或者反之,把低性能存儲器遷移到高性能存儲器的辦法。存儲池性能的高低可以用每秒讀寫速度、存儲介質(zhì)的穩(wěn)定性、存儲池的冗余保護級別等進行描述。例如由固態(tài)硬盤(ssd)組成的存儲池的性能,通常來講大于由磁盤組成的存儲池的性能;而由高速磁盤組成的存儲池的性能,大于由低速磁盤組成的存儲池的性能。一般來說,高性能存儲池的成本大于低性能的存儲池。
參見附圖2,本發(fā)明實施例的文件遷移方案中,位于第一存儲池的文件分片無需經(jīng)過在主機或者其他存儲節(jié)點的匯聚,直接遷入位于第二存儲池的存儲節(jié)點。該方案避免了文件分片的重新匯聚和打散,減少ec計算,減少數(shù)據(jù)遷移對前臺業(yè)務(wù)的影響。
參見圖3的流程圖和下面的步驟,介紹了本發(fā)明實施例提供一種數(shù)據(jù)遷移方法。需要說明的是,下面的實施例以存儲池之間數(shù)據(jù)遷移為例進行介紹,實際上也可以沒有存儲池的概念,而直接是存儲節(jié)點之間的文件分片之間的遷移。
步驟11、在存儲系統(tǒng)中預(yù)存數(shù)據(jù)遷移策略。
存儲系統(tǒng)由多個存儲池組成,每個存儲池包括至少一個存儲節(jié)點。存儲節(jié)點例如是服務(wù)器(server)、主機(host)或者是控制器+存儲器的組合。存儲節(jié)點用于存儲數(shù)據(jù),還可以對存儲的數(shù)據(jù)進行管理。
遷移策略可以保存在某一個存儲節(jié)點中,例如存儲在管理存儲節(jié)點中;也可以存儲在多個存儲節(jié)點中,例如每個存儲節(jié)點存儲一部分存儲策略,或者每個存儲節(jié)點存儲完整的存儲策略。
遷移策略可以描述符合遷移條件的文件的標準。遷移條件可以包括文件所在存儲池id,還可以包括:文件的創(chuàng)建時間、距離文件最后一次被訪問的時間、文件的大小、文件名稱、文件名稱前綴、文件名稱后綴、這些條件中的至少一個。每個遷移條件包括了具體的參數(shù)值,例如:文件的大小大于10mbytes,文件的創(chuàng)建時間超快10天,文件名稱前綴是aaa,文件所在的存儲池是存儲池a。因此,遷移策略包括:遷移條件、文件所在存儲池id、目標存儲池id。文件所在存儲池id也可以不作為遷移條件的選項,而是作為遷移策略的參數(shù)之一。換句話說,遷移策略包括:遷移條件、文件所在存儲池id、目標存儲池id。這兩種描述方式并不矛盾,下面以前一種為例進行說明。
示例性的,一種遷移策略是,滿足:文件名是前綴aaa開頭的文件、創(chuàng)建時間早于2017/1/1、最后一次修改時間早于2017/2/1、最后一次訪問時間早于2017/2/1、并且位于高性能的存儲池1(源存儲池)的文件的文件分片,需要遷移到底成本的存儲池2(目的存儲池)。
本步驟是預(yù)置步驟,并不是每次執(zhí)行遷移時都需要執(zhí)行本步驟。因此,本步驟在正常遷移流程中是可選的,只要在存儲系統(tǒng)中已經(jīng)存在有遷移除策略即可。
步驟12、查找符合遷移條件的文件,獲得所述文件的分片的鍵key。獲得鍵-值(key-value,kv)所在的源存儲節(jié)點的存儲節(jié)點標識,以及目的存儲池標識。本步驟可以由所述管理存儲節(jié)點執(zhí)行,也可由所述存儲系統(tǒng)中的其他存儲節(jié)點執(zhí)行。
查詢操作可以周期性進行,也可以由管理員強制觸發(fā)。
元數(shù)據(jù)描述了文件的各項實際參數(shù),例如前文所述的文件的創(chuàng)建時間、距離文件最后一次被訪問的時間、文件的大小、文件名稱、文件名稱前綴、文件名稱后綴。因此用遷移條件和元數(shù)據(jù)進行比對,可以查找到滿足遷移條件的文件。
查找到符合遷移條件的文件后,由符合遷移條件的文件的元數(shù)據(jù)可以獲得這個文件的各個文件分片(簡稱分片)的key。
例如,一種key命名規(guī)則是:文件名前綴+自然數(shù),并且每個分片的大小是固定的。假設(shè)對于一個前綴為abc的文件,從元數(shù)據(jù)中獲知這個文件大小是10mbytes,每個分片的大小是2mbytes。我們可以得到文件的數(shù)據(jù)分片的key的命名是:aaa1,aaa2,aaa3,aaa4和aaa5。假設(shè)還有2個冗余的校驗分片,那么校驗分片的命名是:aaa6和aaa7。由此就可以獲得這個文件的所有文件分片(校驗分片和數(shù)據(jù)分片)的key。這些與數(shù)據(jù)分片和校驗分片就是value,和key一一對應(yīng),需要在后續(xù)步驟中從源存儲池中遷移出去。
需要說明的是,上述根據(jù)文件名生成key的命名規(guī)則是一種常見的做法,因為這種做法比較簡便。除了上面這個例子還可以有其他方案。此外,有其他方式使用文件名生成key。此外,也可以不用文件名,使用其他算法生成key。例如,使用一種偽隨機數(shù)算法生成的偽隨機數(shù)作為key,還可以用文件的大小與英文字母的組合作為key。只要key和value一一對應(yīng),并且盡量保證(有時候不是必須保證)不同的value對應(yīng)到的key不重復(fù)即可。
元數(shù)據(jù)中可以記錄key-value所在的存儲節(jié)點。那么,讀取元數(shù)據(jù)就可以獲知key-value所在的源存儲節(jié)點。
另外一種獲得key-value所在的源存儲節(jié)點的方案介紹如下:
容易想到:在遷移key-value之前,首先需要把key-value存儲到存儲節(jié)點中。在把key-value存儲到源存儲池中時,按照分布式算法對key進行運算,以選擇存儲key-value的具體存儲節(jié)點。因此,本步驟在獲得分片的key后,按照同樣的的分布式算法,可以知道key-value所在的存儲節(jié)點。一種可選的分布式算法是dht:對key進行哈希運行,把計算獲得的哈希值按照存儲池中存儲節(jié)點的數(shù)量取模運行,獲得的值就是存儲key-value的存儲節(jié)點。例如:源存儲池中一共有依次排序的:存儲節(jié)點1、存儲節(jié)點2、存儲節(jié)點3和存儲節(jié)點4四個存儲節(jié)點。哈希運算后,按照存儲節(jié)點的總數(shù)4取模獲得的值是2,那么key-value位于排名第二的存儲節(jié)點2中。
目的存儲池標識可以預(yù)先設(shè)置。目的存儲池可以和源存儲池形成映射關(guān)系。例如:當存儲池a作為源存儲池時,其對應(yīng)的目的存儲池是存儲池b;當存儲池b作為源存儲池時,其對應(yīng)的目的存儲池是存儲池c;當存儲池d作為源存儲池時,其對應(yīng)的目的存儲池是存儲池e。當然,也可以由特定的算法來決定,甚至可以由管理員指定,此處不做限制。
考慮到每個key-value的遷移方式相同。這些key-value的遷移可以并行執(zhí)行以提高遷移效率。因此,為了描述的簡便,在沒有特別說明的情況下,在步驟13-步驟15中僅以其中一個key-value的操作流程進行舉例。
步驟13,從所述目的存儲池標識所代表的目的存儲池中,選擇用于存儲所述key-value的目的存儲節(jié)點。
本步驟可以由所述管理存儲節(jié)點執(zhí)行,也可由所述存儲系統(tǒng)中的其他存儲節(jié)點執(zhí)行,例如由目的存儲池中一個存儲節(jié)點來執(zhí)行。
示例性的,可以使用類似驟12的dht方案,選擇目的存儲池中的一個存儲節(jié)點作為所述目的存儲節(jié)點,用于存儲所述key-value。另外,也可以輪流選擇一個存儲節(jié)點作為所述目的存儲節(jié)點。此外,還可以隨機選擇一個存儲節(jié)點作為目的存儲節(jié)點。因此,選擇方案可以有多種。只要從所述目的存儲池中選擇出一個存儲節(jié)點即可。
步驟14,指令所述源存儲節(jié)點使用所述key從所述源存儲節(jié)點獲得所述key-value,把獲得的所述key-value發(fā)送給所述目的存儲節(jié)點進行存儲。源存儲節(jié)點按照指令使用所述key從所述源存儲節(jié)點獲得所述key-value,把獲得的所述key-value發(fā)送給所述目的存儲節(jié)點進行存儲。
目的存儲節(jié)點接收所述key-value后,可以把所述key-value存儲在本地的內(nèi)存或者存儲器中,這樣就完成了一個key-value的遷移。以此類推,按照同樣方法可以對余下的key-value進行遷移。如果同一個文件的所有文件分片都完成了遷移,則整個文件的遷移完成。
本步驟中,如果發(fā)出指令的存儲節(jié)點和源存儲節(jié)點是同一個存儲節(jié)點,則指令是可選的,或者也可以看做是源存儲節(jié)點自己給自己發(fā)出指令。直接由所述源存儲節(jié)點從本地的存儲器中獲得所述key-value,把獲得的所述key-value發(fā)送給所述目的存儲節(jié)點進行存儲。
本步驟中,如果發(fā)出指令的存儲節(jié)點和源存儲節(jié)點不是同一個存儲節(jié)點,則發(fā)出指令的存儲節(jié)點把指令發(fā)給源存儲節(jié)點,讓源存儲節(jié)點源存儲節(jié)點從本地的存儲器中獲得所述key-value,把獲得的所述key-value發(fā)送給所述目的存儲節(jié)點進行存儲。
源存儲節(jié)點如果有多個存儲器,則還需要確定key-value具體所在的硬盤。其確定方法可以由當初key-value被存儲到存儲器的方式確定。根據(jù)對key進行哈希以及取模,確定key-value被存儲到存儲器。此外,也可以由源存儲節(jié)點維護一個映射表,映射表中記錄key和key-value存儲位置這二者的關(guān)系,那么使用key在映射表中查找,也可以獲得key-value所在的存儲器。
可選的,源存儲節(jié)點在收到所述指令后暫時不讀取所述key-value。而是在源存儲節(jié)點在需要讀取與所述key-value相鄰的數(shù)據(jù)時,執(zhí)行把所述key-value發(fā)送給所述目的存儲節(jié)點的操作。這樣的好處是可以連續(xù)讀取相鄰的兩個數(shù)據(jù),對從硬盤(尤其是機械、軟盤、光盤等依靠旋轉(zhuǎn)讀取數(shù)據(jù)的介質(zhì))而言,能夠提高讀取效率。
另外一種可選方案是,在硬盤空閑時(例如沒有前臺業(yè)務(wù)需要讀/寫所述源存儲節(jié)點時),按照順序讀取待遷移的數(shù)據(jù),這種做法可以減少遷移操作對正常業(yè)務(wù)的影響。
步驟15,在把所述key-value寫入目的存儲節(jié)點后操作后,目的存儲節(jié)點后通知管理存儲節(jié)點所述key-value寫入完成。
上述描述了一個特定的key-value(為了和該文件的其他key-value進行區(qū)分,可以把這個特定的key-value命名為第一key-value)的遷移方法,除了第一key-value之外的其他key-value(數(shù)據(jù)分片或者校驗分片)可以使用相同的遷移方案,在所述文件的所有key-value(按照上述方法)寫入對應(yīng)的目的存儲器后,完成整個文件的遷移。在完成整個文件的遷移后,管理存儲節(jié)點修改所述元數(shù)據(jù)中存儲位置信息,把存儲位置信息更新為所述目的存儲池的id。
可選的,在每個key-value按照上述方法寫入對應(yīng)目的存儲器后此外,所述管理存儲節(jié)點可以通知源存儲節(jié)點刪除本地的key-value。
使用上述數(shù)據(jù)遷移方法,對擁有kv接口的分布式存儲節(jié)點、實現(xiàn)了存儲節(jié)點與存儲節(jié)點之間點對點數(shù)據(jù)遷移。消除現(xiàn)有技術(shù)中,遷移數(shù)據(jù)所涉及的數(shù)據(jù)再匯聚、打散、以及計算ec等操作對系統(tǒng)資源的占用消耗,大幅提升系統(tǒng)可靠性。
此外,遷移的具體內(nèi)容取決于key-value在源存儲池中的存儲方式。因此,上述key-value的遷移可以是key和value二者共同從源存儲池遷移到目的存儲池;也可以僅指其中的value從源存儲池遷移到目的存儲池。
本發(fā)明還提供一種存儲節(jié)點,包括:處理器,還可以包括內(nèi)存。內(nèi)存中有計算機程序,處理器執(zhí)行內(nèi)存中的程序可以執(zhí)行是上面不在11-步驟16中可以由管理存儲節(jié)點執(zhí)行的操作。
此外,除了上面是遷移方法實施例,本發(fā)明還提供一種數(shù)據(jù)遷移裝置的實施例,該遷移裝置和前述方法對應(yīng),可以執(zhí)行上述方法。參見圖4,所述數(shù)據(jù)遷移裝置包括查找模塊21,目的存儲節(jié)點確定模塊22和遷移模塊23。
查找模塊21,用于從元數(shù)據(jù)中查找滿足遷移條件的數(shù)據(jù)單元,獲得所述數(shù)據(jù)單元的分片的鍵key、鍵-值key-value所在的源存儲節(jié)點標識、以及目的存儲池標識,其中,每個鍵對應(yīng)一個值value;
目的存儲節(jié)點確定模塊22,用于從所述目的存儲池標識代表的目的存儲池中,選擇用于存儲所述key-value的目的存儲節(jié)點;
遷移模塊23,用于指令所述源存儲節(jié)點使用所述key從所述源存儲節(jié)點獲得所述key-value,把獲得的所述key-value發(fā)送給所述目的存儲節(jié)點進行存儲。如果所述數(shù)據(jù)遷移裝置集成于所述源存儲節(jié)點,則所述遷移模塊還可以執(zhí)行:使用所述key從所述源存儲節(jié)點獲得所述key-value,把獲得的所述key-value發(fā)送給所述目的存儲節(jié)點。以供目的存儲節(jié)點進行存儲。
其中,遷移條件包括條件中的至少一個:數(shù)據(jù)單元的創(chuàng)建時間、數(shù)據(jù)單元的大小、數(shù)據(jù)單元名稱、數(shù)據(jù)單元所在存儲池。
其中,所述源存儲節(jié)點所在的存儲池和所述目的存儲池提供的存儲性能不同。
其中,所述源存儲節(jié)點用于:在需要讀取和所述key-value相鄰的數(shù)據(jù)時,執(zhí)行把所述key-value發(fā)送給所述目的存儲節(jié)點的操作。
其中,所述數(shù)據(jù)單元是下面其中一種:文件、對象、塊或者文件的一部分。
通過以上的實施方式的描述,所屬領(lǐng)域的技術(shù)人員可以清楚地了解到本發(fā)明可借助軟件加必需的通用硬件的方式來實現(xiàn),當然也可以通過硬件,但很多情況下前者是更佳的實施方式。基于這樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品存儲在可讀取的存儲介質(zhì)中,如計算機的軟盤,硬盤或光盤等,包括若干指令用以使得一臺計算機設(shè)備(可以是個人計算機,服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個實施例所述的方法。
以上所述,僅為本發(fā)明的具體實施方式,但本發(fā)明的保護范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到的變化或替換,都應(yīng)涵蓋在本發(fā)明的保護范圍之內(nèi)。因此,本發(fā)明的保護范圍應(yīng)以所述權(quán)利要求的保護范圍為準。