專利名稱::存儲系統(tǒng)條件指示器和方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及數(shù)字數(shù)據(jù)存儲系統(tǒng)和方法,更具體地涉及那些提供容錯存儲的系統(tǒng)和方法。
背景技術(shù):
:已知現(xiàn)有技術(shù)依照根據(jù)各種RAID(獨立磁盤冗余陣列)協(xié)議的任何一種的模式來提供冗余磁盤存儲器。使用RAID模式的典型磁盤陣列是需要由經(jīng)驗豐富的信息技術(shù)人員來管理的復雜結(jié)構(gòu)。而且在許多使用RAID模式的陣列設(shè)計中,如果所述陣列中的各磁盤驅(qū)動器是非均勻容量的,那么該設(shè)計可能不能夠使用超過該陣列中最小驅(qū)動器容量的驅(qū)動器上的任何容量。使用標準RAID系統(tǒng)的一個問題是盤面損壞可能發(fā)生在磁盤陣列中不經(jīng)常使用的區(qū)域。在另一個驅(qū)動器故障的情況下,并不總是能確定發(fā)生了損壞。在這種情況下,當所述RAID陣列重構(gòu)所述故障驅(qū)動器時,損壞的數(shù)據(jù)可能被傳播和保存。在許多存儲系統(tǒng)中,按就緒狀態(tài)(readystate)維持備用存儲設(shè)備,使得其可以在另一個存儲設(shè)備故障時被使用。這種備用存儲設(shè)備通常被稱作“熱后備”。所述熱后備在存儲設(shè)備常規(guī)操作期間并不用于存儲數(shù)據(jù)。當運行的存儲設(shè)備故障時,該故障存儲設(shè)備由該熱后備邏輯上替換,而且要移動數(shù)據(jù)或者通過其他方式在所述熱后備上再產(chǎn)生數(shù)據(jù)。當修復或者更換所述故障存儲設(shè)備時,典型地要移動數(shù)據(jù)或者通過其他方式在(重新)運行的存儲設(shè)備上重新產(chǎn)生這些數(shù)據(jù),而且使所述熱后備脫機,以準備好在另一個故障事件中使用。熱后備的維護通常是復雜的,并因此通常由經(jīng)驗豐富的管理者進行操縱。熱后備磁盤同樣代表著附加費用。
發(fā)明內(nèi)容在本發(fā)明的第一實施例中,提供一種方法和存儲系統(tǒng)條件指示器方法,其包括確定所述系統(tǒng)是否可操作以及跨所有存儲設(shè)備具有用于新存儲對象的冗余,而且如果是,指示“進行”狀態(tài),其中該狀態(tài)表示存儲提供了良好的數(shù)據(jù)安全性等級;確定系統(tǒng)是否可操作以及跨一些但非全部存儲設(shè)備具有用于新存儲對象的冗余,而且如果是,指示“為效率需要更多存儲器”狀態(tài),其中該狀態(tài)表示為了與安全性一致的有效數(shù)據(jù)存儲需要更多存儲;以及確定系統(tǒng)是否可操作以及是否僅在單個存儲設(shè)備上具有用于新存儲對象的冗余,而且如果是,指示“為安全性需要更多存儲器”狀態(tài),其中該狀態(tài)表示為了數(shù)據(jù)安全性需要更多存儲器。在相關(guān)實施例中,所述指示可以使用單個指示器實現(xiàn),例如多色燈,其中每種顏色都與不同條件相關(guān),或者使用多個指示器實現(xiàn),其中每個指示器都與不同條件相關(guān)。在另一個相關(guān)實施例中,可以確定所述系統(tǒng)是否處于從一個狀態(tài)向另一個狀態(tài)的轉(zhuǎn)換,并且如果是,則可以指示所述轉(zhuǎn)換事實??梢灾甘舅鲛D(zhuǎn)換事實,例如,通過在關(guān)閉狀態(tài)和開啟狀態(tài)之間閃光或者通過在兩種不同顏色之間閃光。在本發(fā)明的第二實施例中,提供一種指示存儲設(shè)備陣列的狀態(tài)的方法和存儲系統(tǒng)。根據(jù)可用存儲量和存儲設(shè)備陣列的冗余級別來確定存儲系統(tǒng)狀態(tài)。根據(jù)可用存儲量和所述存儲設(shè)備陣列的冗余級別確定建議是否附加存儲容量。指示所述存儲系統(tǒng)狀態(tài)包括,如果建議附加存儲容量,則指示應當用附加存儲容量填充陣列中哪個插槽。在相關(guān)的實施例中,所述陣列中的每個插槽都可以與指示器相關(guān),在這種情況下指示器可以共同用于指示包括指示陣列中哪個插槽應當用附加存儲容量來填充的所述存儲系統(tǒng)狀態(tài)??梢赃@樣來指示系統(tǒng)狀態(tài)如果所述插槽不應該用附加存儲容量填充,把與給定插槽相關(guān)的指示器設(shè)置為第一狀態(tài);如果所述系統(tǒng)跨一些而不是全部存儲設(shè)備具有用于新存儲對象的冗余并且所述插槽應當用附加存儲容量填充,將與所述插槽相關(guān)的所述指示器設(shè)置為第二狀態(tài);以及如果所述系統(tǒng)僅在單個存儲設(shè)備具有用于新存儲對象的冗余并且所述插槽應當用附加存儲容量填充,則把與所述插槽相關(guān)的指示器設(shè)置為第三狀態(tài)。每個指示器可以是多彩燈,而且每種狀態(tài)都可以與不同顏色相關(guān)。所述第一狀態(tài)可以與綠燈相關(guān),第二狀態(tài)可以與黃燈或者黃色燈相關(guān),而第三狀態(tài)可以與紅燈相關(guān)。在其他相關(guān)實施例中,可以確定所述系統(tǒng)是否處于從一種狀態(tài)向另一種狀態(tài)轉(zhuǎn)換,并且如果是,則可以指示所述轉(zhuǎn)換事實??梢酝ㄟ^例如在關(guān)閉狀態(tài)和開啟狀態(tài)之間閃光或者通過在兩種不同顏色之間閃光指示所述轉(zhuǎn)換事實。在另一個相關(guān)實施例中,所述指示器可包括用于每個插槽的前面板和用于照射所述前面板以指示所述存儲系統(tǒng)狀態(tài)的相關(guān)燈,所述存儲系統(tǒng)狀態(tài)包括用附加存儲容量填充所述陣列中的哪個插槽。通過參考下列附圖參照下列詳細說明,本發(fā)明上述特征將變得更加容易理解,其中圖1示出本發(fā)明的實施例,其中將對象分析為一系列存儲塊。圖2是說明在相同實施例中塊的容錯存儲模式如何根據(jù)附加更多存儲器而動態(tài)改變。圖3說明本發(fā)明另一實施例,在使用不同大小存儲設(shè)備構(gòu)造的存儲系統(tǒng)上按不同容錯模式的塊的存儲。圖4說明本發(fā)明的另一個實施例,其中指示器狀態(tài)用于警告無效存儲使用和低等級容錯。圖5是根據(jù)本發(fā)明實施例的所述數(shù)據(jù)存儲、檢索和再布局中使用的功能模塊框圖。圖6表示在包含兩個以上驅(qū)動器的陣列中使用鏡像的示例。圖7表示使用不同布局模式以存儲其數(shù)據(jù)的一些示例性存儲區(qū)。圖8表示用于實施后備卷(sparsevolume)的查找表。圖9表示根據(jù)本發(fā)明示例性實施例的狀態(tài)指示器,其用于具有可用存儲空間并按容錯方式操作的示例性陣列。圖10表示根據(jù)本發(fā)明示例性實施例的狀態(tài)指示器,其用于不具有足夠空間以維護冗余數(shù)據(jù)存儲并必須增加更大空間的示例性陣列。圖11表示根據(jù)本發(fā)明示例性實施例的狀態(tài)指示器,其不能夠維護故障情況下的冗余數(shù)據(jù)。圖12表示根據(jù)本發(fā)明示例性實施例的示例性陣列的狀態(tài)指示器,其中存儲沒備已經(jīng)故障。用存儲設(shè)備填充插槽B、C、和D。圖13示出的模塊層次表示示例性實施例的不同軟件層以及它們彼此如何相關(guān)。圖14表示根據(jù)本發(fā)明實施例的聚簇存取表如何用于訪問存儲區(qū)中的數(shù)據(jù)聚簇。圖15表示根據(jù)本發(fā)明實施例的日志表更新。圖16表示根據(jù)本發(fā)明實施例的驅(qū)動器布局。圖17示出了根據(jù)本發(fā)明實施例的存儲區(qū)0的布局和其他存儲區(qū)如何被參照。圖18說明了根據(jù)本發(fā)明實施例的讀差錯處理。圖19說明了根據(jù)本發(fā)明實施例的寫差錯處理。圖20是根據(jù)本發(fā)明實施例的邏輯流程圖,其說明了通過差錯管理程序的壞區(qū)域備份。圖21是根據(jù)本發(fā)明實施例的示意框圖,其表示存儲陣列的相關(guān)組件。圖22是根據(jù)本發(fā)明實施例的邏輯流程圖,其表示管理虛擬熱后備的示例性邏輯。圖23是根據(jù)本發(fā)明實施例的邏輯流程圖,其說明確定每個可能磁盤故障的再布局情況的示例性邏輯,如圖22的框2102。圖24是根據(jù)本發(fā)明實施例的邏輯流程圖,其表示調(diào)用虛擬熱后備功能的示例性邏輯。圖25是根據(jù)本發(fā)明實施例的邏輯流程圖,其表示自動再配置一個或多個剩余驅(qū)動器以恢復數(shù)據(jù)容錯的示例性邏輯,如圖24的框2306。圖26是根據(jù)本發(fā)明實施例的邏輯流程圖,其用于升級存儲設(shè)備。具體實施例如在本說明書和權(quán)利要求書中使用的,除非上下文另有要求,下面術(shù)語具有如下所解釋的意思。對象的“塊(chunk)”是對象的提取片,由所使用的物理存儲獨立地形成,且典型地是對象的固定數(shù)量的連續(xù)字節(jié)。數(shù)據(jù)存儲的容錯“模式(pattern)”是在一個或者多個存儲設(shè)備上冗余地分布數(shù)據(jù)的特定方式,并且除了其他的,可以是鏡像(mirroring,例如按類似RAID1的方式)、條帶化(striping,例如按類似RAID5的方式)、RAID6、雙奇偶校驗、對角線奇偶校驗、低密度奇偶校驗碼、渦輪式碼、或者其他冗余模式或者這些冗余模式的組合。當給定塊所產(chǎn)生的散列號通常與其他任何塊的散列號都不同時,除非當其他塊具有與該給定塊相同的數(shù)據(jù)內(nèi)容,該給定塊的散列號是“唯一的(unique)”。即,當兩個塊的內(nèi)容不相同,通常將具有不同散列號。如下們所要進一步詳細描述的,在本上下文中,術(shù)語“唯一的”用于覆蓋由那些偶爾對不同的塊產(chǎn)生相同散列號的散列函數(shù)所產(chǎn)生的散列號,因為散列函數(shù)通常不能完美地在對不同的塊產(chǎn)生不同的數(shù)?!皡^(qū)域(region)”是存儲介質(zhì)(例如硬盤驅(qū)動器)上的一組連續(xù)物理塊。“存儲區(qū)(zone)”是由兩個或以上的區(qū)域組成的。組成存儲區(qū)的各區(qū)域通常不需要連續(xù)。如下面示例性實施例所述,存儲區(qū)存儲相當于1GB的數(shù)據(jù)或者控制信息?!熬鄞?cluster)”是存儲區(qū)中的單元尺寸,并表示壓縮單位(下面論述)。如下面所述的示例性實施例所述,聚簇是4KB(即八個512字節(jié)的扇區(qū))并且實質(zhì)上等同于塊?!叭哂嗉?redundantset)”是對一組數(shù)據(jù)提供冗余的一組扇區(qū)/聚簇?!皞浞輩^(qū)域(backinguparegion)”涉及將一個區(qū)域的內(nèi)容復制到另一個區(qū)域。存儲設(shè)備的“第一對”和“第二對”可以包括公共存儲設(shè)備。存儲設(shè)備的“第一組多個”和“第二組多個”可以包括一個或者多個公共存儲設(shè)備。存儲設(shè)備的“第一布置”和“第二布置”或者“不同布置”可以包括一個或多個公共存儲設(shè)備。圖1是本發(fā)明實施例的說明,其中,將對象(object)分析成一系列用于存儲的塊(chunk),在本例中對象是文件(file)。開始,文件11被傳遞到存儲軟件,在其中被指定為對象12并被分配一個唯一對象標識號,在此是#007。在對象表13中形成新項131,用來表示這個新對象的分配?,F(xiàn)在該對象被分析成數(shù)據(jù)“塊”121、122、和123,它們是固定長度的對象段。每個塊都經(jīng)過散列算法,該算法返回塊的唯一散列號。以后這個算法可以應用于檢索塊,并且結(jié)果與原始散列相比較以確保重試塊與存儲的相同。所述每個塊的散列號按對象132的項行存儲在對象表13中,以便于以后所述完成對象可以通過所述各塊的集合進行檢索。同樣在圖1中,所述塊散列現(xiàn)在與塊表14中現(xiàn)有項進行比較。任何匹配現(xiàn)有項141的散列都已經(jīng)存儲并且因此不采取任何行動(即數(shù)據(jù)不會再次存儲,導致對象的自動壓縮)。新散列(在塊表14中沒有對應項的一個)被輸入塊表141。然后塊中的數(shù)據(jù)以最有效容錯存儲方式存儲在可用存儲設(shè)備151、152、和153上。這種方法可例如導致所述塊數(shù)據(jù)按鏡像方式存儲在包括一個或者兩個設(shè)備的存儲系統(tǒng)上,或者按奇偶校驗條帶化存儲在具有兩個以上存儲設(shè)備的系統(tǒng)。這種數(shù)據(jù)將在物理位置1511、1521、和1531存儲在存儲設(shè)備上,而且這些位置和位置編號將存儲在塊表列143和142中,使得以后可以定位和檢索塊的所有物理部分。圖2說明在相同實施例中塊的容錯存儲模式如何根據(jù)增加更多附加存儲而動態(tài)改變。特別地,圖2示出了一旦附加存儲被添加到整個系統(tǒng),塊的物理存儲如何在所述存儲設(shè)備上按新模式來布局。在圖2(a)中,所述存儲系統(tǒng)包括兩個存儲設(shè)備221和222,而塊數(shù)據(jù)在位置2211和2221被物理鏡像到所述兩個存儲設(shè)備上以提供容錯。在圖2(b)中,添加第三存儲設(shè)備223,以奇偶校驗條帶化方式存儲所述塊成為可能,這種模式較之所述鏡像模式是更有效的存儲。所述塊按新模式布局在三個物理位置2311、2321、和2331,占用更少比例的可用存儲。更新所述塊表格21以表現(xiàn)在三個位置212新布局,并且還在213記錄新的塊物理位置2311、2321、和2331。圖3示出根據(jù)本發(fā)明實施例的成熟存儲系統(tǒng),其已經(jīng)運行一段時間。該圖說明了各塊如何隨時間在存儲容量變化的存儲設(shè)備上進行物理存儲。該圖示出包括40GB的存儲設(shè)備31、80GB的存儲設(shè)備32和120GB的存儲設(shè)備33的存儲系統(tǒng)。最初,各塊按容錯條帶化模式34來存儲,直到40GB存儲設(shè)備31變滿。然后,由于缺乏存儲空間,新數(shù)據(jù)就按鏡像模式存儲到80GB32和120GB33存儲設(shè)備的可用空間上。一旦80GB存儲設(shè)備32滿了,則新數(shù)據(jù)按單個硬盤容錯模式37來布局。盡管存儲設(shè)備包括用于存儲數(shù)據(jù)的單一存儲池(pool),如按塊存儲的數(shù)據(jù)本身已經(jīng)按多種不同模式來存儲。圖4說明本發(fā)明另一實施例,其中指示器狀態(tài)用于警告低效的存儲使用和低級的容錯。在圖4A中,全部三個存儲設(shè)備41、42和43具有空閑空間,而指示燈44是綠色以表示數(shù)據(jù)以有效和容錯方式存儲。在圖4B中,40GB存儲設(shè)備41已經(jīng)變滿了,因此新數(shù)據(jù)可按鏡像模式只能存儲在具有剩余空閑空間的兩個存儲設(shè)備42和43上。為了表示數(shù)據(jù)仍然十分冗余但不能有效存儲,指示燈44變成黃色。在圖4C中,僅120GB存儲設(shè)備43具有空閑空間剩余,因此全部新數(shù)據(jù)可以按鏡像模式僅存儲在這一臺設(shè)備43上。因為容錯性不強并且系統(tǒng)臨界地缺乏空間,因此指示燈44變紅以指示需要增加更多存儲。在一個替換實施例中,為陣列中每臺驅(qū)動器/插槽提供指示器,例如,以三色燈形式(例如綠、黃、紅)。在一個特定實施例中,所述燈用于照亮具有發(fā)光效果的硬盤機柜的整個前面??刂七@些燈不僅用于指示該系統(tǒng)的整體狀態(tài),還用于指示哪個驅(qū)動器/插槽需要加以注意(若有的話)。每個三色燈都可以處于至少四種狀態(tài)分別是關(guān)閉、綠色、黃色、紅色。如果特定插槽為空且系統(tǒng)按充足存儲和冗余在運行因此不需要在插槽中安裝驅(qū)動器,則相應插槽的燈可以處于關(guān)閉狀態(tài)。如果相應驅(qū)動器充足并且不需要替換,則特定插槽的燈可以置于綠色狀態(tài)。如果系統(tǒng)運行在降級,則可以將特定插槽的燈置于黃色狀態(tài),以建議用較大驅(qū)動器替換相應驅(qū)動器。如果相應驅(qū)動器必須安裝或者替換,則特定插槽的燈可以置于紅色狀態(tài)。如果需要或者期望的話,可以指示附加狀態(tài),例如,通過在開啟狀態(tài)和關(guān)閉狀態(tài)之間閃爍燈或者在兩種不同顏色(例如在替換驅(qū)動器之后并且進行數(shù)據(jù)重新布局時在紅色和綠色之間閃爍燈)。下面說明示例性實施例的附加細節(jié)。當然,可以使用其他指示技術(shù)來指示系統(tǒng)狀態(tài)和驅(qū)動器/插槽狀態(tài)。例如,單個LCD顯示器可以用于指示系統(tǒng)狀態(tài),并且如果需要的話,可以指示需要注意的插槽號。同樣,可以使用其他類型指示器(例如,系統(tǒng)單個狀態(tài)指示器(例如綠色/黃色/紅色),還有每個插槽的插槽指示器或者燈)。圖5是根據(jù)本發(fā)明實施例的數(shù)據(jù)存儲、檢索和重新布局中使用的功能模塊框圖,如上與圖1至3相關(guān)的討論。通信的公共入口和出口點是對象界面511,用于將對象傳遞給系統(tǒng)用于存儲或者從系統(tǒng)檢索對象,框界面512,它讓存儲系統(tǒng)看來像是一個更大的存儲設(shè)備,以及CIFS接口513,它讓存儲系統(tǒng)看來像是Windows文件系統(tǒng)。當這些界面需要數(shù)據(jù)存儲時,數(shù)據(jù)被傳遞到塊分析器52,所述分析器52將數(shù)據(jù)分解為塊,并在對象表512中創(chuàng)建初始項(如上與圖1相關(guān)的討論)。這些塊被傳遞散列碼生成器53,散列碼生成器53產(chǎn)生每個塊的相關(guān)聯(lián)散列碼,并將其輸入到對象表中,這樣與每個對象相關(guān)聯(lián)的各塊被列出512。塊散列號與塊表531中的項進行比較。在發(fā)現(xiàn)匹配時,該新塊被廢棄,因為它與已經(jīng)存儲在該存儲系統(tǒng)中的某個塊相同。如果塊是新的,則在塊表531中為其建立新項,而且將散列的塊傳遞到物理存儲管理器54。該物理存儲管理器以可能的最有效模式在可用存儲設(shè)備571、572、和573上存儲該塊,并在塊表531中制作相應項以表示哪里已經(jīng)發(fā)生該塊的物理存儲,使得以后可以在512檢索該塊的內(nèi)容(如上與圖1的相關(guān)討論)。圖5中由對象界面511、框界面512或者CIFS界面513的數(shù)據(jù)檢索通過向檢索管理器56請求來執(zhí)行,檢索管理器查詢對象表521以確定哪個塊包括該對象,然后從物理存儲器54請求這些塊。所述物理存儲管理器54詢問塊表格531以確定所請求的塊存儲在哪里,然后檢索它們并將完成數(shù)據(jù)(對象)傳遞回檢索管理器56,檢索管理器56向請求界面返回該數(shù)據(jù)。圖5還包括容錯管理器(FTL)55,其不斷掃描塊表以確定塊是否以可能的最有效方式存儲。(這可能由于添加和去除存儲設(shè)備571、572、和573而改變。)如果塊不是以最有效方式存儲,則FTL將請求物理存儲管理器創(chuàng)建該塊的新布局模式并更新塊表531。這樣全部數(shù)據(jù)對構(gòu)成該陣列的若干存儲設(shè)備按可能的最有效方式來存儲(如上與圖2和3相關(guān)的討論)。下面提供本發(fā)明示例性實施例的其他細節(jié)。數(shù)據(jù)布局模式——存儲區(qū)(zone)除了其他,存儲區(qū)影響隱式冗余和存儲在盤上的實際數(shù)據(jù)的盤再布局。存儲區(qū)在不影響存儲區(qū)用戶的情況下使得可增加和改變的附加布局方法。存儲陣列在盤上按稱作存儲區(qū)的虛擬分段來布局數(shù)據(jù)。存儲區(qū)存儲給定的和固定數(shù)量的數(shù)據(jù)(例如1G字節(jié))。存儲區(qū)駐留在單個盤或者跨越一個或者多個驅(qū)動器。存儲區(qū)的物理布局以特定于該存儲區(qū)的形式提供冗余。圖6示出在包含兩個以上驅(qū)動器的陣列中使用鏡像的示例。圖7示出使用不同布局模式來存儲它們的數(shù)據(jù)的一些示例存儲區(qū)。該圖假定存儲區(qū)存儲1GB數(shù)據(jù)。注意以下幾點i)跨多個驅(qū)動器的存儲區(qū)不需要在整個集合中使用到驅(qū)動器的相同偏移。ii)單個驅(qū)動器鏡像需要2G的存儲量來存儲1G的數(shù)據(jù)。iii)雙驅(qū)動器鏡像需要2G存儲量來存儲1G的數(shù)據(jù)。iv)3驅(qū)動器條帶化需要1.5GB存儲量來存儲1G的數(shù)據(jù)。v)4驅(qū)動器條帶化需要1.33GB存儲量來存儲1G的數(shù)據(jù)。vi)存儲區(qū)A、存儲區(qū)B等是任意的存儲區(qū)名。在實際實施例中每個存儲區(qū)都用唯一編號來標識。vii)雖然通過該圖隱含,存儲區(qū)不是必須在盤上連續(xù)的(見后面所述的區(qū)域)。viii)為什么鏡像被限于(不超過)兩個驅(qū)動器沒有技術(shù)原因。例如,在三個驅(qū)動器的系統(tǒng)1中,數(shù)據(jù)的副本可存儲在1驅(qū)動器上,且半數(shù)鏡像數(shù)據(jù)可以存儲在另外兩個驅(qū)動器的每個上。同樣,數(shù)據(jù)可跨三個驅(qū)動器來鏡像,一半數(shù)據(jù)在兩個驅(qū)動器的每個上以及一半鏡像在其他兩個驅(qū)動器上。數(shù)據(jù)布局模式——區(qū)域(region)每個盤都分割為一組相等尺寸的區(qū)域。區(qū)域的尺寸比存儲區(qū)小得多,存儲區(qū)由來自一個或者多個盤的一個或者多個區(qū)域構(gòu)成。為了有效使用盤空間,區(qū)域的尺寸典型地是不同存儲區(qū)尺寸和陣列所支持的不同盤數(shù)量的公因數(shù)。在示例性實施例中,區(qū)域是存儲區(qū)數(shù)據(jù)尺寸的1/12。下面的表列出了根據(jù)本發(fā)明示例性實施例的各種布局的區(qū)域/存儲區(qū)的數(shù)量和區(qū)域/盤的數(shù)量。各區(qū)域可以標記為使用、空閑或者損壞。當創(chuàng)建存儲區(qū)時,選擇來自適當盤的一組空閑區(qū)域并登記到表中。這些區(qū)域可以是任何任意順序而且不需要在盤上連續(xù)。當從存儲區(qū)讀取或者向其寫入數(shù)據(jù)時,存取被重定向到適當區(qū)域。除了其他,這允許以靈活和有效的方式發(fā)生數(shù)據(jù)再布局。隨著時間的過去,不同尺寸的存儲區(qū)將可能發(fā)生存儲碎片化(fragmentation),使得許多盤區(qū)太小而不能保持完整存儲區(qū)。通過使用適當區(qū)域尺寸,所有存儲片所遺留的間隙都將至少是一個區(qū)域的尺寸,這些小間隙易于重用,而不必重新分段整個盤。數(shù)據(jù)布局模式——再布局為了便于實施,可以強制擴展和收縮的固定順序。例如,如果突然增加兩個驅(qū)動器,存儲區(qū)的擴展可以經(jīng)過中間擴展,就像增加一個驅(qū)動器一樣,然后執(zhí)行第二擴展以結(jié)合第二個驅(qū)動器?;蛘?,包含多個驅(qū)動器的擴展和收縮可以自動處理,不需要中間步驟。在任何再布局之前,所需空間都必須是可用的。這應當在開始再布局之前計算,以確保不會發(fā)生不必要的再布局。數(shù)據(jù)布局模式——驅(qū)動器擴展下面根據(jù)本發(fā)明示例性實施例描述從單驅(qū)動器鏡像擴展為雙驅(qū)動器鏡像的一般過程i)假定單驅(qū)動器鏡像具有數(shù)據(jù)‘A’和鏡像‘B’ii)在驅(qū)動器上分配12個區(qū)域以擴展存儲區(qū)到‘C’iii)復制鏡像‘B’到區(qū)域集‘C’iv)任何已經(jīng)復制的對數(shù)據(jù)的寫都必須鏡像到‘C’中的適當位置v)當完成復制時,使用新布局類型更新存儲區(qū)表并利用指向‘C’的指針來替換指向‘B’的指針vi)將構(gòu)成‘B’的區(qū)域標記為空閑的。下面根據(jù)本發(fā)明示例性實施例,描述從雙驅(qū)動器鏡像擴展為具有奇偶校驗的三驅(qū)動器條帶化的一般過程i)假定一個驅(qū)動器具有數(shù)據(jù)‘A’而第二驅(qū)動器具有鏡像‘B’ii)為奇偶校驗信息‘C’在第三驅(qū)動器上分配6個區(qū)域iii)使用‘A’的第一組6區(qū)域和‘B’的第二組6區(qū)域計算奇偶校驗信息iv)在‘C’中放置奇偶校驗信息v)任何已經(jīng)處理的對數(shù)據(jù)的寫都必須奇偶校驗到‘C’中適當位置vi)當復制完成時,用新布局類型點表將存儲區(qū)表更新為‘A’的前一半,‘B’和‘C’的后一半vii)標記‘A’的前一半和‘B’的前一半為空閑下面描述根據(jù)本發(fā)明示例性實施例的從三驅(qū)動器條帶化擴展為具有奇偶校驗的四驅(qū)動器條帶化的一般過程i)假定一個驅(qū)動器具有數(shù)據(jù)‘A’,第二驅(qū)動器具有數(shù)據(jù)‘B’而第三個具有奇偶校驗‘P’ii)對條帶數(shù)據(jù)‘C’在第四驅(qū)動器上分配四個區(qū)域iii)將‘A’的最后兩個區(qū)域復制到‘C’的最初兩個區(qū)域iv)將‘B’的最初兩個區(qū)域復制到‘C’的最后區(qū)域v)在奇偶校驗驅(qū)動器‘D’上分配四個區(qū)域vi)使用A、C的最初四個區(qū)域和B的最后四個區(qū)域計算奇偶校驗信息vii)在‘D’中放置奇偶校驗信息viii)任何已經(jīng)處理的對數(shù)據(jù)的寫都必須奇偶校驗到‘D’中適當位置ix)用新布局類型和點表更新存儲區(qū)表為‘A’‘C’的最初四區(qū)域、‘B’和‘D’的其次四區(qū)域x)標記‘A’的最后兩區(qū)域和‘B’的最初兩區(qū)域為空閑。數(shù)據(jù)布局模式——驅(qū)動器收縮驅(qū)動器收縮在盤去除或者故障時發(fā)生。在這種情況下,如果可能的話,陣列收縮數(shù)據(jù)使全部存儲區(qū)返回到冗余狀態(tài)。驅(qū)動器收縮比擴展稍微復雜,由于要做更多選擇。但是,在布局方法之間的轉(zhuǎn)換按照與擴展相類似的方式發(fā)生,但要反過來。保持要再生的數(shù)據(jù)量為最小以使得盡快實現(xiàn)冗余。在空間可用時,驅(qū)動器收縮通常一次處理一個存儲區(qū),直到全部存儲區(qū)被再布局。選擇如何收縮下表描述根據(jù)本發(fā)明示例性實施例的用于需要再布局的每個存儲區(qū)決策樹下面描述根據(jù)本發(fā)明示例性實施例的從雙驅(qū)動器鏡像收縮為單驅(qū)動器鏡像的一般過程i)假定單驅(qū)動器鏡像具有數(shù)據(jù)‘A’和缺失的鏡像‘B’或者反過來ii)在包含‘A’的驅(qū)動器上分配12個區(qū)域作為‘C’iii)將數(shù)據(jù)‘A’復制到區(qū)域集‘C’iv)任何已經(jīng)復制的對數(shù)據(jù)的寫都必須鏡像到‘C’中適當位置v)當復制完成時,用新布局類型更新存儲區(qū)表并用指向‘C’的指針替換指向‘B’的指針下面說明根據(jù)本發(fā)明示例性實施例的從三驅(qū)動器條帶化收縮為雙驅(qū)動器鏡像(缺失奇偶校驗)的一般過程i)假定所述條帶由不同驅(qū)動器上的數(shù)據(jù)塊‘A’、‘B’、‘C’組成。缺失奇偶校驗‘C’。ii)定義‘A’為包括該存儲區(qū)的前一半,而‘B’為該存儲區(qū)的后一半。iii)在‘A’驅(qū)動器上分配6個區(qū)域的‘D’并在‘B’驅(qū)動器上分配6個區(qū)域的‘E’。iv)將‘A’復制到‘E’。v)將‘B’復制到‘D’。vi)任何已經(jīng)復制的對數(shù)據(jù)的寫都必須鏡像到‘D’和‘E’中的適當位置vii)當復制完成時,用新布局類型更新存儲區(qū)表并將指針設(shè)置到指向‘A’/‘D’和‘E’/‘B’下面說明根據(jù)本發(fā)明示例性實施例的從三驅(qū)動器條帶化收縮為雙驅(qū)動器鏡像(缺失數(shù)據(jù))的一般過程i)假定所述帶由不同驅(qū)動器上的數(shù)據(jù)塊‘A’‘B’‘C’組成。缺失數(shù)據(jù)‘C’。ii)定義‘A’為包括該存儲區(qū)的前一半,而‘C’為該存儲區(qū)的后一半。iii)在‘A’驅(qū)動器上分配6個區(qū)域的‘D’并在‘B’驅(qū)動器上分配12個區(qū)域的‘E’。iv)將‘A’復制到‘E’的前一半。v)重構(gòu)從‘A’和‘B’缺失的數(shù)據(jù)。將數(shù)據(jù)寫入‘D’。vi)將‘D’復制到‘E’的后一半。vii)任何已經(jīng)復制的對數(shù)據(jù)的寫都必須鏡像到‘D’和‘E’中的適當位置viii)當復制完成時,用新布局類型更新存儲區(qū)表并將指針設(shè)置為指向‘A’/‘D’和‘E’ix)將‘B’區(qū)域標記為空閑。下面說明根據(jù)本發(fā)明示例性實施例的從四驅(qū)動器條帶化收縮為三驅(qū)動器條帶化(缺失奇偶校驗)的一般過程i)假定所述條帶由不同驅(qū)動器上的數(shù)據(jù)塊‘A’‘B’‘C’和‘D’組成。缺失奇偶校驗‘D’。ii)定義‘A’為包括存儲區(qū)的前三分之一,‘B’為第二個三分之一,而‘C’為第三個三分之一。iii)在‘A’驅(qū)動器上分配2個區(qū)域的‘G’,在‘C’驅(qū)動器上分配2個區(qū)域的‘E’并在‘B’驅(qū)動器上分配6個區(qū)域的‘F’。iv)將‘B’的前一半復制到‘G’。v)將‘B’的后一半復制到‘E’。vi)從‘A’/‘G’和‘E’/‘C’構(gòu)造奇偶校驗并將其寫入‘F’。vii)任何已經(jīng)復制的對數(shù)據(jù)的寫都必須鏡像到‘D’、‘E’和‘F’中的適當位置viii)當復制完成時,用新布局類型更新存儲區(qū)表并將指針設(shè)置為指向‘A’/‘G’、‘E’/‘C’和‘F’ix)將‘B’區(qū)域標記為空閑。下面說明根據(jù)本發(fā)明示例性實施例的從四驅(qū)動器條帶化收縮為三驅(qū)動器條帶化(缺失前1/3)的一般過程i)假定所述條帶由不同驅(qū)動器上的數(shù)據(jù)塊‘A’‘B’‘C’和‘D’組成。缺失數(shù)據(jù)‘A’。ii)定義‘A’為包括存儲區(qū)的前三分之一,‘B’為第二個三分之一而‘C’為第三個三分之一以及‘D’為奇偶校驗。iii)在‘B’驅(qū)動器上分配4個區(qū)域的‘E’,在‘C’驅(qū)動器上分配2個區(qū)域的‘F’并在‘D’驅(qū)動器上分配6個區(qū)域的‘G’。iv)將‘B’的后一半復制到‘F’。v)根據(jù)‘B’、‘C’和‘D’構(gòu)造缺失數(shù)據(jù)并寫入‘E’vi)根據(jù)‘E’、‘B’的前一半和‘F’/‘C’構(gòu)造新奇偶校驗并寫入‘G’vii)任何已經(jīng)復制的對數(shù)據(jù)的寫都必須鏡像到‘B’、‘E’、‘F’和‘G’中的適當位置viii)當復制完成時,用新布局類型更新存儲區(qū)表并將指針設(shè)置為指向‘E’、‘B’的前一半和‘F’/‘C’以及‘G’ix)將‘B’的后一半和‘D’區(qū)域標記為空閑。下面說明根據(jù)本發(fā)明示例性實施例的從四驅(qū)動器條帶化收縮為三驅(qū)動器條帶化(缺失第二個1/3)的一般過程i)假定所述條帶由不同驅(qū)動器上的數(shù)據(jù)塊‘A’‘B’‘C’和‘D’組成。缺失數(shù)據(jù)‘B’。ii)定義‘A’為包括存儲區(qū)的前三分之一,‘B’為第二個三分之一而‘C’為第三個三分之一以及‘D’為奇偶校驗。iii)在‘A’驅(qū)動器上分配2個區(qū)域的‘E’,在‘C’驅(qū)動器上分配2個區(qū)域的‘F’并在‘D’驅(qū)動器上分配6個區(qū)域的‘G’。iv)根據(jù)‘A’的前一半、‘C’的前一半和‘D’的前一半構(gòu)造缺失數(shù)據(jù)并寫入‘E’v)從‘A’的后一半、‘C’的后一半和‘D’的后一半構(gòu)造缺失數(shù)據(jù)并寫入‘F’vi)從‘A’/‘E’和‘F’/‘C’構(gòu)造新奇偶校驗并寫入‘G’vii)任何已經(jīng)復制的對數(shù)據(jù)的寫都必須鏡像到‘E’、‘F’和‘G’中的適當位置viii)當復制完成時,用新布局類型更新存儲區(qū)表并將指針設(shè)置為指向‘E’‘F’以及‘G’ix)將‘D’區(qū)域標記為空閑。下面說明根據(jù)本發(fā)明示例性實施例的從四驅(qū)動器條帶化收縮為三驅(qū)動器條帶化(缺失第三個1/3)的一般過程i)假定所述條帶由不同驅(qū)動器上的數(shù)據(jù)塊‘A’‘B’‘C’和‘D’組成。缺失數(shù)據(jù)‘C’。ii)定義‘A’為包括該存儲區(qū)的前三分之一,‘B’為第二個三分之一而‘C’為第三個三分之一以及‘D’為奇偶校驗。iii)在‘A’驅(qū)動器上分配2個區(qū)域的‘E’,在‘B’驅(qū)動器上分配4個區(qū)域的‘F’并在‘D’驅(qū)動器上分配6個區(qū)域的‘G’。iv)將‘B’的前一半復制到‘E’v)根據(jù)‘A’、‘B’和‘D’構(gòu)造缺失數(shù)據(jù)并寫入‘F’vi)從‘A’/‘E’和‘B’/‘F’的后一半構(gòu)造新奇偶校驗并寫入‘G’vii)任何已經(jīng)復制的對數(shù)據(jù)的寫都必須鏡像到‘E’、‘F’和‘G’中的適當位置viii)當復制完成時,用新布局類型更新存儲區(qū)表并將指針設(shè)置為指向‘A’/‘E’和‘B’/‘F’的后一半以及‘G’ix)將‘B’的前一半和‘D’區(qū)域標記為空閑。例如,再次參考圖3,如果驅(qū)動器0或者驅(qū)動器1丟失,只要在驅(qū)動器2上有足夠的可用空間,就可以在驅(qū)動器2上重構(gòu)雙驅(qū)動器鏡像(存儲區(qū)B)。類似地,如果損失任何驅(qū)動器0至2,只要驅(qū)動器3上有足夠可用空間,三驅(qū)動器鏡像(存儲區(qū)C)就可以利用驅(qū)動器3重構(gòu)。數(shù)據(jù)布局模式——存儲區(qū)重構(gòu)當已經(jīng)去除驅(qū)動器并且剩余驅(qū)動器上有足夠空間用于理想的存儲區(qū)再布局或者驅(qū)動器已經(jīng)用新的或者更大尺寸驅(qū)動器替換,會發(fā)生存儲區(qū)重構(gòu)。下面說明根據(jù)本發(fā)明示例性實施例的雙驅(qū)動器鏡像重構(gòu)的一般過程i)假定單驅(qū)動器鏡像具有數(shù)據(jù)‘A’和缺失鏡像‘B’ii)在不同于包含‘A’的驅(qū)動器的驅(qū)動器上分配12個區(qū)域的‘C’iii)將數(shù)據(jù)A’復制到‘C’iv)任何已經(jīng)復制的對數(shù)據(jù)的寫都必須鏡像到‘C’中適當位置v)當復制完成時用指向‘C’指針更新存儲區(qū)表指向‘B’的指針下面說明根據(jù)本發(fā)明示例性實施例的三驅(qū)動器條帶化重構(gòu)的一般過程i)假定一個驅(qū)動器具有數(shù)據(jù)‘A’,第二驅(qū)動器具有數(shù)據(jù)‘B’而第三個具有奇偶校驗‘P’。缺失‘B’。注意缺失哪片無關(guān)緊要,在所有情況下需要的操作都是相同的。ii)在不同于包含‘A’和‘P’的驅(qū)動器的驅(qū)動器上分配6個區(qū)域的‘D’iii)從‘A’和‘P’構(gòu)造缺失數(shù)據(jù)。向‘D’寫數(shù)據(jù)iv)任何已經(jīng)復制的對數(shù)據(jù)的寫都必須奇偶校驗到‘D’中的適當位置v)用指向‘D’的指針替換指向‘B’的指針以更新存儲區(qū)表在這個示例性實施例中,四驅(qū)動器重構(gòu)僅當如果去除的驅(qū)動器被其他驅(qū)動器替換時發(fā)生。所述重構(gòu)包括在新驅(qū)動器上分配六個區(qū)域并根據(jù)其他三個區(qū)域集合重構(gòu)缺失的數(shù)據(jù)。數(shù)據(jù)布局模式——暫時缺失驅(qū)動器問題當去除驅(qū)動器而沒有用于再布局的空間時,陣列將繼續(xù)按降級模式來運行,直到其他舊驅(qū)動器插回或者用新的替換該驅(qū)動器。如果插入新的驅(qū)動器,那么將再建驅(qū)動器組。在這種情況下,數(shù)據(jù)將再布局。如果舊的盤放回該陣列,那么其將不再是當前盤組的一部分并且將被視其為新盤。但是,如果該陣列中沒有放入新盤而是放回舊的那個,那么舊的那個將仍然被視為該盤組的一員,盡管是被廢棄的成員。在這種情況下,任何已經(jīng)再布局的存儲區(qū)都將保持其新配置而該舊盤上的區(qū)域?qū)⒖臻e。任何沒有被再布局的區(qū)域仍然指向該舊盤存儲區(qū)的適當區(qū)域。但是,由于已經(jīng)對降級存儲區(qū)執(zhí)行了某些寫,因此這些存儲區(qū)需要刷新??梢詷擞浺呀?jīng)改變的降級區(qū)域,而不是記錄每個已經(jīng)發(fā)生的寫。這樣,當替換盤時,僅已經(jīng)改變的區(qū)域需要刷新。而且,任何已經(jīng)被寫入的存儲區(qū)可被置于更高的優(yōu)先表用于再布局。這應當減少了應該替換盤的需要刷新的區(qū)域數(shù)量。還可以使用超時,在這一點之后,即使該盤被替換也將被擦去。但是,這種超時可能相當大,可能是數(shù)小時而非數(shù)分鐘。數(shù)據(jù)布局模式——數(shù)據(jù)完整性如上所述,標準RAID系統(tǒng)的一個問題是可能盤面損壞發(fā)生在盤陣列的不常使用的區(qū)域。在另一個驅(qū)動器故障的情況下,經(jīng)常不能確定損壞已經(jīng)發(fā)生。在這種情況下,當RAID陣列重建該故障驅(qū)動器時,會傳播并保存該損壞的數(shù)據(jù)。上述散列機制提供在RAID下可用的數(shù)據(jù)破壞檢測的附加機制。如在其他地方提及的,當存儲某個塊(chunk)時,為該塊計算并存儲散列值。每次讀取該塊的時候,都可以計算檢索塊的散列值并與存儲的散列值進行比較。如果該散列值不匹配(指示損壞的塊),那么塊數(shù)據(jù)可以根據(jù)冗余數(shù)據(jù)恢復。為了最小化在其中可能發(fā)生盤上數(shù)據(jù)損壞的時間窗口,將執(zhí)行盤數(shù)據(jù)常規(guī)掃描以盡快發(fā)現(xiàn)并校正損壞的數(shù)據(jù)。也可選地允許執(zhí)行對陣列讀取的檢查。數(shù)據(jù)布局模式——卷(volume)在后備卷中,不管陣列中盤上可用存儲空間量如何,總是要求陣列是固定尺寸——例如M千兆字節(jié)。假定該陣列包含實際存儲空間的S字節(jié),其中S<=M,并且可以請求的數(shù)據(jù)存儲在M千兆字節(jié)空間的位置L1、L2、L3等。如果所請求的位置Ln>S,那么用于Ln的數(shù)據(jù)必須存儲在位置Pn<S。這通過基于Ln的包括查找表的索引Pn來進行管理,如圖8所示。這種特征使得陣列與不支持卷擴展的操作系統(tǒng)共同工作,所述操作系統(tǒng)例如Windows、Linux、和蘋果操作系統(tǒng)。另外,該陣列可以提供多個都共享相同物理存儲器的后備卷。每個后備卷都將具有專用查找表,但是將共享數(shù)據(jù)存儲器的相同物理空間。驅(qū)動器插槽指示器如上所述,存儲陣列包括一個或者多個驅(qū)動器插槽。每個驅(qū)動器插槽都可以是空的或者容納硬盤驅(qū)動器。每個驅(qū)動器插槽具有能夠指示四種狀態(tài)的專用指示器,所述四種狀態(tài)是關(guān)閉、正常、降級和故障。該狀態(tài)通常解釋如下在這個示例性實施例中,紅/黃/綠發(fā)光二極管(LED)用作指示器。所述LED通常解釋如下圖9示出了根據(jù)本發(fā)明示例性實施例的具有可用存儲空間并按容錯方式運行的示例性陣列。用存儲設(shè)備填充插槽B、C和D,并且有充足存儲空間可用于冗余地存儲附加數(shù)據(jù)。插槽B、C和D的指示器是綠色(指示這些存儲設(shè)備操作正確,陣列數(shù)據(jù)冗余,且該陣列具有可用磁盤空間),而插槽A的指示器關(guān)閉(指示插槽A中不需要填充存儲設(shè)備)。圖10示出了根據(jù)本發(fā)明示例性實施例的示例性陣列,其不具有足夠空間用于維持冗余數(shù)據(jù)存儲,并且必須要增加更大空間。插槽C和D中的存儲設(shè)備是滿的。插槽B、C和D的指示器是綠色(指示這些存儲設(shè)備正確運行),而插槽A的指示器是紅色(指示該陣列沒有足夠空間用來維持冗余數(shù)據(jù)存儲以及插槽A中應當填充存儲設(shè)備)。圖11示出了根據(jù)本發(fā)明示例性實施例的在故障情況下不能維持冗余數(shù)據(jù)的示例性陣列。插槽A、B、C和D用存儲設(shè)備填充。插槽C和D中的存儲設(shè)備是滿的。插槽A、B、和C的指示器是綠色(指示它們正確運行),而插槽D的指示器是黃色(指示插槽D中的存儲設(shè)備應當用具有更大存儲容量的存儲設(shè)備來填充)。圖12示出了根據(jù)本發(fā)明示例性實施例的示例性陣列,其中的存儲設(shè)備已經(jīng)故障。用存儲設(shè)備填充插槽B、C和D。插槽C中的存儲設(shè)備故障。插槽B和D的指示器是綠色(指示它們正確運行),而插槽C的指示器是紅色(指示應當替換插槽C中的存儲設(shè)備),而插槽A的指示器關(guān)閉(指示插槽A中不需要填充存儲設(shè)備)。下面說明本發(fā)明示例性實施例的軟件設(shè)計。該軟件設(shè)計基于六個軟件層,其跨越從物理訪問該磁盤到與主機計算系統(tǒng)通行的邏輯體系結(jié)構(gòu)。在這個示例性實施例中,文件系統(tǒng)駐留在主服務器上,例如Windows、Linux、或者蘋果服務器,并訪問如USB或者iSCSI設(shè)備的存儲陣列。由主請求管理器(HRM)處理經(jīng)過主界面到達的物理盤請求。主I/O界面將主USB或者iSCSI界面的表示協(xié)調(diào)至該主機(host),以及與HRM有接口。HRM協(xié)調(diào)來自主I/O界面的數(shù)據(jù)讀/寫請求,調(diào)度讀和寫請求,并在它們完成時協(xié)調(diào)這些請求的結(jié)果返回該主機。本存儲陣列的主要目的是保證一旦系統(tǒng)接受數(shù)據(jù),其按可靠方法來存儲,使用系統(tǒng)當前存儲的最大量冗余。隨著該陣列改變物理配置,而重新組織數(shù)據(jù)以維持(以及可能最大化)冗余。另外,基于壓縮的簡單散列用于減少使用的存儲量。最基本的層包括盤驅(qū)動器,用來在不同盤上存儲數(shù)據(jù)??梢越?jīng)由各種接口連接盤,例如經(jīng)USB接口的ATA隧道。所述盤上的扇區(qū)被組織成區(qū)域、存儲區(qū)和聚簇,其中每個都具有不同邏輯角色。區(qū)域表示盤上的一組連續(xù)物理塊。在四驅(qū)動器系統(tǒng)中,每個區(qū)域是1/12GB大小,并表示冗余的最小單位。如果發(fā)現(xiàn)區(qū)域中的扇區(qū)是物理損壞的,那么將放棄整個區(qū)域。存儲區(qū)表示冗余單位。存儲區(qū)包括一組區(qū)域,可能在不同盤上用來提供適當?shù)娜哂嗔?。存儲區(qū)將提供1GB的數(shù)據(jù)容量,但是可能需要更多的區(qū)域以便于提供冗余。具有冗余的1GB需要12個區(qū)域的集合(1GB);1GB鏡像存儲區(qū)需要兩組1GB的區(qū)域(24個區(qū)域);1GB三盤條帶化存儲區(qū)將需要三組0.5GB的區(qū)域(18個區(qū)域)。不同存儲區(qū)將具有不同冗余特征。聚簇表示壓縮的基本單位,并且是存儲區(qū)之內(nèi)的單元尺寸。它們當前是4KB8×512字節(jié)扇區(qū)大小。許多盤上的聚簇會包含相同數(shù)據(jù)。聚簇存取表(CAT)用于經(jīng)由散列函數(shù)追蹤聚簇的使用。CAT在邏輯主地址和存儲區(qū)中適當聚簇位置之間轉(zhuǎn)換。當向盤寫入時,散列函數(shù)用于發(fā)現(xiàn)數(shù)據(jù)是否已經(jīng)存在于該盤上。如果是,CAT表中的適當項會被設(shè)置為指向現(xiàn)有聚簇。CAT表駐留在其自己的存儲區(qū)。如果超過該存儲區(qū)大小,會使用附加存儲區(qū),并且使用表把邏輯地址映射到該存儲區(qū)用于CAT的部分。換句話說,預分配存儲區(qū)用于包含該CAT表。為了減少主寫入等待時間并保證數(shù)據(jù)可靠性,日志管理器將記錄全部寫請求(或者寫入盤或者寫入NVRAM)。如果系統(tǒng)重啟,在重啟時要提交日志項。磁盤可以添加或者去除,或者如果發(fā)現(xiàn)區(qū)域已經(jīng)損壞則可以讓該區(qū)域退出。在任何這些情況下,布局管理器都可以在存儲區(qū)中重組區(qū)域,以改變其冗余類型,或者改變存儲區(qū)的區(qū)域構(gòu)成(如果某個區(qū)域被損壞)。由于存儲陣列提供虛擬盤陣列因此通過改變物理盤空間的級別來返回,并且由于提供分塊級別的接口,當聚簇不再被文件系統(tǒng)使用時就不是顯然的。結(jié)果,所使用的聚簇空間將繼續(xù)擴展。垃圾收集器(位于主機或者按固件形式)將分析該文件系統(tǒng)以確定哪個聚簇已經(jīng)空閑,并且從散列表中刪除它們。下表示出了根據(jù)本發(fā)明該示例性實施例的六個軟件層圖13示出了模塊層次,其表示不同軟件層和它們彼此的關(guān)系。軟件層優(yōu)選地固定以便于提供清晰的API和描述。垃圾收集器釋放不再由主文件系統(tǒng)使用的聚簇。例如,當刪除文件時,優(yōu)選地釋放用于包含該文件的聚簇。日志管理器提供某種形式的寫日志,從而在電源故障或者其他差錯條件的情況下不丟失掛起的寫操作。布局管理器提供存儲區(qū)相對于其區(qū)域的運行時再布局。這可能根據(jù)盤插入/刪除或者故障而發(fā)生。聚簇管理器在一組數(shù)據(jù)存儲區(qū)中分配聚簇。盤利用守護程序(diskutilizationdaemon)周期性檢查空閑的盤空間。加鎖表(LockTable)處理寫操作沖突問題后的讀操作。主請求管理器處理來自主機和垃圾收集器的讀/寫請求。寫操作被傳遞到日志管理器,而讀操作經(jīng)由聚簇存取表(CAT)管理層來處理。如上所述,在典型文件系統(tǒng)中,一定量的數(shù)據(jù)通常實質(zhì)上重復。為了減少盤空間利用,這種數(shù)據(jù)的多個復制不會寫入該盤。而是寫入一個實例,相同數(shù)據(jù)的其他全部實例引用(reference)這一個實例。在本示例性實施例中,任何時間系統(tǒng)在數(shù)據(jù)聚簇上操作(例如8個物理扇區(qū)),而這是散列的單位。使用SHA1算法來產(chǎn)生160位的散列值。這樣具有很多好處,包括好的唯一性,并且被許多處理器在片上支持。全部160位將存儲在散列記錄中,但是僅最低16位被用作散列表中的索引。其他匹配該最低16位的實例將經(jīng)由鏈接表鏈接。在這個示例性實施例中,僅一個讀/寫操作可以同時發(fā)生。為了性能的目的,當向磁盤寫聚簇時不允許發(fā)生散列分析。而散列分析將由散列管理器作為背景活動而發(fā)生。從日志的寫隊列讀取寫請求,并處理以完成寫操作。為了保證數(shù)據(jù)一致性,如果已經(jīng)有寫操作在該聚簇上活動,必須延遲該寫操作。在其他聚簇上的操作可以不受阻礙的進行。除非寫整個聚簇,否則寫入的數(shù)據(jù)將需要與現(xiàn)有存儲在該聚簇中的數(shù)據(jù)歸并。根據(jù)邏輯扇區(qū)地址(LSA),定位聚簇的CAT項。從這個記錄獲得散列關(guān)鍵字、存儲區(qū)和聚簇偏移信息,然后它們可用于搜索散列表以發(fā)現(xiàn)匹配。這就是聚簇。雙重散列該散列表可能是必需的;一旦經(jīng)由SHA1摘取(digest),然后就通過存儲區(qū)/聚簇偏移用于改進正確散列項的查找速度。如果已經(jīng)使用了散列記錄,引用計數(shù)被遞減。如果引用計數(shù)現(xiàn)在為零,并且沒有由散列項快照引用,該散列項和聚簇可被釋放回它們各自的空閑表?,F(xiàn)在歸并原來的聚簇數(shù)據(jù)和聚簇的更新扇區(qū),而且數(shù)據(jù)要被再散列。新的聚簇從空閑表中被剔除,把歸并數(shù)據(jù)寫入該聚簇,向散列表中增加新項,CAT表中的項更新為指向該新聚簇。作為更新散列表的結(jié)果,該項同樣添加到用于由背景任務處理的內(nèi)部隊列。這個任務將把新添加的聚簇和散列項與匹配該散列表行地址的其他散列項進行比較,如果它們重復,將結(jié)合記錄,在適當時釋放散列項和CAT表項。這保證了寫等待時間不由這個活動負擔。如果在這個處理期間發(fā)生故障(例如掉電),則可以根據(jù)丟失數(shù)據(jù)刪除各種表。各個表應當以這種方式管理,最終的提交是原子的(atomic),或者日志項可以再運行,如果它沒有全部完成的話。下面是寫邏輯的偽代碼While(stufftodo)WriteRecord=j(luò)ournalMgr.read();1sa=writeRecord.RetLsa();catEntry=catMgr.GetCATEntry(1sa);if(catMgr.writeInProgress(catEntry))delay();originalCluster=catMgr.readCluster(catEntry);originalHash=hashMgr.calcHash(originalCluster);hashRecord=hashMgr.Lookup(originalHash,zone,offset);if((hashRecord.RefCount==1)&&(hashRecord.snapshot=0))hashRecord.free();originalCluster.free();//注意這里有某種優(yōu)化,可重用該聚簇而無須釋放或重新分配它。//otherwise,stillusersofthiscluster,soupdate&leaveitalonehashRecord.RefCount--;hashRecord.Update(hashRecord);//現(xiàn)在添加新記錄mergedCluster=mergeCluster(originalCluster,newCluster);newHash=hashMgr.calcHash(mergedCluster);newCluster=clusterMgr.AllocateCluster(zone,offset);clusterMgr.write(cluster,mergedCluster);zoneMgr.write(cluster,mergedCluster);...hashMgr.addHash(newHash,newCluster,zone,offset)(internal:queuenewhashforbackgroundprocessing)catMgr.Update(1ba,zone,offset,newHash);//我們已成功完成該日志項。移至下一個。JournalMgr.next();讀請求同樣按每次一個聚簇(相對于“扇區(qū)”)來處理。讀請求不通過上述的習慣于散列的處理。而是,使用主邏輯扇區(qū)地址來引用(reference)CAT并獲得存儲區(qū)編號和聚簇到該存儲區(qū)的偏移。讀請求應當在CAT緩存中查找CAT表項,并且必須在設(shè)置了寫進行位(write-in-progressbit)時延遲。其他讀/寫可以不受阻止的進行。為了改進數(shù)據(jù)完整性檢查,當讀聚簇時,其將被散列,并且該散列值與存儲在散列記錄中的SHA1散列值進行比較。這將需要使用該散列、存儲區(qū)和聚簇偏移作為進入散列表的搜索關(guān)鍵字。分配聚簇用作盡可能少的存儲區(qū)。這是因為存儲區(qū)直接對應于盤驅(qū)動器利用率。對每個存儲區(qū)而言,硬驅(qū)動器陣列上有兩個或者更多區(qū)域。通過最小化存儲區(qū)數(shù)量,物理區(qū)域的數(shù)量最小化,并由此減少硬盤驅(qū)動器陣列上的空間消耗。聚簇管理器分配來自一組數(shù)據(jù)存儲區(qū)的聚簇。使用鏈接列表保持追蹤存儲區(qū)中的空閑聚簇。但是,空閑聚簇信息在磁盤上存儲為位圖(32KB每存儲區(qū))。該鏈接列表從位圖(bitmap)動態(tài)地構(gòu)造。最初,在存儲器中創(chuàng)建特定量空閑扇區(qū)的鏈接列表。當分配聚簇時,該列表收縮。在預定最低點,從磁盤上的位圖提取表示空閑聚簇的新鏈接列表節(jié)點。這樣,為了發(fā)現(xiàn)用于分配的空閑聚簇,不需要分析位圖。在這個示例性實施例中,散列表是64K記錄表(由散列的低16位索引)并且具有下列格式全零的聚簇可以相當常見,因此全零的情況可以視作特殊情況,例如,使得永遠不被刪除(因此覆蓋計數(shù)將不是問題)。當多個散列具有相同最低有效散列時,或者當兩個散列項指向不同數(shù)據(jù)聚簇時,使用空閑散列記錄的鏈接列表。在兩種情況下,空閑散列記錄都將從該列表中取出,并經(jīng)由pNextHash指針鏈接。散列管理器將整理全部添加到散列表中的項并將合并該盤上的相同聚簇。隨著新的散列記錄增加到該散列表中,消息將被傳遞到散列管理器。這可由散列管理器自動執(zhí)行。作為背景活動,散列管理器即將處理其隊列上的項。將比較全部散列值以發(fā)現(xiàn)其是否匹配任何現(xiàn)有散列記錄。如果是,將同樣比較完整聚簇數(shù)據(jù)。如果聚簇匹配,則新散列記錄可以被廢除回空閑隊列,散列記錄計數(shù)遞增,并且重復的聚簇將被返回聚簇空閑隊列。當合并記錄時,散列管理器必須注意向前傳播快照位。聚簇存取表(CAT)包含間接指針。該指針指向存儲區(qū)中的數(shù)據(jù)聚簇(0是第一數(shù)據(jù)聚簇)。一個CAT項引用單個數(shù)據(jù)聚簇(暫定4KB大小)。使用CAT(連同散列)使得當存在大量重復的數(shù)據(jù)時減少盤使用需求。單個CAT通常表示連續(xù)存儲塊。CAT包含在非數(shù)據(jù)存儲區(qū)中。每個CAT項是48位。下表示出每個項如何布局(假定每個數(shù)據(jù)存儲區(qū)包含1GB數(shù)據(jù))希望CAT適合64位,但這不是必需的。2TB陣列的CAT表當前是至4GB大小。每個CAT項指向包含該數(shù)據(jù)和存儲區(qū)編號的存儲區(qū)。圖14顯示CAT如何用于存取存儲區(qū)中的數(shù)據(jù)聚簇。冗余數(shù)據(jù)通過CAT中的一個以上的項來引用。兩個邏輯聚簇包含相同數(shù)據(jù),因此它們的CAT項指向相同物理聚簇。散列關(guān)鍵字包含完整聚簇160位SHA1散列值的16位摘取。這個項用于在寫操作期間更新該散列表。CAT中的每個項有足夠的位用于引用16TB的數(shù)據(jù)。但是,如果每個數(shù)據(jù)聚簇都彼此不同(根據(jù)內(nèi)容),那么只需要3個存儲區(qū)的CAT項來引用2TB的數(shù)據(jù)(每個存儲區(qū)都是1GB大小,并由此可以存儲1GB/大小的CAT項。假定6字節(jié)CAT項,則178956970項/存儲區(qū),即表引用大約682GB/存儲區(qū),如果每個聚簇是4K的話)。主邏輯扇區(qū)轉(zhuǎn)換表用于將主邏輯扇區(qū)地址轉(zhuǎn)換成存儲區(qū)編號。相應于主邏輯扇區(qū)地址的CAT部分將駐留在這個存儲區(qū)中。注意每個CAT項表示4096字節(jié)的扇區(qū)大小。這是八個512字節(jié)扇區(qū)。下面顯示主邏輯扇區(qū)轉(zhuǎn)換表的表示可以預分配存儲區(qū)以保持整個CAT。換句話說,存儲區(qū)可以分配給CAT,如需要更多CAT項。由于CAT把2TB虛擬磁盤映射至主扇區(qū)地址空間,因此由主機做硬盤分區(qū)或者格式化期間將引用CAT的很大部分。為此,要預分配存儲區(qū)。CAT是大的1GB/存儲區(qū)表。使用的工作聚簇集將是來自這個大表的后備集。為了性能的原因,活動的項(可能暫時)可以在處理器存儲器中緩存而不總是從磁盤讀取。至少有兩個選項用于填充該緩存——來自CAT的個別項,或者來自CAT的整個聚簇。因為寫進行(write-in-progress)與CAT緩存表相組合,所以需要確保該緩存中保持全部未完成的寫。因此,需要該緩存至少與未完成寫請求的最大數(shù)量一樣大。緩存中的項數(shù)將是聚簇大小(即4K)。需要知道聚簇上的操作中是否還有寫入進行。這個指示可以作為標志存儲在該聚簇的緩存項中。下表顯示CAT緩存項的格式緩存項中的寫進行標志有兩種含義。首先,它指出寫操作正在進行,并且在這個聚簇上的任何讀(或者附加寫)必須延遲,直到完成該寫操作。其次,當設(shè)置該位時,絕不能刷新緩存中的這個項。這部分地保護了該位的狀態(tài),同時反映了這個聚簇當前被使用的事實。另外,這意味著緩存的尺寸必須至少與未完成的寫操作數(shù)量一樣大。在聚簇的緩存項中存儲寫進行指示符的一個優(yōu)點是它反映了操作正在進行的事實,省去了使用其他表格,并且省去了另外的基于散列的查找,或用于檢查該位的表查找。該緩存可以是寫延遲緩存。只需要當寫操作完成時,將緩存項寫回磁盤,雖然將其更早寫回可能更好。散列函數(shù)或者其他機制可用于增加可散列的未完成的寫項。一種替換方法是緩存整個CAT聚簇(即各項的4K項)。這通常有助于性能,如果有好的訪問空間定位的話。需要注意,因為CAT項是48位寬,因此緩存中沒有全部的項。下表顯示聚簇CAT緩存項的示例該表格尺寸可以是4096+96(4192字節(jié))。假定需要具有250項的緩存大小,該緩沖可以占據(jù)大約1MB。通過邏輯CAT項地址的適當屏蔽可以計算首項和末項是否未完成。緩存查找例程應當在加載項之前執(zhí)行這個過程并且應當加載需要的CAT聚簇。當主機發(fā)送扇區(qū)(或者聚簇)讀請求時,其通過邏輯扇區(qū)地址發(fā)送。該邏輯扇區(qū)地址用作到CAT的偏移以獲得包含主機所請求的實際數(shù)據(jù)的存儲區(qū)中的聚簇的偏移。結(jié)果是存儲區(qū)編號和到該存儲區(qū)的偏移。該信息傳遞給層2軟件,然后其從(多個)驅(qū)動器提取原始(多個)聚簇。為了處理主機從未寫過的聚簇,所有CAT項被初始化為指向包含全零的“默認”聚簇。日志管理器是兩級寫(bi-levelwrite)日志系統(tǒng)。該系統(tǒng)的一個目標是保證可以從主機接收寫請求并快速向該主機返回指示,數(shù)據(jù)已經(jīng)在保證其完整性的同時被接收。另外,該系統(tǒng)需要保證在任何盤寫入期間的系統(tǒng)復位的情況下,不會有塊級數(shù)據(jù)或者系統(tǒng)元數(shù)據(jù)(例如CAT和散列表項)的損壞合丟失。J1日志管理器盡快緩存所有從主機向磁盤的寫請求。一旦寫入成功完成(即數(shù)據(jù)已經(jīng)被陣列接收),主機就可以發(fā)信號指示操作已經(jīng)完成。日志項允許當從故障恢復時,恢復寫請求。日志記錄包括要寫入磁盤的數(shù)據(jù),以及與寫事務相關(guān)的元數(shù)據(jù)。為了減少磁盤讀/寫,與寫入相關(guān)的數(shù)據(jù)將被寫入空閑聚簇。這樣將自動鏡像該數(shù)據(jù)。將從空閑聚簇列表去除空閑聚簇。一旦寫數(shù)據(jù),空閑聚簇就必須寫回磁盤。日志記錄將被寫回非鏡像存儲區(qū)上的日志隊列。每個記錄都將是扇區(qū)大小,并且對齊到扇區(qū)邊界,以使得減少日志寫期間的故障會破壞以前日志項的風險。日志項在記錄的末尾包含唯一的、遞增的順序計數(shù),因此可以輕易識別隊列的結(jié)尾。日志寫操作在主機隊列處理線程中同步發(fā)生。日志寫必須按照它們寫入磁盤的次序來排序,因此在任何時候只有一個線程可以寫入該日志。J1表中日志項的地址可以用作唯一標識符,因此J1日志項可以與J2日志中的項相關(guān)聯(lián)。一旦寫入日志項,將向主完成隊列傳遞事務完成通知?,F(xiàn)在可以執(zhí)行寫操作。要保證在完成日志寫之前延遲任何后續(xù)的對該聚簇的讀,這一點很重要。下表示出了J2日志記錄的格式每個日志記錄都對齊到扇區(qū)邊界。日志記錄可以包含存儲區(qū)/偏移/大小的元組的陣列。圖15示出了根據(jù)本發(fā)明示例性實施例的日志表更新。尤其是當接收到主機寫請求時,更新該日志表,分配一個或多個聚簇,并向(多個)聚簇寫入數(shù)據(jù)。處理主日志請求。這引起聚簇被寫入,并同樣引起更新元數(shù)據(jù)結(jié)構(gòu),所述結(jié)構(gòu)必須投影回磁盤(例如CAT表)。重要的是保證這些元數(shù)據(jù)結(jié)構(gòu)正確地寫回磁盤,即使當系統(tǒng)發(fā)生復位。為此將使用低級磁盤I/O寫(J2)日志。為了處理主界面日志項,應當確定元數(shù)據(jù)結(jié)構(gòu)的適當?shù)牟僮?。改變應當發(fā)生在存儲器并且要產(chǎn)生對各磁盤塊改變的記錄。這種記錄包含在磁盤上應該進行的實際改變。更新的每種數(shù)據(jù)結(jié)構(gòu)都用J2日志管理器來登記。這種記錄應當記錄到基于磁盤的日志,并用標識符來加印戳。當記錄與J1日志項相連接,標識符就應當被鏈接。一旦存儲該記錄,就可以進行磁盤的改變(或者可以經(jīng)由后臺任務執(zhí)行)。邏輯上J2日志存在于層3。它用于把那些涉及經(jīng)存儲區(qū)管理器的寫的元數(shù)據(jù)更新登記到日志。當發(fā)生日志項的再現(xiàn)時,將使用存儲區(qū)管理器方法。日志本身可以存儲在專門區(qū)域。由于日志項的短生命期,不對其做鏡像。不是所有的元數(shù)據(jù)更新都需要經(jīng)過J2日志,尤其是,如果對結(jié)構(gòu)的更新是原子的。區(qū)域管理器結(jié)構(gòu)可不使用J2日志??蓹z測區(qū)域管理器位圖中的不一致,例如,使用完整性檢測后臺線程。用于J2日志的一種簡單方法是包含單個記錄。一旦該記錄提交給磁盤,就被重放,更新磁盤上的結(jié)構(gòu)??删哂卸鄠€J2記錄,并使后臺任務提交磁盤上的更新記錄。這種情況下,需要密切注意日志和與各種數(shù)據(jù)結(jié)構(gòu)相關(guān)的任何緩存算法之間的交互作用。一旦提交給磁盤,初始方法就將運行日志項。原則上,會有J2的多個并發(fā)的用戶,但是J2日志會在一個時候鎖定到一個用戶。即使在這種情況下,一旦提交,也會提交日志項。重要的是保證在任何更高級的日志活動發(fā)生前修復元數(shù)據(jù)結(jié)構(gòu)。在系統(tǒng)重新引導時,分析J2日志,并將重現(xiàn)任何記錄。如果日志項與J1日志項相關(guān),則將J1日志項標記為已完成,并可以被刪除。一旦完成全部J2日志項,元數(shù)據(jù)就處于可靠狀態(tài),并且可以處理任何剩余J1日志項。J2日志記錄包括下列信息·操作號·每個操作包含οJ1記錄指示符ο待寫入存儲區(qū)/數(shù)據(jù)偏移ο待寫入數(shù)據(jù)ο數(shù)據(jù)大小ο到數(shù)據(jù)聚簇的偏移·日志記錄標識符·結(jié)束標記這種模式可以按類似于J1日志的模式來操作,例如,使用順序號用于識別J2日志項的結(jié)尾并將J2日志項置于扇區(qū)邊界處。如果設(shè)置J1數(shù)據(jù)指針指示符,那么這個特殊操作會指向J1日志記錄。主機提供的寫數(shù)據(jù)不必復制到日志項。操作陣列將可以定義為固定大小,因日志記錄中操作的最大數(shù)量是已知的。為了允許從低級寫操作期間的扇區(qū)損壞(例如由于掉電)恢復,J2日志可以存儲被寫入的整個扇區(qū),使得如果需要該扇區(qū)可以根據(jù)這個信息來重寫。作為替換或附加,為每個改變的扇區(qū)計算的CRC可以存儲在J2記錄中,并與從磁盤扇區(qū)(例如由存儲區(qū)管理器)計算的CRC進行比較,以確定是否需要寫操作的重放。不同日志可以存儲在不同位置,因此提供接口層用于寫日志記錄到備份存儲。該位置應當是非易失的。兩種候選是硬盤和NVRAM。如果J1日志存儲到硬盤,它將存儲在J1日志非鏡像存儲區(qū)中。J1日志是存儲在NVRAM的候選。J2日志應當存儲在磁盤上,盡管它可以存儲在專門區(qū)域中(即,不冗余,因為它具有短生命期)。將J2日志存儲在磁盤的優(yōu)點是,如果在內(nèi)部數(shù)據(jù)結(jié)構(gòu)更新期間存在系統(tǒng)復位,那么該數(shù)據(jù)結(jié)構(gòu)可以返回到一致狀態(tài)(即使該單元長時期掉電)。存儲區(qū)管理器(ZM)分配更高級軟件需要的存儲區(qū)。向ZM的請求包括a.分配存儲區(qū)b.解除分配/釋放存儲區(qū)c.控制數(shù)據(jù)讀/寫傳遞到L1(?)d.讀/寫存儲區(qū)中的聚簇(給出聚簇偏移和存儲區(qū)號)ZM管理器管理冗余機制(隨驅(qū)動器的數(shù)量和它們的相關(guān)大小而改變)并處理鏡像、條帶化、以及用于數(shù)據(jù)讀/寫的其他冗余模式。當ZM需要分配存儲區(qū)時,它將請求兩個或者更多區(qū)域集合的分配。例如,要為1GB的數(shù)據(jù)分配存儲區(qū),組成這個存儲區(qū)的區(qū)域?qū)⒖梢园?GB數(shù)據(jù),包括冗余數(shù)據(jù)。對鏡像機制,存儲區(qū)將由各為1GB的兩個區(qū)域集合構(gòu)成。另一個示例,3盤條帶化機制使用各為1/2GB的3組區(qū)域。ZM使用ZR轉(zhuǎn)換表(6)以發(fā)現(xiàn)組成該存儲區(qū)的每組區(qū)域的位置(驅(qū)動器號和起始區(qū)域號)。假定是1/12GB區(qū)域大小,將需要最多24個區(qū)域。24個區(qū)域組成2×1GB的存儲區(qū)。因此ZR轉(zhuǎn)換表包含24列,用于提供驅(qū)動器/區(qū)域數(shù)據(jù)。ZM通常工作如下a.在SDM的情況下(單個驅(qū)動器鏡像),使用24列。驅(qū)動器號在所有列中都相同。每個項對應于組成該存儲區(qū)的物理驅(qū)動器上的一個物理區(qū)域。前12個項指向包含該數(shù)據(jù)的一個副本的區(qū)域。后12個項指向包含該數(shù)據(jù)的第二個副本的區(qū)域。b.DDM(雙驅(qū)動器鏡像)的情況與SDM的情況相同,只是前12個項的驅(qū)動器號與后12個項中的驅(qū)動器號不同。c.在條帶化的情況下,可以使用三個或者更多列。例如,如果跨三個驅(qū)動器使用條帶化,則需要來自三個不同驅(qū)動器的六個區(qū)域(即使用18個項),前6項包含相同驅(qū)動器號,接下來的6項包含另一個驅(qū)動器號,以及隨后的6項包含第三驅(qū)動器號,未使用的項置為0。下表顯示存儲區(qū)區(qū)域轉(zhuǎn)換表的表示法當讀/寫請求到達時,對ZM提供存儲區(qū)號和到該存儲區(qū)的偏移。ZM查看ZR轉(zhuǎn)換表中用于解決該存儲區(qū)的冗余機制,并使用該偏移用于計算哪個驅(qū)動器/區(qū)域包含必須讀/寫的扇區(qū)。然后該驅(qū)動器/區(qū)域信息提供給L1層以進行實際的讀/寫。在“使用(usage)”列中的另外可能項是“空閑”。“空閑”指存儲區(qū)被定義但當前沒有使用。聚簇管理器分配并再分配數(shù)據(jù)存儲區(qū)集合中的聚簇。布局管理器提供存儲區(qū)關(guān)于其區(qū)域的的運行時再布局。這可根據(jù)磁盤插入/除去或者故障而發(fā)生。層1(L1)軟件知道物理驅(qū)動器和物理扇區(qū)。除了其他,L1軟件分配物理驅(qū)動器的區(qū)域用于存儲區(qū)管理器來使用。在這個示例性實施例中,每個區(qū)域具有用于四驅(qū)動器陣列系統(tǒng)的1/12GB大小(即174762扇區(qū))。具有更大數(shù)量驅(qū)動器(8,12或16)的系統(tǒng)將具有不同的區(qū)域大小。為了創(chuàng)建包含具有SD3(在三驅(qū)動器上條帶化;兩個數(shù)據(jù)加奇偶校驗)的1GB數(shù)據(jù)存儲區(qū),我們應當使用各在三驅(qū)動器中的六個區(qū)域(每個驅(qū)動器為6×1/12=GB)。當存儲區(qū)被移動或者重配置時,例如根據(jù)鏡像到條帶化,使用這種區(qū)域模式允許我們提供更好的磁盤空間利用。L1軟件利用區(qū)域位圖(bitmap)跟蹤物理驅(qū)動器上的可用空間。每個驅(qū)動器都有一個位圖。每個區(qū)域都用位圖中的兩位表示,用于跟蹤該區(qū)域是否空閑、使用、或者損壞。當L2軟件(ZM)需要創(chuàng)建存儲區(qū)時,它從L1層獲得一組區(qū)域。構(gòu)成存儲區(qū)的區(qū)域不必在磁盤中連續(xù)。向L1的請求包括a.數(shù)據(jù)讀/寫(到一組區(qū)域中的聚簇)b.控制數(shù)據(jù)讀/寫(表格、數(shù)據(jù)結(jié)構(gòu)、DIC等)c.分配區(qū)域的物理空間(1驅(qū)動器內(nèi)的實際物理扇區(qū))d.解除分配區(qū)域e.向物理驅(qū)動器的物理聚簇的原始讀/寫(rawread/write)f.從一個區(qū)域向另一個復制數(shù)據(jù)g.將區(qū)域標記為損壞??臻e區(qū)域位圖可以是大型的,因此查找空閑項(最糟的情況是沒有空閑的項)的搜索可能緩慢。為了改進性能,部分位圖可以預加載到內(nèi)存中,而且空閑區(qū)域的鏈接列表可以存儲在內(nèi)存中。每個活動存儲區(qū)都有列表。如果到達列表上的低水位線,可以從磁盤讀取更多的空閑項作為背景活動。磁盤管理器運行在層0。如下表所示,有兩個子層,分別是抽象層和與物理存儲陣列通信的設(shè)備驅(qū)動器。設(shè)備驅(qū)動器層同樣可以包含多個層。例如,對使用USB驅(qū)動器的存儲陣列,在USB輸送層頂端有ATA或者SCSI棧。抽象層提供獨立于存儲陣列中使用的驅(qū)動器種類的基本讀/寫功能??墒褂靡粋€或者多個磁盤存取隊列來對盤存取請求進行排隊。在我們的系統(tǒng)中,盤存取速度將是一個關(guān)鍵的性能瓶頸。我們想要保證磁盤接口盡可能在所有時間保持忙碌,從而減少一般的系統(tǒng)延遲并改進性能。請求盤的接口應當具有異步接口,使用回調(diào)(callback)處理器用于當已經(jīng)結(jié)束盤操作時來完成操作。一個盤請求的完成將自動啟動隊列中的下一個請求。每個驅(qū)動器有一個隊列,或者全部驅(qū)動器用一個隊列。層1將按邏輯驅(qū)動器號來引用驅(qū)動器。層0將邏輯驅(qū)動器編號轉(zhuǎn)換為物理驅(qū)動器參考(例如/dev/sda或作為open()調(diào)用的結(jié)果文件設(shè)備號)。為靈活起見(經(jīng)USB擴展),應當每個邏輯驅(qū)動器一個隊列。下面是對象定義和數(shù)據(jù)流的一些示例。MSG對象從主機引入LbaLengthLUNDataREPLY對象引出到主機StatusHostLengthData數(shù)據(jù)讀數(shù)據(jù)讀流程rc=lockm.islocked(MSG)rc=catm.read(MSG,REPLY)status=zonem.read(zone,offset,length,buffer)regionm.read(logical_disk,region_number,region_offset,length,buffer)diskm.read((logical_disk,offset,length,buffer)數(shù)據(jù)寫數(shù)據(jù)寫流程diskutildaemon.spaceavailable()journalm.write(MSG)lockm.lock(msg)zonem.write(journal_zone,offset,length,buffer)regionm.write-日志項diskm.writeregionm.write-結(jié)束標記diskm.writecatm.write(MSG)catm.readcluster(1ba,offset,length,buffer)-如果需要向聚簇歸并扇區(qū)-歸并“if(1ba已經(jīng)分配)”catm.readhashkey(1ba)hashm.lookup(hashkey,zone,offset)“if(refcount=1)”hashentry.getrefcount()hashm.remove(hashentry)hashm.add(shal,zone,offset)zonem.write(zone,offset,length,buffer)-寫數(shù)據(jù)“else”hashentry.removeref()clusterm.allocate(zone.offset)-分配新聚簇zonem.createzone(zone)regionm.unusedregions(logical_disk)regionm.allocate(logical_disk,number_regions,region_list)zonem.write(...)-寫數(shù)據(jù)hashm.adds(...)-向散列表增加新項“endif’hashdaemon.add(1ba,sha1)-增加到散列新進程Qcatm.writehashkey(1ba,hashkey)-向CAT復制新散列關(guān)鍵字“else”catm.update(1ba,zone,offset,hashkey)-用新項更新CAT“endif’journalm.complete(MSG)lockm.unlock(MSG)-更新r/w指針下面是物理盤布局的說明。如上所述,每個盤都劃分為固定尺寸的區(qū)域。在這個示例性實施例中,每個區(qū)域具有用于四驅(qū)動器陣列系統(tǒng)的1/12GB大小(即174763扇區(qū))。具有更大數(shù)量驅(qū)動器(8,12或16)的系統(tǒng)將具有不同的區(qū)域大小。開始,保留區(qū)域號0和1用于區(qū)域管理器并且不用于分配。區(qū)域號1是區(qū)域號0的鏡像。對給定的硬盤,區(qū)域管理器所使用的所有內(nèi)部數(shù)據(jù)都存儲在這個硬盤的區(qū)域號0和1中。這個信息并不重復(或鏡像)到其他驅(qū)動器。如果區(qū)域0或1中有錯誤,可以分配其他區(qū)域來保留該數(shù)據(jù)。盤信息結(jié)構(gòu)指針指向這些區(qū)域。每個盤將包含識別該盤的DIS、它所屬于的盤組和該盤的布局信息。該硬盤上的第一扇區(qū)被保留。DIS存儲在第一扇區(qū)后的第一非損壞聚簇中。DIS包含相當1KB的數(shù)據(jù)。有兩個DIS的副本。DIS的副本將存儲在其所屬于的盤上。另外,該系統(tǒng)中的每個盤都將包含該系統(tǒng)中盤的全部DIS副本。下表顯示DIS格式區(qū)域管理器在區(qū)域信息結(jié)構(gòu)中存儲其內(nèi)部數(shù)據(jù)。下表顯示該區(qū)域信息結(jié)構(gòu)格式存儲區(qū)信息結(jié)構(gòu)提供可以發(fā)現(xiàn)存儲區(qū)表的存儲區(qū)管理器上的信息。下面顯示該存儲區(qū)信息結(jié)構(gòu)格式高級信息存儲區(qū)包含存儲區(qū)表和其他由高級管理者使用的表。這將使用鏡像進行保護。下表顯示該存儲區(qū)表節(jié)點格式下面描述存儲區(qū)信息布局。存儲區(qū)表節(jié)點的鏈接列表以如下方式放置在ZIS后這種信息存儲在存儲區(qū)表區(qū)域中。圖16示出了根據(jù)本發(fā)明示例性實施例的驅(qū)動器布局。前兩個區(qū)域是互為副本。第三(可選)存儲區(qū)表區(qū)域包含該存儲區(qū)表。在具有一個以上驅(qū)動器的系統(tǒng)中,只有兩個驅(qū)動器包含ZTR。在僅具有一個驅(qū)動器的系統(tǒng)中,兩個區(qū)域用于保留該ZTR的兩個(鏡像)副本。DIS包含有關(guān)RIS和ZIS位置的信息。注意RIS的第一副本不必在區(qū)域0中(例如,如果區(qū)域0包含壞扇區(qū),則可以位于不同區(qū)域)。存儲區(qū)管理器需要在系統(tǒng)啟動時加載該存儲區(qū)表。為此,其從DIS提取區(qū)域號和偏移。這將指向ZIS的開頭。特定模塊(例如CAT管理器)在存儲區(qū)中存儲它們的控制結(jié)構(gòu)和數(shù)據(jù)表。層3和更高層中的模塊的所有控制結(jié)構(gòu)由存儲在存儲區(qū)0中的結(jié)構(gòu)來引用。這意味著,例如,實際CAT(聚簇分配表)位置由存儲區(qū)0中存儲的數(shù)據(jù)結(jié)構(gòu)來引用。下表顯示存儲區(qū)0信息表格式CAT鏈接列表是描述包含CAT的存儲區(qū)的節(jié)點鏈接列表。下表顯示CAT連接列表節(jié)點格式散列表鏈接列表是描述保持散列表的存儲區(qū)的節(jié)點的鏈接列表。下表顯示該散列表鏈接列表節(jié)點格式圖17示例存儲區(qū)0的布局以及其他存儲區(qū)如何被引用,根據(jù)本發(fā)明示例性實施例。如上所述,冗余集是為數(shù)據(jù)集提供冗余的一組扇區(qū)/聚簇。備份某個區(qū)域包括將一個區(qū)域的內(nèi)容復制到另一個區(qū)域。在數(shù)據(jù)讀取出錯的情況下,較低級軟件(盤管理器或者設(shè)備驅(qū)動器)在最初失敗嘗試之后再做兩次讀請求的嘗試。故障狀態(tài)傳遞回存儲區(qū)管理器。存儲區(qū)管理器接著嘗試根據(jù)盤陣列中冗余聚簇來重構(gòu)所請求(通過讀)數(shù)據(jù)。該冗余數(shù)據(jù)可以是鏡像的聚簇(用于SDM、DDM)或者一組包括奇偶校驗的聚簇(條帶化實施)。接著重構(gòu)數(shù)據(jù)傳遞回主機。如果ZM不能重構(gòu)該數(shù)據(jù),則將讀報錯傳遞回主機。存儲區(qū)管理器發(fā)送差錯通知分組給差錯管理器。圖18示例根據(jù)本發(fā)明示例性實施例的讀報錯處理。在數(shù)據(jù)寫出錯的情況下,較低級軟件(盤管理器或者設(shè)備驅(qū)動器)在最初失敗嘗試之后再兩次嘗試寫請求。故障狀態(tài)傳遞回存儲區(qū)管理器。存儲區(qū)管理器發(fā)送報錯通知分組給差錯管理器。當數(shù)據(jù)寫在這個級別執(zhí)行時,冗余信息同樣寫入磁盤。這樣,只要僅一個聚簇具有寫差錯,后續(xù)的讀可以重構(gòu)該數(shù)據(jù)。如果有多個盤差錯并且冗余信息不能讀或者寫,則有至少兩種可能途徑a.向主機返回寫差錯狀態(tài)。把與該冗余集相關(guān)聯(lián)的所有區(qū)域備份至新分配的不包含壞扇區(qū)的區(qū)域。b.延遲寫。把與該冗余集相關(guān)聯(lián)的所有區(qū)域備份至新分配的不包含壞扇區(qū)的區(qū)域。隨后,在新分配區(qū)域中的適當聚簇上寫(連同全部冗余部分,例如奇偶校驗等)。單獨的寫隊列將用于包含已經(jīng)被延遲的寫。因為寫狀態(tài)可能已經(jīng)發(fā)送到主機作為日志成功寫入的結(jié)果,所以方法(a)是有問題的,因此主機不可能知道已經(jīng)有差錯。一種替換的是報告讀的故障,但是允許寫。CAT中的某個位用于跟蹤應當返回壞的讀的特別LBA。圖19示例根據(jù)本發(fā)明示例性實施例寫差錯處理。差錯管理器(EM)檢查聚簇以發(fā)現(xiàn)其是否真的損壞。如果是,則認為整個區(qū)域損壞。該區(qū)域中的內(nèi)容復制到相同盤的新分配區(qū)域上。然后標記當前區(qū)域損壞。當在區(qū)域上復制時,當遇到壞扇區(qū)時,差錯管理器將在必要時重構(gòu)數(shù)據(jù)。如20是示例根據(jù)本發(fā)明示例性實施例由差錯管理器備份壞區(qū)域的邏輯流程圖。如果有數(shù)據(jù)讀差錯且差錯管理器不能重構(gòu)給定聚簇的數(shù)據(jù)(例如,由于在整個冗余集的讀差錯),那么接著使用零代替不能重構(gòu)的數(shù)據(jù)。在這種情況下,將同樣必須備份其他包含壞扇區(qū)的區(qū)域(來自相同冗余集)。再次將使用零代替不能重構(gòu)的數(shù)據(jù)。一旦執(zhí)行了冗余集復制,EM禁用對應于存儲區(qū)這部分的聚簇的存取。然后更新存儲區(qū)表以指向新分配區(qū)域。隨后存取再啟用的聚簇。這個示例性實施例設(shè)計支持八個快照(其允許使用一個字節(jié)指示特定快照實例是否使用散列/聚簇項)。有兩個表涉及快照1.需要存在每個快照的CAT表,以捕獲邏輯扇區(qū)地址與包含用于LSA的數(shù)據(jù)的盤上的聚簇之間的關(guān)系。最終,每快照CAT必須是在快照發(fā)生時CAT的副本。2.系統(tǒng)散列表,其在散列值和數(shù)據(jù)聚簇之間映射。散列函數(shù)返回相同結(jié)果,無論使用哪個快照實例,并且對全部快照結(jié)果都是一樣的。這樣,這個表必須理解唯一聚簇是否由任何快照使用。散列聚簇項不能被釋放,或者被新數(shù)據(jù)替換,除非沒有使用該散列項的快照??偸怯挟斍昂捅惶砑拥目煺?。當散列項創(chuàng)建或者更新時,我們將需要把當前快照號應用到散列項。當制作快照時,將遞增當前快照號。通過查找散列表并且發(fā)現(xiàn)任何具有退出快照位設(shè)置的散列值并清空該位,由此來釋放不再被任何快照需要的聚簇/散列項。如果該快照字節(jié)現(xiàn)在是零,則散列項可以從該表中刪除,并且可以釋放該聚簇。為了預防與添加到散列樹的任何新項的沖突(因為新快照數(shù)與退出快照數(shù)相同),僅允許批準7個快照,退出最后的(第八個)快照??梢园幢尘盎顒觼聿檎疑⒘斜?。為了創(chuàng)建快照,無論主CAT何時更新都可以寫入第二CAT存儲區(qū)。這種更新可以被排隊,并且影子CAT可以按其他任務來更新。為了快照,影子CAT成為快照CAT。一旦進行快照,可以離開后臺處理以將這個快照表復制到新存儲區(qū)成為新快照CAT??梢允褂藐犃校沟貌惶幚碛白覥AT隊列,直到CAT復制完成。如果在更新影子CAT之前發(fā)生故障(隊列中的項可能丟失的情況),則在陣列聯(lián)機之前可以根據(jù)最初CAT表執(zhí)行再投影。另外,當需要快照時,“增量”的集合加上最初CAT副本可以組成快照。然后后臺任務可根據(jù)這些信息重建完整快照CAT。這會需要一點或者不需要停機時間來做此快照。其間,可能要為后續(xù)的快照收集另一組“增量”。如上所述,所謂“垃圾收集器”可用于釋放不再被主機文件系統(tǒng)使用的聚簇(例如當刪除文件時)。一般而言,通過發(fā)現(xiàn)空閑塊、計算它們的主LSA、并根據(jù)該LSA分配它們的CAT項進行垃圾收集。如果沒有CAT項用于特定LSA,則該聚簇已經(jīng)空閑。但是如果CAT項被定位,則遞增引用計數(shù),而且如果該計數(shù)命中零,該聚簇空閑。垃圾收集的一個問題是難于將已經(jīng)由主文件系統(tǒng)使用的塊與先前已經(jīng)使用并且在某個點標記為空閑的一個區(qū)分開來。當主文件系統(tǒng)寫入塊時,存儲設(shè)備分配聚簇用于數(shù)據(jù),以及CAT項來描述它。從這點上,聚簇將一般的表現(xiàn)為在用(inuse),即使主文件系統(tǒng)隨后停止使用它的塊(即,聚簇將仍然通過有效CAT的項處于在用狀態(tài))。例如,特定主文件系統(tǒng)使用位圖(bitmap)來追蹤它的使用盤塊。一開始,位圖將指示全部的塊為空閑,例如,通過將全部位清空。由于使用文件系統(tǒng),因此主文件系統(tǒng)將通過使用它的空閑塊位圖來分配塊。存儲系統(tǒng)將使用通過上述的分配聚簇和CAT項來把這些文件系統(tǒng)分配與物理存儲相關(guān)聯(lián)。當主文件系統(tǒng)把一些塊釋放回到它的空閑池時,其只需要在其空閑塊位圖中清空相應的位。在存儲系統(tǒng)上,這可以設(shè)想成寫入恰好包含該主機的空閑塊位圖的聚簇,就像沒有I/O到空閑的實際聚簇本身(雖然可能有到空閑聚簇的I/O,例如,如果主文件系統(tǒng)以某種增強安全模式運行,其中不像把零或者隨機數(shù)據(jù)的強保密散列寫入聚簇以使得減少舊聚簇內(nèi)容可能被攻擊者讀取的機會)。另外,當滿意新分配請求時,不保證主文件系統(tǒng)會重用以前被釋放的塊。因此,如果主文件系統(tǒng)繼續(xù)分配那些從存儲系統(tǒng)的視點來看是新的、即以前未使用的塊,則該存儲系統(tǒng)將快速耗盡空閑聚簇,限于無論什么空間都可以經(jīng)由壓縮回收。例如,假定文件系統(tǒng)塊是4K,如果主機分配文件系統(tǒng)塊100至500,隨后釋放塊300至500,然后接著分配塊1000至1100,整個文件系統(tǒng)使用的將是300塊,而陣列將有500個聚簇處于在用狀態(tài)。在本發(fā)明示例性實施例中,存儲系統(tǒng)可以通過訪問主文件系統(tǒng)布局來檢測主文件系統(tǒng)盤資源的釋放,分析它的空閑塊位圖,并使用該信息來識別不再被該文件系統(tǒng)使用的聚簇。為了存儲系統(tǒng)能夠以這種方式識別未使用的聚簇,存儲系統(tǒng)必須能夠定位并理解該文件系統(tǒng)的空閑塊位圖。因而,該存儲系統(tǒng)將通常支持文件系統(tǒng)的預定設(shè)置,可充分“理解”內(nèi)部工作以定位并利用這些空閑塊位圖。對不支持的文件系統(tǒng),該存儲系統(tǒng)可能不能夠執(zhí)行垃圾收集并將由此僅告之該陣列的實際物理尺寸以便于避免被過量使用。為了確定該文件系統(tǒng)類型(例如NTFS、FAT、ReiserFS、ext3),需要定位該文件系統(tǒng)的超塊(superblock,或者等同結(jié)構(gòu))。為了發(fā)現(xiàn)該超塊,要分析分區(qū)表(partitiontable)以定位OS分區(qū)。假定OS分區(qū)被定位,則分析OS分區(qū),以試圖定位該超塊并由此識別該文件系統(tǒng)類型。一旦該文件系統(tǒng)類型已知,則可以分析布局以查找空閑塊位圖。為了便于搜索空閑塊,可以保持主文件系統(tǒng)位圖的歷史數(shù)據(jù),例如,通過制作可以存儲在私有、非冗余存儲區(qū)的空閑塊位圖的副本,并執(zhí)行使用該副本的搜索。給定位圖的尺寸,可以每次為較少數(shù)量的聚簇保持信息而不是為整個位圖保持信息。當執(zhí)行垃圾收集時,可以把當前空閑塊位圖與歷史副本逐個聚簇地進行比較。可以識別任何從分配轉(zhuǎn)換成空閑的位圖項,使得回收操作可準確地定向到作為可利用的良好候選的聚簇。隨著處理每個位圖聚簇,可以用當前副本替換歷史數(shù)據(jù)以維持位圖操作的滾動式歷史數(shù)據(jù)??臻e塊位圖的副本將隨著時間變成時間上不連貫的聚簇的拼湊體,但是由于當前副本總是用于定位空閑項,因此這并不產(chǎn)生任何問題。在特定條件下,會有關(guān)于空閑塊位圖的競爭條件,例如,如果主文件系統(tǒng)使用其空閑塊位圖來分配盤塊,接著寫入它的數(shù)據(jù)塊,然后將修變的位圖刷新回到盤。在這種情況下,垃圾收集器會釋放該聚簇,即使該文件系統(tǒng)在使用該聚簇。這會導致文件系統(tǒng)被破壞??蓪崿F(xiàn)存儲系統(tǒng)以避免或者處理這樣的條件。由于垃圾收集是相當昂貴的操作,因即是低強度的回收也將占用后端的I/O帶寬,因此不應濫用垃圾收集。垃圾收集器能夠按多種方式運行,從低強度的后臺惰性回收到非常高強度或者甚高優(yōu)先級的回收。例如,當使用了百分之三十的空間時,可以按低強度方式運行垃圾收集器,或者至少沒星期一次,當使用了50%的空間時,按稍微高強度的方式來運行,而當使用了百分之九十或者更多的磁盤空間時,運行全高優(yōu)先級的回收。在每次進行收集時,可以限制要回收的目標聚簇數(shù)量和最大的可容許I/O計數(shù),從而控制垃圾收集器的回收強度。例如,可配置垃圾收集器,通過使用不超過10000次的I/O來回收1GB?;厥照埱蟮耐瓿墒】捎米鲗κ占鞯姆答?,從而在下一次運行時按更高強度的方式。還可以是“回收一切”模式,允許垃圾收集器分析整個主文件系統(tǒng)空閑塊位圖并回收可能的全部塊。在陣列(幾乎)完全裝滿時,這可以作為最后的辦法來回收聚簇。可以周期性地運行垃圾收集器,對其施加規(guī)則,并可決定執(zhí)行、或者可決定不執(zhí)行回收操作。還能夠明確地從其他模塊來請求回收操作,例如區(qū)域管理器,當正在尋找用于構(gòu)建區(qū)域的聚簇時,可請求回收操作。垃圾收集功能可以與狀態(tài)指示符機制相結(jié)合。例如,在某些點,存儲系統(tǒng)可以處于“紅色”條件,盡管正在運行的垃圾收集操作可以釋放足夠空間以消除“紅色”條件??刹捎酶郊又甘酒鳡顟B(tài)以顯示相關(guān)狀態(tài)信息(例如紅色指示器燈光可以閃爍用來指示垃圾收集操作正在進行)。圖21是根據(jù)本發(fā)明示例性實施例的存儲陣列的相關(guān)部件的示意性框圖。除了其他,存儲陣列包括底盤2502,在其上存儲管理器2504與多個存儲設(shè)備25081-2508N通信,這些存儲設(shè)備分別通過多個插槽25061-2506N耦合到底盤。每個插槽25061-2506N都可以與一個或者多個指示器25071-2507N相關(guān)聯(lián)。除了其他,存儲管理器2504典型包括用于實施上述功能的各種硬件和軟件組件。硬件組件典型包括存儲器用于存儲諸如程序代碼、數(shù)據(jù)結(jié)構(gòu)、以及數(shù)據(jù)的內(nèi)存,和用于執(zhí)行該程序代碼的微處理器系統(tǒng)。虛擬熱后備(virtualhotspare)如上所述,在許多存儲系統(tǒng)中,熱后備存儲設(shè)備維持就緒狀態(tài),使得在其他存儲設(shè)備故障的情況下,熱后備可以快速被聯(lián)機。在本發(fā)明特定實施例中,不是維持物理上分離的熱后備,而是跨多個存儲設(shè)備由未使用的存儲容量來創(chuàng)建虛擬熱后備。不同于物理熱后備,如果以及當對于根據(jù)(多個)其余存儲設(shè)備恢復的數(shù)據(jù)的存儲發(fā)生存儲設(shè)備故障時,這種未使用存儲容量是可用的。該虛擬熱后備特征需要陣列上的足夠可用空間,以保證在盤故障情況下,數(shù)據(jù)可以按冗余方式再布局。因而,根據(jù)運行,存儲系統(tǒng)典型地確定實現(xiàn)虛擬熱后備可能需要的未使用存儲容量的量(例如,根據(jù)存儲設(shè)備的數(shù)量、各存儲設(shè)備的容量、數(shù)據(jù)存儲的數(shù)量、以及以什么方式存儲數(shù)據(jù)),并且,如果需要附加存儲容量用于虛擬熱后備的話則產(chǎn)生信號(例如,使用綠色/黃色/紅色光指示狀態(tài)和插槽,如上所述)。隨著存儲區(qū)的分配,按每個盤保持記錄,多少個區(qū)域需要再布局該存儲區(qū)。下表示例使用四個驅(qū)動器的虛擬熱后備下表示例具有使用三個驅(qū)動器的虛擬熱后備在這個示例性實施例中,虛擬熱后備并非在僅有1個或者2個驅(qū)動器的陣列上可用。根據(jù)每個存儲區(qū)的信息和陣列中盤的數(shù)量,該陣列確定每個可能盤故障的再布局情況并保證對每種情況每個驅(qū)動器上都有足夠的可用空間。產(chǎn)生的信息可以反饋回再布局引擎和存儲區(qū)管理器,使得數(shù)據(jù)可以在數(shù)據(jù)存儲和熱后備特征之間正確平衡。注意,根據(jù)這些由存儲區(qū)布局數(shù)據(jù)的計算,熱后備特征需要足夠備用工作空間區(qū)域,使得可發(fā)生再布局。圖22是示出根據(jù)本發(fā)明示例性實施例的管理虛擬熱后備的示例性邏輯的邏輯流程圖???102中,該邏輯確定每個可能盤故障的再布局情形。在框2104中,該邏輯確定最壞情況下冗余數(shù)據(jù)再布局的每個驅(qū)動器需要的空間量。框2106中,該邏輯確定在最壞情況下數(shù)據(jù)冗余再布局需要的后備工作空間區(qū)域的數(shù)量???108中,該邏輯確定每個驅(qū)動器上需要的空間總量,以允許在最壞情況下再布局數(shù)據(jù)冗余(實際上是再布局所需要的空間和備用工作空間區(qū)域的和)???110中,該邏輯確定存儲系統(tǒng)是否包含足夠的可用的存儲量。如果有足夠數(shù)量的可用存儲(框2112中的是),則該邏輯迭代在框2199終止。但是,如果沒有足夠量的可用存儲(框2112中的否),則該邏輯在框2114中確定哪個驅(qū)動器/插槽需要更新。接著在框2116,該邏輯發(fā)出信號,指出需要附加存儲空間并指示哪個驅(qū)動器/插槽需要更新。該邏輯迭代在框2199終止。圖23是示出根據(jù)本發(fā)明示例性實施例的用于確定每個可能盤故障的布局情形的示例性邏輯的邏輯流程圖,如圖22的框2102中。框2202中,該邏輯分配存儲區(qū)。然后,在框2204中,該邏輯確定按每個盤需要多少個存儲區(qū)用于再布局存儲區(qū)。該邏輯迭代在框2299終止。圖24是示出根據(jù)本發(fā)明示例性實施例的包括虛擬熱后備功能的示例性邏輯的邏輯流程圖???302中,該邏輯維持在最壞情況下的充足數(shù)量的可用存儲以使得可再布局數(shù)據(jù)冗余。當在框2304確定了驅(qū)動器喪失(例如移除或者故障),該邏輯在框2306自動重構(gòu)一個或者多個其余驅(qū)動器,以恢復數(shù)據(jù)的容錯。該邏輯迭代在框2399終止。圖25是示出根據(jù)本發(fā)明示例性實施例的自動重構(gòu)一個或者多個其余設(shè)備用于恢復數(shù)據(jù)容錯的示例邏輯的邏輯流程圖,如圖24的框2306???402中,該邏輯將跨四個或者更多存儲設(shè)備的第一條帶化模式轉(zhuǎn)換為跨三個或者更多剩余存儲設(shè)備的第二條帶化模式???404中,該邏輯可以將跨三個存儲設(shè)備的條帶化模式轉(zhuǎn)換為跨兩個剩余存儲設(shè)備的鏡像模式。當然,該邏輯可以按其他方式轉(zhuǎn)換以使得隨著驅(qū)動器的喪失而再布局數(shù)據(jù)冗余。該邏輯迭代在框2499終止。再參考圖21,存儲管理器2504典型地包括適當部件和邏輯用于實施如上所述的虛擬熱后備功能。動態(tài)升級上述用于處理存儲的動態(tài)擴展和收縮的邏輯可以被擴充用于提供可動態(tài)升級的存儲設(shè)備,其中,存儲設(shè)備可根據(jù)需要用更大的存儲設(shè)備來替換,并且現(xiàn)有數(shù)據(jù)跨各存儲設(shè)備重新配置,使得冗余得到維持或者增強,并且該更大的存儲設(shè)備所提供的附加存儲空間將包括在跨多個存儲空間的可用存儲空間的池(pool)中。因而,當用較大存儲設(shè)備替換較小存儲設(shè)備時,附加存儲空間可用于改進已存儲數(shù)據(jù)和存儲附加數(shù)據(jù)的冗余。無論何時需要更多存儲空間,向用戶提供適當信號(例如使用如上所述的綠色/黃色/紅色燈光),而用戶可以簡單移除存儲設(shè)備并用更大存儲設(shè)備替換它。圖26是示出根據(jù)本發(fā)明示例性實施例的用于更新存儲設(shè)備的邏輯流程圖???602中,該邏輯在第一存儲設(shè)備上按照存儲在其中的數(shù)據(jù)在其他存儲設(shè)備上冗余出現(xiàn)的方式來存儲數(shù)據(jù)???604中,該邏輯檢測用比第一存儲設(shè)備具有更大存儲容量的替換設(shè)備來替換第一存儲設(shè)備的替換???606中,該邏輯使用冗余存儲在其他設(shè)備上的數(shù)據(jù)將存儲在第一設(shè)備的數(shù)據(jù)自動再生到的該替換設(shè)備上。框2608中,該邏輯使替換設(shè)備上的附加存儲空間可用于存儲新數(shù)據(jù)冗余???610中,該邏輯可以在替換設(shè)備上的附加存儲空間中存儲新數(shù)據(jù)冗余,如果沒有其他設(shè)備具有充足的可用存儲容量用于提供新數(shù)據(jù)的冗余的話。框2612中,如果至少一個其他設(shè)備具有充足的可用存儲空間用于提供新數(shù)據(jù)冗余,則該邏輯跨多個存儲設(shè)備存儲新數(shù)據(jù)冗余。再參考圖21,存儲管理器2504典型包括適當部件和邏輯用于實施如上所述的動態(tài)更新功能。其他本發(fā)明的實施例可以用于向主機計算機提供存儲容量,例如按美國臨時申請第60/625,495所述的方式使用外圍連接協(xié)議,所述申請以GeoffreyS.Barrall的名義于2004年11月5日提交,通過引用全文結(jié)合于此以供參考。應當注意,散列算法可能不產(chǎn)生嚴格唯一的散列值。因而,可以想到散列算法對具有不相同內(nèi)容的兩個數(shù)據(jù)塊產(chǎn)生相同散列值。散列函數(shù)(其通常結(jié)合散列算法)典型包括確認唯一性的機制。例如,在上述本發(fā)明的示例性實施例中,如果一個塊的散列值與另外塊的散列值不同,則認為這些塊的內(nèi)容不相同。但是如果一個塊的散列值與另一個塊的散列值相同,那么散列函數(shù)可以比較這兩個塊的內(nèi)容或者利用一些其他機制(例如不同散列函數(shù))以確定內(nèi)容是否相同。應當注意,這里使用的該邏輯流程圖用于示例本發(fā)明的各個方面,而不應解釋為將本發(fā)明限制在任何特殊邏輯流程或者邏輯工具。在不改變總體結(jié)果的前提下,或者不以另外的方式背離本發(fā)明范圍的情況下,所述邏輯可劃分為不同的邏輯塊(例如程序、模塊、函數(shù)、或者子程序)。通常,可以增加、改變、省略邏輯部件,可以按不同順序執(zhí)行,或者使用不同邏輯結(jié)構(gòu)來實施(例如邏輯門、循環(huán)元語、條件邏輯、和其他邏輯機構(gòu)),而不改變整體結(jié)果或者以其他方式脫離本發(fā)明的真實范圍。本發(fā)明可以按多種不同形式來實施,包括但不限于使用處理器(例如微處理器、微控制器、數(shù)字信號處理器、或者通用計算機)的計算機程序邏輯、使用可編程邏輯設(shè)備(例如現(xiàn)場可編程門陣列(FPGA)或者其他PLD)的可編程邏輯、離散組件、集成電路(例如特定用途集成電路(ASIC))、或者包括其任意組合的其他裝置。實施全部或者部分這里前述功能的計算機編程邏輯可以按多種形式實施,包括但不限于源代碼形式、計算機可執(zhí)行形式、各種中間形式(例如由匯編程序、編譯程序、連接程序、或者定位程序等產(chǎn)生的形式)。源代碼可以包括按任何各種編程語言實現(xiàn)的計算機程序指令序列(例如對象代碼、匯編語言、或者例如Fortran、C、C++、JAVA、或HTML等高級語言),在各種操作系統(tǒng)或者操作環(huán)境下使用。源代碼可以定義并使用各種數(shù)據(jù)結(jié)構(gòu)和通信消息。源代碼可以是計算機可執(zhí)行形式(例如經(jīng)由解釋程序)、或者源代碼可以轉(zhuǎn)換(例如經(jīng)由轉(zhuǎn)換器、匯編器、或者編譯器)為計算機可執(zhí)行形式。所述計算機程序可以持久地或者暫時地按任何形式(例如源代碼形式、計算機可執(zhí)行形式、或者中間形式)固定在有形存儲介質(zhì)中,例如半導體存儲裝置(例如RAM、ROM、PROM、EEPROM、或者可編程閃存RAM)、磁存儲設(shè)備(例如軟盤或者硬盤)、光存儲設(shè)備(例如CD-ROM)、PC卡(例如PCMCIA卡)、或者其他存儲器設(shè)備。該計算機程序可以按任何形式固定在信號中,該信號傳輸給使用各種通信技術(shù)的計算機,包括但不限于模擬技術(shù)、數(shù)字技術(shù)、光技術(shù)、無線技術(shù)(例如藍牙)、網(wǎng)絡(luò)技術(shù)、以及互聯(lián)網(wǎng)技術(shù)。該計算機程序可以按任何形式來發(fā)布,如使用附帶有打印的文檔或者電子文檔的可移動存儲介質(zhì)(例如壓縮包軟件)、預裝入計算機系統(tǒng)(例如在系統(tǒng)ROM或者硬盤上)、或者通過通信系統(tǒng)(例如因特網(wǎng)或者萬維網(wǎng))從服務器或者電子公告板來發(fā)布。實施全部或者部分這里的上述功能的硬件邏輯(包括用于可編程邏輯設(shè)備的可編程邏輯)可以使用傳統(tǒng)人工方法設(shè)計,或者可以使用各種工具來設(shè)計、捕獲、模擬、或者建立電子文檔,例如計算機輔助設(shè)計(CAD)、硬件描述語言(例如VHEL或者AHDL)、或者PLD編程語言(例如PALASM、ABEL、或者CUPL)。所述可編程邏輯可以永久或者暫時固定在有形存儲介質(zhì)中,例如半導體存儲設(shè)備(例如RAM、ROM、PROM、EEPROM、或者可編程閃存RAM)、磁存儲設(shè)備(例如軟盤或者硬盤)、光存儲設(shè)備(例如CD-ROM)、或者其他存儲器設(shè)備。該可編程邏輯可以按任何形式固定在信號中,該信號傳輸給使用各種通信技術(shù)的計算機,包括但不限于模擬技術(shù)、數(shù)字技術(shù)、光技術(shù)、無線技術(shù)(例如藍牙)、網(wǎng)絡(luò)技術(shù)、以及互聯(lián)網(wǎng)技術(shù))。該可編程邏輯可以按任何形式來發(fā)布,如使用帶有打印文檔或者電子文檔的可移動存儲介質(zhì)(例如壓縮包軟件)、預裝入計算機系統(tǒng)(例如在系統(tǒng)ROM或者硬盤上)、或者通過通信系統(tǒng)(例如因特網(wǎng)或者萬維網(wǎng))從服務器或者電子公告板發(fā)布。本發(fā)明涉及下列美國專利申請,通過引用全文并入此處代理卷號2950103、名稱為DynamicallyExpandableandContractibleFault-TolerantStorageSystemPermittingVariouslySizedStorageDevicesandMethod;代理卷號2950104、名稱為DynamicallyUpgradeableFault-TolerantStorageSystemPermittingVariouslySizedStorageDevicesandMethod;andAttorneyDocketNo.2950/105entitledDynamicallyExpandable;代理卷號2950105、名稱為DynamicallyExpandableandContractibleFault-TolerantStorageSystemWithVirtualHotSpare。在不脫離本發(fā)明真實范圍下,本發(fā)明可以實施為其他特殊形式。所述實施例在所有方面都應當認為作為說明而不是限制。權(quán)利要求1.一種存儲系統(tǒng)條件指示器方法,該方法包括確定系統(tǒng)是否可操作以及是否跨全部存儲設(shè)備具有用于新存儲對象的冗余,如果是,指示“進行”狀態(tài),其中該狀態(tài)表示存儲提供了良好數(shù)據(jù)安全性等級;確定系統(tǒng)是否可操作以及是否跨部分但不是全部存儲設(shè)備具有用于新存儲對象的冗余,如果是,指示“為了效率需要更多存儲”狀態(tài),其中該狀態(tài)表示為了與安全性相一致的有效數(shù)據(jù)存儲需要更多的存儲;以及確定系統(tǒng)是否可操作以及是否僅在單個存儲設(shè)備具有用于新存儲對象的冗余,如果是,指示“為了安全需要更多存儲”狀態(tài),其中該狀態(tài)表示為了數(shù)據(jù)安全性需要更多存儲。2.如權(quán)利要求1所述的存儲系統(tǒng)條件指示器方法,其中所述指示使用單個指示器完成。3.如權(quán)利要求2所述的存儲系統(tǒng)條件指示器方法,其中單個指示器包括多色光,而且其中每種顏色與不同條件相關(guān)聯(lián)。4.如權(quán)利要求1所述的存儲系統(tǒng)條件指示器方法,還包括確定系統(tǒng)是否從一個狀態(tài)向另一個狀態(tài)轉(zhuǎn)換,并且如果是,就指示該轉(zhuǎn)換事實。5.如權(quán)利要求4所述的存儲系統(tǒng)條件指示器方法,其中指示該轉(zhuǎn)換事實包括在關(guān)閉狀態(tài)和運行狀態(tài)之間閃光。6.如權(quán)利要求4所述的存儲系統(tǒng)條件指示器方法,其中指示該轉(zhuǎn)換事實包括在兩種不同顏色之間閃光。7.如權(quán)利要求1所述的存儲系統(tǒng)條件指示器方法,其中使用多個指示器完成所述指示,其中每個指示器與不同條件相關(guān)聯(lián)。8.一種存儲系統(tǒng)條件指示器方法,該方法可用于提供存儲設(shè)備陣列的系統(tǒng),該方法包括根據(jù)可用存儲量和存儲設(shè)備陣列中的冗余等級確定存儲系統(tǒng)條件;根據(jù)可用存儲量和存儲設(shè)備陣列中的冗余等級確定是否建議附加存儲容量;以及指示存儲系統(tǒng)條件,該存儲系統(tǒng)條件包括,如果建議附加存儲容量,應當用附加存儲容量填充該陣列中的哪個插槽。9.如權(quán)利要求8所述的方法,其中所述陣列中的每個插槽都與指示器相關(guān)聯(lián),并且其中各指示器共同用于指示所述存儲系統(tǒng)條件,該存儲系統(tǒng)條件包括指示應當用附加存儲容量填充該陣列中哪個插槽。10.如權(quán)利要求9所述的方法,其中指示存儲系統(tǒng)條件包括如果所述插槽不應當用附加存儲容量填充,把與給定插槽相關(guān)聯(lián)的指示器設(shè)置成第一狀態(tài);如果該系統(tǒng)跨一些但不是全部存儲設(shè)備具有用于新存儲對象的冗余并且所述插槽應當用附加存儲容量填充,把與所述插槽相關(guān)的指示器設(shè)置成第二狀態(tài);以及如果該系統(tǒng)僅在單個存儲設(shè)備具有用于新存儲對象的冗余并且所述插槽應當用附加存儲容量填充,把與所述插槽相關(guān)的指示器設(shè)置成第三狀態(tài)。11.如權(quán)利要求10所述的方法,其中每個指示器都是多色燈,并且其中每個條件與不同顏色相關(guān)聯(lián)。12.如權(quán)利要求11所述的方法,其中多色燈是三色燈,其中第一狀態(tài)是綠色;第二狀態(tài)是黃色;以及第三狀態(tài)是紅色;13.如權(quán)利要求8所述的方法,還包括確定該系統(tǒng)是否從一種條件向另一種條件轉(zhuǎn)換,并且如果是,就指示該轉(zhuǎn)換事實。14.如權(quán)利要求13所述的方法,其中指示該轉(zhuǎn)換事實包括在關(guān)閉狀態(tài)和運行狀態(tài)之間閃光。15.如權(quán)利要求13所述的方法,其中指示該轉(zhuǎn)換事實包括在兩種不同顏色之間閃光。16.如權(quán)利要求8所述方法,其中指示器包括用于每個插槽的前面板和用于照射所述前面板以指示所述存儲系統(tǒng)條件的相關(guān)的燈,所述存儲系統(tǒng)條件包括指示應該用附加存儲容量填充所述陣列中的哪個插槽。17.一種存儲系統(tǒng),包括多個存儲設(shè)備插槽,用于安裝各種存儲容量的存儲設(shè)備;至少一個條件指示器,用于提供存儲系統(tǒng)條件信息;以及存儲管理器,可操作地耦合到多個存儲設(shè)備插槽和至少一個條件指示器,用于管理通過這些存儲設(shè)備插槽耦合的一組存儲設(shè)備,所述存儲管理器用于確定該系統(tǒng)是否可操作以及是否跨全部存儲設(shè)備具有用于新存儲對象的冗余,如果是,指示“進行”狀態(tài),其中該狀態(tài)表示存儲提供了良好數(shù)據(jù)安全性等級;確定該系統(tǒng)是否可操作以及是否跨部分但不是全部存儲設(shè)備具有用于新存儲對象的冗余,如果是,指示“為了效率需要更多存儲”狀態(tài),其中該狀態(tài)表示為了與安全性相一致的有效數(shù)據(jù)存儲需要更多存儲;以及確定該系統(tǒng)是否可操作以及是否僅在單個存儲設(shè)備具有用于新存儲對象的冗余,如果是,指示“為了安全性需要更多存儲”狀態(tài),其中該狀態(tài)表示為了數(shù)據(jù)安全性需要更多存儲。18.如權(quán)利要求17所述的存儲系統(tǒng),其中所述指示使用單個指示器完成。19.如權(quán)利要求18所述的存儲系統(tǒng),其中單個指示器包括多色光,而且其中每種顏色與不同條件相關(guān)聯(lián)。20.如權(quán)利要求17所述的存儲系統(tǒng),其中存儲管理器還確定該系統(tǒng)是否從一種狀態(tài)向另一種狀態(tài)轉(zhuǎn)換,并且如果是,就指示該轉(zhuǎn)換事實。21.如權(quán)利要求20所述的存儲系統(tǒng),其中存儲管理器通過在關(guān)閉狀態(tài)和運行狀態(tài)之間閃光來指示該轉(zhuǎn)換事實。22.如權(quán)利要求20所述的存儲系統(tǒng),其中存儲管理器通過在兩種不同顏色之間閃光來指示該轉(zhuǎn)換狀態(tài)事實。23.如權(quán)利要求17所述的存儲系統(tǒng),其中使用多個指示器完成所述指示,其中每個指示器與不同條件相關(guān)聯(lián)。24.一種存儲系統(tǒng),包括多個存儲設(shè)備插槽,用于安裝各種存儲容量的存儲設(shè)備;至少一個條件指示器,用于提供存儲系統(tǒng)條件信息;以及存儲管理器,可操作地耦合到多個存儲設(shè)備插槽和至少一個條件指示器,用于管理通過這些存儲設(shè)備插槽耦合的一組存儲設(shè)備,所述存儲管理器根據(jù)可用存儲量和該組存儲設(shè)備的冗余等級來確定存儲系統(tǒng)條件,并由此確定是否建議附加存儲容量,該存儲管理器經(jīng)由至少一個條件指示器指示所述存儲系統(tǒng)條件,該存儲系統(tǒng)條件包括,如果建議附加存儲容量,則應當使用附加存儲容量填充陣列中的哪個插槽。25.如權(quán)利要求24所述的存儲系統(tǒng),其中每個插槽都與指示器相關(guān)聯(lián),并且其中指示器用于共同指示所述存儲系統(tǒng)條件,該存儲系統(tǒng)條件包括指示應當用附加存儲容量填充哪個插槽。26.如權(quán)利要求25所述的存儲系統(tǒng),其中如果所述插槽不應當用附加存儲容量填充,該存儲管理器把與給定插槽相關(guān)的指示器設(shè)置成第一狀態(tài);如果該系統(tǒng)跨一些但不是全部存儲設(shè)備具有用于新存儲對象的冗余并且所述插槽應當用附加存儲容量填充,該存儲管理器把與所述插槽相關(guān)的指示器設(shè)置成第二狀態(tài);以及如果該系統(tǒng)僅在單個存儲設(shè)備具有用于新存儲對象的冗余并且所述插槽應當用附加存儲容量填充,該存儲管理器把與所述插槽相關(guān)的指示器設(shè)置成第三狀態(tài)。27.如權(quán)利要求26所述的存儲系統(tǒng),其中每個指示器都是多色燈,并且其中每個條件與不同顏色相關(guān)聯(lián)。28.如權(quán)利要求27所述的存儲系統(tǒng),其中多色燈是三色燈,并且其中第一狀態(tài)是綠色;第二狀態(tài)是黃色;以及第三狀態(tài)是紅色;29.如權(quán)利要求24所述的存儲系統(tǒng),其中該存儲管理器確定系統(tǒng)是否從一個狀態(tài)向另一個狀態(tài)轉(zhuǎn)換,并且如果是,就指示該轉(zhuǎn)換事實。30.如權(quán)利要求29所述的存儲系統(tǒng),其中該存儲管理器通過在關(guān)閉狀態(tài)和運行狀態(tài)之間閃光來指示該轉(zhuǎn)換事實。31.如權(quán)利要求29所述的存儲系統(tǒng),其中該存儲管理器通過在兩種不同顏色之間閃光來指示該轉(zhuǎn)換事實。32.如權(quán)利要求25所述的存儲系統(tǒng),其中指示器包括用于每個插槽的前面板和用于照射所述前面板以指示所述存儲系統(tǒng)條件的相關(guān)燈,所述存儲系統(tǒng)條件包括指示應當用附加存儲容量填充所述陣列中的哪個插槽。全文摘要一種存儲系統(tǒng)條件指示器及其方法,用于提供表示一組存儲設(shè)備的操作條件的可視顯示。根據(jù)可用存儲容量和用于冗余存儲數(shù)據(jù)的容量來定義各種操作條件。一個或者多個指示器用于表示所述一組存儲設(shè)備的操作條件。所述指示器可以用于指示是否建議附加存儲容量,以及在存儲陣列中應當使用附加存儲容量更新該陣列中的哪個插槽。文檔編號G06F3/06GK101095115SQ200580045892公開日2007年12月26日申請日期2005年11月4日優(yōu)先權(quán)日2004年11月5日發(fā)明者杰弗里·S·巴拉爾申請人:數(shù)據(jù)機器人技術(shù)公司