架構設計:系統存儲(2)——塊存儲方案(2)

轉自http://blog.csdn.net/yinwenjie/article/details/52248862

接上文《架構設計:系統存儲(1)——塊存儲方案(1)》
4-2、固態硬盤工作過程

本小節我們要解決一個關鍵問題:既然機械硬盤和固態硬盤從工作原理、製作工藝、技術規範等多個方面都完全不一樣,那爲什麼無論硬件層是使用機械硬盤還是固態硬盤操作系統卻都可以進行識別,並在其上進行數據讀寫呢?

這個問題中,計算機系統不同層次對數據操作最小單位的定義不一致都還是一個小問題:雖然機械硬盤上數據操作單元爲512字節、固態硬盤上數據操作單元爲4KB、操作系統層面定義的數據操作單元可能是1KB\2KB\4KB\8KB等等。但是隻要這些層次上的文件起始地址都是固定的,則各層的地址對應關係就可以找到的。也就是說操作系統上的地址X可以映射到機械硬盤的地址Y又或者映射到固態硬盤的地址Z,只不過存儲小文件時的真實可用空間可能產生誤差。

但是這裏有一個固態硬盤上的操作規則會引起比較大的問題,這就是固態硬盤對數據的刪除操作:固態硬盤在進行數據刪除時是按照“塊”單位進行的,一個“塊”包含128個或者256個Flash Page。當進行刪除操作時,SSD主控芯片會首先將這個塊中還“有效”的數據移動到屬於其它“塊”的另一些Flash Page中,然後再進行“無效”數據的清理。也就是說以前操作系統通過地址X的可以讀取的文件數據,現在通過地址X就可能讀取不到了。那麼這些固態硬盤的底層操作過程對於操作系統來說應該是完全透明的,否則操作系統就不能將固態硬盤當成機械硬盤進行操作。

這就是說,對於操作系統來說以前使用地址X進行存儲的文件,無論什麼是否都能夠再通過地址X讀取到。這裏提到了兩種地址:一種是操作系統讀寫文件的地址——稱爲邏輯地址;另一種是固態硬盤進行文件操作的真實地址——稱爲物理地址。

FTL(Flash translation layer)閃存地址轉換是SSD固態硬盤控制芯片需要負責的主要工作之一,FTL的主要作用就是記錄物理地址和邏輯地址的轉換關係,FTL的核心是一張物理地址和邏輯地址的映射表,這張映射表存儲在固態硬盤一個專門的SRAM/DRAM芯片上或者若干獨立的NAND Flash Page 上。正是SSD固態硬盤的控制芯片有這樣一個轉換過程,操作系統才能將固態硬盤當做機械硬盤進行操作,並且SSD固態硬盤主控制芯片上FTL算法的性能直接影響着整個SSD固態硬盤的性能。請看下圖的FTL轉換示例:
這裏寫圖片描述

操作系統對磁盤讀寫操作的最小單位爲“簇”(EXT文件系統稱爲block size)。以NTFS文件系統爲例,默認的“簇”大小爲4K(當然您可以選擇更大的“簇”大小,這樣會浪費更多的存儲空間,但是可以加快讀寫性能)。即使一個文件的大小不到4K,也會佔用一個“簇”的大小。如果一個文件爲210KB,那麼理論上就需要佔用53個“簇”空間(4KB),或者需要佔用105個“簇”空間(2KB)。

當一個210KB大小文件的寫請求從操作系統層傳來時,都以邏輯地址進行描述。當SSD固態硬盤主控芯片收到這個文件的寫請求時,會到FTL映射表中尋找53個空閒的Flash Page來存儲這些數據,並將物理位置和邏輯位置的映射關係記錄到FTL映射表中;當一個210KB大小文件的讀請求從操作系統傳來時,SSD固態硬盤控制芯片會首先在FTL映射表中尋找邏輯爲止對應的若干物理位置,以便知曉到固態硬盤的哪些Flash Page去讀取數據。

還需要注意,在進行數據寫操作時,如果沒有尋找到足夠的空閒的Flash Page位置那麼有兩種可能:第一種可能是,在SSD固態硬盤上確實已經沒有210KB的空間了,這時操作系統就會收到磁盤空間已滿的信息;另一種情況是有部分空間被“無效”數據佔用(這些“無效”數據來是前被操作系統刪除的數據),這時固態硬盤就要進行無效數據清理。SSD固態硬盤的數據清理是將若干Flash Page的區域全部清理,稱爲塊。清理操作過程已經在上文中大致介紹過。這也是爲什麼固體硬盤在使用一段時間後(特別是存儲空間被佔用滿後),固態硬盤的性能會出現明顯下降的原因。

