本發(fā)明涉及云計算領(lǐng)域,具體是涉及一種在共享存儲上實現(xiàn)邏輯卷動態(tài)分配的方法及系統(tǒng)。
背景技術(shù):
在云計算數(shù)據(jù)中心,多臺服務(wù)器之間為了實現(xiàn)高可用、高性能以及高可靠性,將數(shù)據(jù)保存在共享存儲中。當(dāng)其中一臺服務(wù)器發(fā)生故障時,其他正常的服務(wù)器可以接管其在共享存儲上的數(shù)據(jù),從而做到不間斷對外服務(wù)。
傳統(tǒng)的數(shù)據(jù)共享方法有兩種:
1、基于邏輯卷的數(shù)據(jù)共享。以類UNIX系統(tǒng)下的LVM為例,其中的精簡配置功能可以做到按需分配,但只能在單機(jī)環(huán)境下使用,無法做到高可用。邏輯卷的分配往往需要提前確定要分配的大小,如果分配少了,則必須關(guān)閉正在使用的程序,待擴(kuò)展空間后才能啟動程序繼續(xù)使用,如果分配多了,而程序有可能用不了那么多,造成空間的浪費。
2、購買支持精簡配置功能的存儲設(shè)備。這種存儲設(shè)備可以預(yù)先分配用戶要求大小的邏輯卷,但直到進(jìn)行真正寫入時才進(jìn)行真正空間分配,而且性能很好。然而這類設(shè)備比較昂貴,同時需要對硬件設(shè)施有更多要求,增加部署和運維成本。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的是為了克服上述背景技術(shù)的不足,提供一種在共享存儲上實現(xiàn)邏輯卷動態(tài)分配的方法及系統(tǒng),無需購買昂貴的高端存儲設(shè)備,低成本、低消耗、高性能、高可用,實現(xiàn)存儲空間的動態(tài)按需分配,能夠更加有效的利用存儲空間。
本發(fā)明提供一種在共享存儲上實現(xiàn)邏輯卷動態(tài)分配的系統(tǒng),應(yīng)用在云計算數(shù)據(jù)中心,其特征在于,該系統(tǒng)包括若干服務(wù)器、共享存儲設(shè)備和網(wǎng)絡(luò)交換機(jī),每臺服務(wù)器上都安裝有虛擬磁盤的驅(qū)動程序、服務(wù)程序和命令行工具,其中一臺服務(wù)器為主節(jié)點,其他的服務(wù)器為從節(jié)點;
用戶通過命令行工具發(fā)出創(chuàng)建虛擬磁盤的命令,命令行工具將該命令發(fā)送給主節(jié)點的服務(wù)程序,主節(jié)點的服務(wù)程序根據(jù)參數(shù)調(diào)用驅(qū)動程序,創(chuàng)建虛擬磁盤,同時在虛擬磁盤的保留空間內(nèi)保存對應(yīng)的配置、映射數(shù)據(jù),然后將創(chuàng)建結(jié)果返回給命令行工具,命令行工具更新本地數(shù)據(jù),并使用驅(qū)動程序在本地加載對應(yīng)的虛擬磁盤;此時驅(qū)動程序僅給用戶分配一個要求大小的虛擬磁盤,實際上卻只分配了使用者要求大小的1%到10%的存儲空間,這一點對用戶是透明的,用戶以為分配了全部的空間;
當(dāng)用戶對該虛擬磁盤進(jìn)行寫入時,驅(qū)動程序如果發(fā)現(xiàn)被寫入的存儲空間還沒有被分配,則通知主節(jié)點的服務(wù)程序分配額外的存儲空間,并更新保留空間內(nèi)的映射數(shù)據(jù),然后用戶在新分配的空間上進(jìn)行寫入,實現(xiàn)存儲空間的動態(tài)按需分配;
當(dāng)用戶對該虛擬磁盤進(jìn)行讀取時,驅(qū)動程序如果發(fā)現(xiàn)被讀取的存儲空間還沒有被分配,則直接返回全0的數(shù)據(jù),不進(jìn)行實際的存儲設(shè)備操作;
當(dāng)用戶讀寫已經(jīng)實際分配存儲空間時,驅(qū)動程序直接在本地進(jìn)行數(shù)據(jù)塊映射;
當(dāng)主節(jié)點崩潰時,在從節(jié)點中任意選一個,設(shè)為新主節(jié)點,然后向其余節(jié)點上的服務(wù)程序發(fā)送新主節(jié)點的相關(guān)信息,虛擬磁盤繼續(xù)正常運行,不間斷對外提供服務(wù),實現(xiàn)高可用。
在上述技術(shù)方案的基礎(chǔ)上,所述驅(qū)動程序采用數(shù)組映射算法進(jìn)行數(shù)據(jù)塊映射。
本發(fā)明還提供一種在共享存儲上實現(xiàn)邏輯卷動態(tài)分配的方法,應(yīng)用在云計算數(shù)據(jù)中心,該方法包括以下步驟:
在所有服務(wù)器上安裝虛擬磁盤的驅(qū)動程序、服務(wù)程序和命令行工具,其中一臺服務(wù)器為主節(jié)點,其他的服務(wù)器為從節(jié)點;
用戶通過命令行工具發(fā)出創(chuàng)建虛擬磁盤的命令,命令行工具將該命令發(fā)送給主節(jié)點的服務(wù)程序,主節(jié)點的服務(wù)程序根據(jù)參數(shù)調(diào)用驅(qū)動程序,創(chuàng)建虛擬磁盤,同時在虛擬磁盤的保留空間內(nèi)保存對應(yīng)的配置、映射數(shù)據(jù),然后將創(chuàng)建結(jié)果返回給命令行工具,命令行工具更新本地數(shù)據(jù),并使用驅(qū)動程序在本地加載對應(yīng)的虛擬磁盤;此時驅(qū)動程序僅給用戶分配一個要求大小的虛擬磁盤,實際上卻只分配了使用者要求大小的1%到10%的存儲空間,這一點對用戶是透明的,用戶以為分配了全部的空間;
當(dāng)用戶對該虛擬磁盤進(jìn)行寫入時,驅(qū)動程序如果發(fā)現(xiàn)被寫入的存儲空間還沒有被分配,則通知主節(jié)點的服務(wù)程序分配額外的存儲空間,并更新保留空間內(nèi)的映射數(shù)據(jù),然后用戶在新分配的空間上進(jìn)行寫入,實現(xiàn)存儲空間的動態(tài)按需分配;
當(dāng)用戶對該虛擬磁盤進(jìn)行讀取時,驅(qū)動程序如果發(fā)現(xiàn)被讀取的存儲空間還沒有被分配,則直接返回全0的數(shù)據(jù),不進(jìn)行實際的存儲設(shè)備操作;
當(dāng)用戶讀寫已經(jīng)實際分配存儲空間時,驅(qū)動程序直接在本地進(jìn)行數(shù)據(jù)塊映射;
當(dāng)主節(jié)點崩潰時,在從節(jié)點中任意選一個,設(shè)為新主節(jié)點,然后向其余節(jié)點上的服務(wù)程序發(fā)送新主節(jié)點的相關(guān)信息,虛擬磁盤繼續(xù)正常運行,不間斷對外提供服務(wù),實現(xiàn)高可用。
在上述技術(shù)方案的基礎(chǔ)上,所述驅(qū)動程序采用數(shù)組映射算法進(jìn)行數(shù)據(jù)塊映射。
在上述技術(shù)方案的基礎(chǔ)上,所述云計算數(shù)據(jù)中心有兩臺服務(wù)器時,其中一個是主節(jié)點M,另外一個是從節(jié)點S,他們使用同一個共享存儲的一個邏輯單元號LUN為1的卷,并在其上使用邏輯卷管理軟件創(chuàng)建一個物理卷,然后加入卷組,這種情況下,步驟S1中,在主節(jié)點M上加載驅(qū)動,并以主控模式啟動服務(wù)程序,然后在從節(jié)點S上加載驅(qū)動,以主節(jié)點M的IP地址為參數(shù),使用從屬模式啟動服務(wù)程序。
在上述技術(shù)方案的基礎(chǔ)上,在任意一個節(jié)點上,使用命令行工具創(chuàng)建一個大小為L的虛擬磁盤D,其中需要指定主節(jié)點M的IP地址,要使用的卷組,命令行工具將對應(yīng)的命令發(fā)送給主節(jié)點M的服務(wù)程序執(zhí)行。
在上述技術(shù)方案的基礎(chǔ)上,所述主節(jié)點M的服務(wù)程序使用邏輯卷管理軟件在卷組上創(chuàng)建一個名稱為“D-Base”、大小為L-Base的卷,D-Base是一個名稱,L-Base是一個變量,L-Base遠(yuǎn)小于用戶所要求的磁盤大小L,其中包含保留空間R和部分預(yù)先分配空間P,即L-Base=(R+P)<<L,保留空間僅用于保存虛擬磁盤頭信息,數(shù)據(jù)塊映射表,對用戶不可見;
命令行工具調(diào)用驅(qū)動程序創(chuàng)建虛擬磁盤D,虛擬磁盤驅(qū)動程序加載剛才創(chuàng)建的D-Base卷,讀取其頭信息及數(shù)據(jù)塊映射表,建立虛擬磁盤D到D-Base卷的映射;
驅(qū)動程序根據(jù)指定參數(shù)將磁盤D和D-Base拆分成大小相等的N個數(shù)據(jù)塊,N為正整數(shù),每個數(shù)據(jù)塊都有一個唯一的序號,從0到N-1;映射表其實就是一個數(shù)組,其索引為磁盤D上的數(shù)據(jù)塊序號,內(nèi)容為映射到磁盤D-Base上的數(shù)據(jù)塊序號;如果某個映射表項的內(nèi)容為-1,則表明該數(shù)據(jù)塊尚未映射到D-Base上,即該數(shù)據(jù)塊尚未被分配,創(chuàng)建虛擬磁盤時,映射表的所有內(nèi)容都是-1;同時虛擬磁盤頭信息中保存當(dāng)前已經(jīng)分配的數(shù)據(jù)塊個數(shù)U,創(chuàng)建虛擬磁盤時為0,最大為N。
在上述技術(shù)方案的基礎(chǔ)上,當(dāng)用戶對虛擬磁盤D進(jìn)行寫入時,驅(qū)動程序計算出用戶寫入地址所對應(yīng)的數(shù)據(jù)塊序號X,并根據(jù)數(shù)據(jù)塊序號X獲取對應(yīng)數(shù)據(jù)塊的映射表內(nèi)容,如果是-1,則表明虛擬磁盤D的第X個數(shù)據(jù)塊尚未在D-Base上進(jìn)行分配,于是將D-Base卷上第U個數(shù)據(jù)塊分配給虛擬磁盤D的第X個數(shù)據(jù)塊,同時更新映射表,U加一,U為正整數(shù),且U小于N;另外驅(qū)動程序中還有一個內(nèi)核線程定時重新計算映射表的循環(huán)冗余校驗CRC校驗值,并異步刷新至虛擬磁盤D中,減少存儲設(shè)備寫入次數(shù),提高壽命;如果映射表不是-1,則表明該數(shù)據(jù)塊已經(jīng)分配,直接將D-Base卷上的數(shù)據(jù)塊提供給用戶。
在上述技術(shù)方案的基礎(chǔ)上,所述驅(qū)動程序?qū)τ脩舻膶懭氩僮鬟M(jìn)行區(qū)分,僅當(dāng)寫入未分配的數(shù)據(jù)塊時,才進(jìn)行新的數(shù)據(jù)塊分配,讀取未分配的數(shù)據(jù)塊時,直接返回全0的數(shù)據(jù)。
在上述技術(shù)方案的基礎(chǔ)上,所述D-Base卷中至少預(yù)留Y個數(shù)據(jù)塊供邏輯卷D使用,Y為正整數(shù),且Y小于N;當(dāng)D-Base卷中預(yù)留的數(shù)據(jù)塊不足Y個時,在給虛擬磁盤D分配新數(shù)據(jù)塊的同時,提前通知主節(jié)點M的服務(wù)程序使用邏輯卷管理軟件給虛擬磁盤D增加容量。
與現(xiàn)有技術(shù)相比,本發(fā)明的優(yōu)點如下:
(1)節(jié)省空間。在云計算數(shù)據(jù)中心中,多臺計算機(jī)通過塊存儲設(shè)備共享存儲。在共享的塊存儲設(shè)備上,用戶可以通過多臺計算機(jī)同時使用虛擬磁盤分配要求的存儲空間,但虛擬磁盤并未立即分配全部空間,直到用戶真正進(jìn)行存取時,才根據(jù)特定的算法進(jìn)行實際分配。本發(fā)明只有在用戶初次寫入時,才實際分配空間,能夠有效避免空間浪費。讀取未被分配的數(shù)據(jù)塊時,不會分配新的數(shù)據(jù)塊,直接返回全0的數(shù)據(jù),避免不必要的空間占用,同時也避免真正的磁盤讀取操作,提升了性能。映射表支持隨機(jī)映射,因此允許空洞文件,不會分配那些沒有被使用的塊,進(jìn)一步節(jié)省空間。
(2)高可用。虛擬磁盤進(jìn)行實際分配的過程對用戶是透明的,對用戶來說一開始就全部分配完成了。虛擬磁盤在進(jìn)行實際分配時,不需要關(guān)閉正在使用虛擬磁盤的程序,從而實現(xiàn)真正的動態(tài)按需分配。多臺計算機(jī)可同時使用,在虛擬磁盤動態(tài)分配時不需要關(guān)閉使用它的程序,當(dāng)其中一臺計算機(jī)發(fā)生故障時可以快速轉(zhuǎn)移。
(3)高性能。當(dāng)用戶訪問已分配數(shù)據(jù)塊時,由于映射表在內(nèi)存中,且采用數(shù)組結(jié)構(gòu),幾乎無性能損耗。對于少量較為耗時的動態(tài)數(shù)據(jù)塊分配,由于采用并行預(yù)分配算法,對性能的影響也非常小。
(4)低成本。支持邏輯卷管理功能的計算機(jī)系統(tǒng)均可以使用本發(fā)明的方法,且不需要購買昂貴的高端存儲設(shè)備,也不需要對部署環(huán)境做額外硬件要求和特殊配置,能夠降低部署和運維成本。
(5)低消耗。由于使用了基于數(shù)組的映射算法,當(dāng)配置數(shù)據(jù)塊大小為16M時,只消耗約1M內(nèi)存,就可以映射2TB容量的虛擬磁盤。虛擬磁盤通過此算法,在保證高可用、高性能、低成本、低消耗的同時,能夠更加有效的利用存儲空間。
(6)高可靠性。映射表設(shè)計簡單高效,還使用了CRC校驗和異步刷新機(jī)制,可以檢測映射表的異常情況,并延長映射表保存區(qū)域的磁盤壽命,有效提高虛擬磁盤的可靠性。
具體實施方式
本發(fā)明實施例提供一種在共享存儲上實現(xiàn)邏輯卷動態(tài)分配的系統(tǒng),應(yīng)用在云計算數(shù)據(jù)中心,該系統(tǒng)包括若干服務(wù)器、共享存儲設(shè)備和網(wǎng)絡(luò)交換機(jī),每臺服務(wù)器上都安裝有虛擬磁盤的驅(qū)動程序、服務(wù)程序和命令行工具。
本發(fā)明實施例提供一種在共享存儲上實現(xiàn)邏輯卷動態(tài)分配的方法,應(yīng)用在云計算數(shù)據(jù)中心,該方法包括以下步驟:
在所有服務(wù)器上安裝虛擬磁盤的驅(qū)動程序、服務(wù)程序和命令行工具,其中一臺服務(wù)器為主節(jié)點,其他的服務(wù)器為從節(jié)點;
用戶通過命令行工具發(fā)出創(chuàng)建虛擬磁盤的命令,命令行工具將該命令發(fā)送給主節(jié)點的服務(wù)程序,主節(jié)點的服務(wù)程序根據(jù)參數(shù)調(diào)用驅(qū)動程序,創(chuàng)建虛擬磁盤,同時在虛擬磁盤的保留空間內(nèi)保存對應(yīng)的配置、映射數(shù)據(jù)等,然后將創(chuàng)建結(jié)果返回給命令行工具,命令行工具更新本地數(shù)據(jù),并使用驅(qū)動程序在本地加載對應(yīng)的虛擬磁盤;此時驅(qū)動程序僅給用戶分配一個要求大小的虛擬磁盤,然而實際上卻只分配了很小的一部分存儲空間,大約使用者要求大小的1%到10%,也可自由調(diào)整,這一點對用戶是透明的,用戶以為分配了全部的空間;
當(dāng)用戶對這個虛擬磁盤進(jìn)行寫入時,驅(qū)動程序如果發(fā)現(xiàn)被寫入的存儲空間還沒有被分配,則通知主節(jié)點的服務(wù)程序分配額外的存儲空間,并更新保留空間內(nèi)的映射數(shù)據(jù),然后用戶在新分配的空間上進(jìn)行寫入,從而實現(xiàn)存儲空間的動態(tài)按需分配;
當(dāng)用戶對該虛擬磁盤進(jìn)行讀取時,驅(qū)動程序如果發(fā)現(xiàn)被讀取的存儲空間還沒有被分配,則直接返回全0的數(shù)據(jù),不進(jìn)行實際的存儲設(shè)備操作;
當(dāng)用戶讀寫已經(jīng)實際分配存儲空間時,直接在本地進(jìn)行數(shù)據(jù)塊映射,由于采用簡單的數(shù)組映射算法,整個過程幾乎沒有性能損耗;
當(dāng)主節(jié)點崩潰時,在從節(jié)點中任意選一個,設(shè)為新主節(jié)點,然后向其余節(jié)點上的服務(wù)程序發(fā)送新主節(jié)點的相關(guān)信息,虛擬磁盤就可以繼續(xù)正常運行,不間斷對外提供服務(wù),實現(xiàn)高可用。
下面結(jié)合具體實施例對本發(fā)明作進(jìn)一步的詳細(xì)描述。
假設(shè)云計算數(shù)據(jù)中心有兩臺服務(wù)器,其中一個是主節(jié)點M,另外一個是從節(jié)點S,他們使用同一個共享存儲的一個LUN(Logical Unit Number,邏輯單元號)為1的卷,并在其上使用邏輯卷管理軟件創(chuàng)建一個物理卷PV(Physical Volume,物理卷),然后加入卷組VG(Volume Group,卷組)。
這種情況下,在主節(jié)點M上加載驅(qū)動,并以主控模式啟動服務(wù)程序,然后在從節(jié)點S上加載驅(qū)動,以主節(jié)點M的IP地址為參數(shù),使用從屬模式啟動服務(wù)程序。
在任意一個節(jié)點上,使用命令行工具創(chuàng)建一個大小為L的虛擬磁盤D,其中需要指定主節(jié)點M的IP地址,要使用的卷組。命令行工具會將對應(yīng)的命令發(fā)送給主節(jié)點M的服務(wù)程序執(zhí)行。
主節(jié)點M的服務(wù)程序使用邏輯卷管理軟件在卷組上創(chuàng)建一個名稱為“D-Base”、大小為L-Base的卷,D-Base是一個名稱,L-Base是一個變量,L-Base遠(yuǎn)小于用戶所要求的磁盤大小L,其中包含保留空間R和部分預(yù)先分配空間P,即L-Base=(R+P)<<L。保留空間僅用于保存虛擬磁盤頭信息,數(shù)據(jù)塊映射表,對用戶不可見。
命令行工具調(diào)用驅(qū)動程序創(chuàng)建虛擬磁盤D,虛擬磁盤驅(qū)動程序加載剛才創(chuàng)建的D-Base卷,讀取其頭信息及數(shù)據(jù)塊映射表,建立虛擬磁盤D到D-Base卷的映射。
驅(qū)動程序根據(jù)指定參數(shù)將磁盤D和D-Base拆分成大小相等的N個數(shù)據(jù)塊,N為正整數(shù),每個數(shù)據(jù)塊都有一個唯一的序號,從0到N-1。映射表其實就是一個數(shù)組,其索引為磁盤D上的數(shù)據(jù)塊序號,內(nèi)容為映射到磁盤D-Base上的數(shù)據(jù)塊序號。如果某個映射表項的內(nèi)容為-1,則表明該數(shù)據(jù)塊尚未映射到D-Base上,也就是說該數(shù)據(jù)塊尚未被分配,創(chuàng)建虛擬磁盤時,映射表的所有內(nèi)容都是-1;同時虛擬磁盤頭信息中保存當(dāng)前已經(jīng)分配的數(shù)據(jù)塊個數(shù)U,創(chuàng)建虛擬磁盤時為0,最大為N。
當(dāng)用戶對虛擬磁盤D進(jìn)行寫入時,驅(qū)動程序計算出用戶寫入地址所對應(yīng)的數(shù)據(jù)塊序號X,并根據(jù)數(shù)據(jù)塊序號X獲取對應(yīng)數(shù)據(jù)塊的映射表內(nèi)容,如果是-1,則表明虛擬磁盤D的第X個數(shù)據(jù)塊尚未在D-Base上進(jìn)行分配,于是將D-Base卷上第U個數(shù)據(jù)塊分配給虛擬磁盤D的第X個數(shù)據(jù)塊,同時更新映射表,U加一,U為正整數(shù),且U小于N;另外驅(qū)動程序中還有一個內(nèi)核線程定時重新計算映射表的CRC(Cyclic Redundancy Check,循環(huán)冗余校驗)校驗值,并異步刷新至虛擬磁盤D中,減少存儲設(shè)備寫入次數(shù),提高壽命;如果映射表不是-1,則表明該數(shù)據(jù)塊已經(jīng)分配,直接將D-Base卷上的數(shù)據(jù)塊提供給用戶。
驅(qū)動程序?qū)τ脩舻膶懭氩僮鬟M(jìn)行區(qū)分,僅當(dāng)寫入未分配的數(shù)據(jù)塊時,才進(jìn)行新的數(shù)據(jù)塊分配,讀取未分配的數(shù)據(jù)塊時,直接返回全0的數(shù)據(jù)。
一般情況下,D-Base卷中至少預(yù)留Y個數(shù)據(jù)塊供邏輯卷D使用,Y為正整數(shù),且Y小于N;Y設(shè)置的越大性能越好,設(shè)置的越小越節(jié)省空間,應(yīng)根據(jù)實際情況調(diào)整;當(dāng)D-Base卷中預(yù)留的數(shù)據(jù)塊不足Y個時,在給虛擬磁盤D分配新數(shù)據(jù)塊的同時,提前通知主節(jié)點M的服務(wù)程序使用邏輯卷管理軟件給虛擬磁盤D增加容量,例如:Z個數(shù)據(jù)塊的大小。Y和Z設(shè)置太大,會導(dǎo)致空間浪費;設(shè)置太小,會導(dǎo)致分配的次數(shù)增多或者等待的時間過長。通過給Y和Z設(shè)置合理的大小,可以減少由于D-Base卷不足而導(dǎo)致等待主節(jié)點M的服務(wù)程序分配的情況,提升性能。
本領(lǐng)域的技術(shù)人員可以對本發(fā)明實施例進(jìn)行各種修改和變型,倘若這些修改和變型在本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則這些修改和變型也在本發(fā)明的保護(hù)范圍之內(nèi)。
說明書中未詳細(xì)描述的內(nèi)容為本領(lǐng)域技術(shù)人員公知的現(xiàn)有技術(shù)。