最後需要注意,實際上由操作系統傳來的數據和操作請求也不是直接就發送到SSD主控芯片了,而是需要經過軟件和硬件的多層傳遞。在硬件層面上來說,數據一般需要通過主板上的南橋芯片(在經過磁盤陣列控制芯片)才能傳送到SSD固態硬盤的外部接口(例如SATA3.0、USB3.0等),最後再達SSD主控芯片。

5、磁盤陣列方案

單塊硬盤進行數據存儲可能會存在以下問題:

硬盤容量有限制,當容量不足時不能進行硬件擴容。現在磁盤技術在磁盤容量上已經有了長足的發展,目前(2016)機械硬盤的主流容量已經達到6TB,固態硬盤的主流容量也達到512GB。但是單塊硬盤始終都存在較嚴重的容量擴充問題,除非讀者在擴容時手動遷移數據。

數據可靠性性問題。單塊硬盤不存在任何備份機制,雖然現在有很多扇區檢測軟件可以幫助開發人員/運維人員提前發現硬盤損壞的磁道,但是都不能保證99.99%的運行可靠性。一旦硬盤由於各種原因損壞(電壓不穩、磁頭位移等),存儲在其上的數據就可能永久丟失。

讀寫性能瓶頸。這個問題在SSD固態硬盤上還不太明顯,目前主流的固態硬盤的外部傳輸速度可達到550MB/S,這個速度基本上達到了SATA 3/USB 3.0接口規範的理論峯值。但這個問題對於機械硬盤來說卻很明顯了,由於機械硬盤的讀寫性能受到磁頭數量、盤片轉速、盤片工藝等因素的影響,所以機械硬盤的讀寫性能一直沒有一個質的飛躍。如果將單個硬盤應用在生產系統上,那麼磁盤讀寫性能無疑將會整個系統的性能瓶頸。另外SATA 3結構理論6Gbps的傳輸帶寬必要時也需要找到替代方案。

爲了解決以上這些問題,硬件工程師將多個硬盤按照不同的規則組合在一起形成各種集羣化的數據存儲結構,這些存儲結構被稱爲磁盤陣列(Redundant Arrays of Independent Disks,RAID)。磁盤陣列解決以上這些問題的基本思路有:

通過硬盤橫向擴展或者縱向擴展的方式,解決整個磁盤整理存儲容量限制的問題。而對於上層操作系統來說,看到的都只是一個磁盤設備文件/操作盤符而已。
通過數據鏡像或者數據校驗的方式解決數據冗餘和數據恢復的問題。
通過陣列控制芯片分發數據讀寫請求的方式,將原本集中在一塊硬盤上的數據讀寫請求分散到多塊硬盤上,從而解決磁盤性能的問題。

目前磁盤陣列結構有多種,包括 RAID 0、RAID 1、RAID 2、RAID 3、RAID 4、RAID 5、RAID 10/01、RAID 50等。其中RAID 2、RAID 3、RAID 4這三種陣列結構常用於陣列研究,生產環境中常使用的陣列結構爲RAID 0、RAID 1、RAID 5和RAID 10/01。下面我們就對這些磁盤陣列結構逐一進行介紹。
5-1、磁盤陣列結構
5-1-1、RAID 0

RAID 0陣列結構是所有陣列結構中讀寫性能最好的,也是所有陣列結構中實現思路最簡單的:
這裏寫圖片描述

RAID 0陣列結構沒有數據冗餘機制和數據恢復機制,它至少需要兩個硬盤進行構造。整個RAID 0陣列結構就是將參與RAID 0陣列構建的所有硬盤進行容量累加,從而形成一個更大的、對上層操作系統統一的存儲容量。所以RAID 0陣列的存儲容量就是這些硬盤的容量進行累加。

當需要寫入的數據到達陣列控制器,後者會向其下的硬盤設備分發這些數據。這樣原來可能只由一個硬盤承擔的讀寫壓力就會被分擔到多個硬盤上,最終提高了整個陣列的讀寫性能。RAID 0陣列結構存儲速度的優勢非常明顯,且參與構造陣列的磁盤數量越多陣列速度越快(峯值速度最終會受到總線、外部接口規範、控制芯片製造工藝等因素的限制)。但是RAID 0陣列結構的缺點也很明顯:由於陣列結構沒有容錯機制或者數據恢復機制,當陣列中的一個或者多個磁盤發生故障時,整個陣列結構就會崩潰並且不能恢復。所以在實際應用中,只有那些單位價值不高且每天又需要大量存儲的數據纔會使用RAID 0陣列結構進行存儲,例如日誌文件數據。
5-1-2、RAID 1

RAID 1陣列結構又被稱爲磁盤鏡像陣列或者磁盤冗餘陣列。它的構造特點是陣列結構中的每一個磁盤互爲鏡像:
這裏寫圖片描述

當有外部數據需要存儲時,RAID 1陣列控制器將會首先把這個數據做成N個副本(N的數量和陣列結構中物理磁盤的數量相等),實際上鏡像副本的單位爲扇區或者Flash Page。這些副本會分別存儲到陣列結構的各個磁盤中。在進行數據讀取時,RAID 1 陣列結構中的某一塊磁盤將會作爲主要的數據讀取源頭,當這個源頭出現吞吐量瓶頸時,RAID 1陣列控制器會主動到其它鏡像磁盤讀取數據。所以RAID 1陣列的數據讀取性能還是要比單個磁盤的性能要好,但是寫入性能卻差了很多。

從以上介紹可以看出,RAID 1陣列結構設計之初的主要目的並不是提高存儲設備的讀寫性能,而是保證高價值數據的存儲可靠性。由於RAID 1陣列結構中需要保證每個磁盤的鏡像數據完全一致,所以它還要求參與RAID 1陣列結構的每一個磁盤的容量必須相同,否則RAID 1陣列結構會以最小的那個磁盤容量爲自己的標準容量。
5-1-3、RAID 10和RAID 01

RAID 0和RAID 1都有自己的優缺點,並且這些特點都很突出:RAID 0雖然速度快但是沒有任何數據保障措施,所以一味地快意義並不大;RAID 1雖然保證了數據的可靠性,但是卻犧牲了大量空間和讀寫速度。所以以上兩種陣列結構特別是RAID 0,在企業級/工業級環境中使用的情況還是比較少。那麼有沒有一種陣列結構在融合了RAID 0和RAID1兩者優點的同時又避免了各自的缺點呢?

答案是:有的!RAID10和RAID01兩種陣列結構就是爲了實現RAID 0和RAID 1的融合而被設計的。在RAID10結構中,它首先將參與陣列結構組建的磁盤進行分組,形成若干組獨立的RAID 1陣列結構,然後再將這些獨立的RAID 1陣列結構形成RAID 0結構,如下圖所示:
這裏寫圖片描述
上圖中有四塊硬盤參與RAID 10陣列結構的組建,四塊硬盤是組建RAID 10陣列結構的最小要求(實際上兩塊也行,但是那樣的RAID 10沒有任何意義)。它們首先被兩兩分組形成兩個獨立的RAID 1結構,這也意味着這些硬盤的容量最好是一樣的,否則每組RAID 1結構會基於容量最小的那塊硬盤確認自己的容量。接着獨立工作的兩組RAID 1再組成RAID 0陣列結構。

假設參與RAID 10構建的硬盤大小都爲6TB,則兩組獨立的RAID 1陣列結構的容量分別爲12TB,最終整個RAID 10陣列結構的存儲容量爲12TB。可以看到RAID10陣列結構的存儲容量和獨立磁盤的大小、分組數量有關。我們可以得到以下的計算公式:

RAID 10總容量 = N / G * 單個硬盤的存儲容量

這個公式假設的前提是參與RAID 10構建的每個硬盤的存儲容量都相同。其中N表示參與RAID 10構建的硬盤總數,G代表RAID 10下磁盤映射的分組數量(RAID 1分組數量)。例如,總共12塊硬盤參與RAID 10構建,每個硬盤的大小爲6TB,且分爲三組RAID 1,那麼這樣組建的RAID 10陣列結構的存儲容量爲24TB;如果同樣的情況下,這些硬盤被分爲四組RAID 1,那麼組建的RAID 10陣列結構的存儲容量就爲18TB。

可見RIAD 10通過集成更多硬盤的思路,將RAID 0陣列和RAID 1陣列的特點進行了融合,在保證數據存儲可靠性的基礎上提高了陣列的整體存儲性能。RAID 10被廣泛應用在各種計算場景中,市場上從幾千到幾百萬的陣列設備都提供對RAID 10磁盤陣列結構的支持。RAID 10磁盤陣列的總讀寫速度會受到控制芯片的影響,所以幾千和幾百萬的磁盤陣列設備實際讀寫性能是完全不一樣的 。

另外還有一種和RAID 10陣列結構相似的陣列結構:RAID 01(或稱爲RAID 0 + 1),它們的構造區別是,後者首先將若干磁盤以RAID 0的方式進行組織,然後再分組成多個獨立的RAID 1結構:

這裏寫圖片描述

5-1-5、RAID 5

RAID 5陣列結構和RAID 10/01陣列結構在實際生產環境中都經常被使用,前者的應用更爲廣泛:雖然速度上RAID 5沒有RAID 10/01陣列結構快,但是RAID 5陣列控制芯片的成本卻低很多。RAID 5陣列基於奇偶校驗原理,它的算法核心是異或運算(XOR)。異或運算是各位讀者在大學離散數學課程中學習過的一種基本二進制運算,其運算關係如下表所述(以下表格的計算因子只有兩個,目的是讓讀者回憶起來):

A值      B值  運算結果
1       1       0
1       0       1
0       1       1
0       0       0

接着我們可以再假設計算因子爲N,根據異或運算的特點,我們可以在已知結果和N-1個原始計算因子的前提下,還原出未知的那個計算因子。請看下面示例的計算過程(N == 4):

......

1 ^ 1 ^ 1 ^ ? = 1  ----->   ? = 0
1 ^ 1 ^ 1 ^ ? = 0  ----->   ? = 1
1 ^ 0 ^ 1 ^ ? = 1  ----->   ? = 1
1 ^ 0 ^ 1 ^ ? = 0  ----->   ? = 0
0 ^ 0 ^ 1 ^ ? = 1  ----->   ? = 0
0 ^ 0 ^ 1 ^ ? = 0  ----->   ? = 1
0 ^ 0 ^ 0 ^ ? = 1  ----->   ? = 1
0 ^ 0 ^ 0 ^ ? = 0  ----->   ? = 0

......

有了以上的理論基礎,我們就可以將它應用到實際的塊存儲工作中。試想一下如果將以上異或運算的每個計算因子擴展成磁盤上的一個數據扇區並針對多個扇區進行異或運算並將計算結果存儲下來。那麼是否可以在某一個數據扇區出現問題時恢復數據呢?答案是肯定的,請看如下扇區校驗實例:
這裏寫圖片描述

在以上四個扇區的校驗示例中,它們分屬四個不同的磁盤設備,其中三個扇區存儲的是數據,最後一個扇區存儲的是異或運算後的校驗碼。在上一篇文章中我們已經介紹過一個扇區存儲的數據量爲512字節。當某個數據扇區出現故障時,基於校驗扇區的信息和正常狀態的數據扇區的信息,RAID 5磁盤陣列可以將發生故障的扇區恢復出來;當某個校驗扇區的信息出現故障時,RAID 5磁盤陣列還可以重新進行校驗。也就是說RAID 5陣列結構同一時間內只允許有一塊硬盤出現故障,出現故障的硬盤需要立即進行更換。

這裏寫圖片描述

如果還未來得及更換故障硬盤,另一塊硬盤又出現了故障,那麼對整個RAID 5陣列就是毀滅性的——因爲無法通過異或計算同時恢復兩個計算因子。當更換故障硬盤後,RAID5陣列控制器將會自動對數據進行重新校驗,恢復數據。爲了在可靠性和讀寫性能上找到平衡,RAID 5陣列結構會將存儲同一個文件的若干扇區分佈在陣列下的若干磁盤上(設陣列中磁盤總數爲N,則文件數據扇區分佈於N-1個磁盤上),並將這些扇區的校驗信息存儲在最後剩餘的一塊磁盤上;RAID 5陣列結構中,校驗信息也並不是全部存儲在一塊相同的磁盤上,而是均勻分佈在每一塊磁盤中,這樣做的目的是爲了儘可能快的完成數據恢復過程。

============================
(接下文)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章