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

轉自http://blog.csdn.net/yinwenjie/article/details/52208294
1、概述

在“系統存儲”專題中,我們將按照“從上至下”的順序向讀者介紹整個“系統存儲”體系。在這個專題中我們將至少介紹機械硬盤的主要結構、磁盤陣列的分類、操作系統的EXT文件系統、NAS文件共享存儲方案、分佈式文件系統重要技術點和分佈式文件系統示例。最後如果有時間我們將自行設計一款分佈式文件系統。下圖可以大致描述筆者的寫作思路:

這裏寫圖片描述

本專題首先會花費幾篇文章向讀者介紹塊存儲的知識,包括最底層機械硬盤、固態硬盤的構造結構和工作過程。塊存儲的知識中我們還將介紹磁盤陣列技術,包括磁盤陣列的組織方式和設備類型。最後塊存儲知識中我們介紹操作系統中的文件系統,包括EXT系列文件系統和XFS文件系統(會順帶提到Windows操作系統使用的NTFS文件系統)。接下來的幾篇文章我們會介紹搭建在塊存儲方案上的關係型數據庫,文章會主要講解MySQL數據庫,包括MySQL數據庫中最常被使用的InnerDB存儲引擎、索引構造方式以及MySQL數據庫集羣的幾種構造方式。

由於在《標準Web系統的架構分層》這篇文章中,筆者已經大致說明了系統存儲專題的寫作過程,所以本文就直接開始塊存儲技術的介紹了。筆者計劃花費兩到三篇文章的篇幅,向大家介紹塊存儲技術的主要知識點。
2、塊存儲方案基本構成

塊存儲技術的構成基礎是最下層的硬件存儲設備,這些硬件存儲設備可能是機械硬盤也可能是固態硬盤。一個操作系統下可以獨立控制多個硬件存儲設備,但是這些硬件存儲設備的工作相對獨立,通過Centos操作系統的df命令看到的也是幾個獨立的設備文件。通過陣列控制層的設備可以在同一個操作系統下協同控制多個存儲設備,讓後者在操作系統層被視爲同一個存儲設備。

操作系統控制多個獨立的存儲設備。下圖表示的三個硬盤設備在操作系統下獨立工作,在操作系統下顯示了三個設備文件:

這裏寫圖片描這裏寫圖片描述

操作系統通過陣列控制設備控制多個存儲設備。陣列控制設備在市場上從低端到高端有很多選擇。目前市場上的一些主板就自己集成了陣列控制芯片,如果中小企業需要硬盤陣列設備可以購買民用級產品,市場價格普遍在幾千塊左右。高端設備可以購買IBM/EMC提供的商業級/工業級設備,市場價格從幾萬到幾千萬不等。筆者將在本專題中詳細介紹硬盤陣列的重要技術知識點。

這裏寫圖片描這裏寫圖片描述

爲什麼操作系統層可以做到以上兩種存儲設備的組織方案同時兼容呢?因爲操作系統層通過各種文件系統規則,可以過濾掉各種存儲設備的不同硬件特性。EXT1、EXT2、EXT3、EXT4系列文件系統和XFS文件系統都是Linux操作系統下常用的文件系統,Btrfs文件系統是最近今年Linux操作系統下越來越流行的新一代操作系統。這些文件系統的共同特點是:通過文件系統內部能夠辨識的一個文件索引結構規範對下層的硬件設備結構進行封裝,以便起到屏蔽和代理操作下層硬件結構的目的。 那麼當下層存儲設備不是機械硬盤而是固態硬盤又或者是陣列控制設備時,又是怎樣的工作原理呢?本專題中將會一一解答這些問題。對於操作系統中的文件系統,我們將着重介紹EXT系列文件系統的結構。
3、機械硬盤
3-1、機械硬盤結構

這裏寫圖片這裏寫圖片描述描述

現在的機械硬盤技術都非常成熟了,存儲容量也出現了幾何級增長。但是機械硬盤的基本結構卻一直沒有太大的變化:它基本上是由機械臂(磁頭臂)、主軸、多個成對的磁頭和磁面構成。在每個磁面上被分成多個磁道、多個扇面和多個扇區,它們的具體存在形式如下:

磁面上會有多個磁道,它們在一個磁面上擁有不同的磁道編號。從磁面最外圍離主軸最遠的磁道到磁面最內側離主軸最近的磁道,它們的編號從0開始,分別是0、1、2、3、4…….N(N大於等於10000,依據硬盤製作工藝不同而不同)。磁頭將會順着磁道基於磁面的轉動讀取數據,並且可以在各個磁道間切換位置。

實際情況下,外部將要存儲到硬盤上的數據不會一次性寫滿整個磁道,讀取數據到外部時也不需要讀取整個磁道的數據。這是因爲一個磁道被分爲多個弧段,這些弧段稱之爲扇區。扇區是硬盤上存儲數據的最基本物理單元。注意,目前市場上無論哪個供應商提供的機械硬盤產品,每個物理扇區單元固定的存儲容量都是512字節。只是根據硬盤密度不一樣,單位磁面下的扇區數量也不一樣。既然扇區是數據存儲的基本單元,就意味着一次硬盤讀寫操作的最小數據量就是512字節。

那麼問題來了,是不是覺得512字節太小了點?是的,很多時候操作系統層面請求讀寫操作的文件都會大於一個扇區的單位容量。那麼在物理層面上就需要兩個甚至更多個扇區來存儲這個文件,那麼怎樣來規劃存儲一個文件的若干扇區在磁面上的分佈,從而達到減少讀取時間的目的呢?

操作系統層面會將物理硬盤上兩個或者多個能夠連續讀取的扇區組成合併成一個區域,稱之爲“簇”。注意,這兩個或者多個能夠連續讀取的扇區不一定在物理上是連續的。這是什麼原因呢?這是因爲硬盤轉動的速度很快(標準速度爲7200轉/分),當磁頭完成一個“扇區1”的讀寫後還來不及讀取下一個連續的“扇區2”相鄰的扇區就“飛”過去了,要等磁面再轉動一圈到預定“扇區2”的位置才能繼續進行讀寫。

所以一個簇在物理磁面的分佈可能是不連續的。實際上各個硬盤生產商都會設置一個“跳躍因子”來確定能夠連續讀取的扇區。如下圖所示,四個不存在於連續物理位置的扇區構成一個簇。這樣保證了磁面在旋轉一圈的情況下就可以完成一個簇的全部讀寫。

這裏寫圖片描這裏寫圖片描述

最後說明一點,雖然扇面是硬件層面上機械磁盤讀取數據的最小單元,但是“簇”纔是操作系統層面上讀取磁盤數據的最小單元。我們後文將講解EXT文件系統和Btrfs文件系統,這兩種文件系統定義的簇大小是不一樣的。例如EXT文件系統的族大小可以有1KB(兩個扇區)、2KB(四個扇區)、4KB(八個扇區)等多種選擇。那麼如果一個文件太小,不需要用完一個簇怎麼辦呢?沒辦法,它有需要使用至少一個簇的硬盤空間。也就是說,在操作系統存儲一個文件時,即使一個簇沒有佔滿,剩下的簇空間也不能再使用了。這就是爲什麼一個文件在操作系統上有兩個大小:一個是文件的實際大小、另一個是文件佔用硬盤空間的大小。
3-2、機械硬盤性能瓶頸
3-2-1、影響機械硬盤性能的因素

當需要從硬盤上讀取一個文件是,首先會要求磁頭定位到這個文件的起始扇區。這個定位過程包括兩個步驟:一個是磁頭定位到對應的磁道,然後等待主軸馬達帶動盤片轉動到正確的位置,這個過程所花費的時間被稱爲尋址時間。也就是說尋址時間實際上包含兩部分:磁頭定位到磁道的時間爲尋道時間,等待盤片轉動到正確位置的時間稱爲旋轉等待時間。

硬盤尋址的目的是爲了找到將要讀取的文件的起始扇區,並開始去取數據。這就可以解釋爲什麼硬盤上讀取一個100MB大小的文件和讀取1000個100KB大小的文件時間是完全不一樣的現象了:通常來說一個100MB的文件是存儲在硬盤上可以連續讀取的扇區上的,也就是說當硬盤需要讀取這個文件時只需要進行一次尋址(爲什麼說是“通常”呢?因爲前提是硬盤上至少要有一端連續空白的扇區,如果此時硬盤上碎片太多可能就找不到這樣的連續空白區域了);而讀取1000個文件時,由於這些文件的起始存儲位不連續,所以每次都要進行尋址操作。尋址時間是評價機械硬盤性能的重要指標,這個指標和硬盤轉數、磁頭數有直接關係:

硬盤轉速越快的硬盤,在同樣的尋址算法控制條件下將能夠更快的將正確的扇區轉動到磁頭下方。但是硬盤轉速也不能做得無限快,因爲硬盤轉速越快要求的磁面工藝、主馬達工藝也就越高,並且產生的噪音、溫度也會成幾何級增加。現在民用級、商用級和工業級硬盤上最常採用三種轉速選擇:5400轉/分、7200轉/分和10000轉/分。

磁頭數,現在的機械硬盤中一般都包含了多個盤片並且分別使用獨立的磁頭。這樣做的主要作用是在硬盤密度不變的情況下增加機械硬盤的容量。實際上這樣的做法也可以增加一定的硬盤性能,因爲讀取存儲在不同磁面上的文件時,它們的尋道時間可以相對獨立。但是其對性能的提示只能是有限的,因爲這些盤片共享同一個主軸馬達。

機械硬盤的工作原理導致了它的工作性能會遠遜於內存,現在主流的7200轉硬盤外部傳輸速度的理論峯值大概也就是200MB/s。那麼問題又來了,天才的硬件工程師難道就沒有辦法增加機械硬盤讀寫性能了嗎?

答案是否定的,硬件工程師爲機械硬盤集成了緩存,並採用預讀機制讀取當前扇區的臨近扇區。舉個例子,當硬盤讀取一個文件所在扇區時,會將這個扇區臨近的若干扇區上的數據一同讀取出來並存儲到硬盤緩存中。這樣做的原因是依據計算機科學中得一個著名原理:局部性原理。

局部性原理包括三層含義。時間局部性,如果一個信息項正在被訪問,那麼在近期它很可能被再次訪問。空間局部性,在近期將要被使用的信息很可能與現在正在使用的信息在空間地址上是臨近的。順序局部性,在典型程序中,除轉移類指令外,大部分指令是順序進行的。局部性是所有高速緩存設計的基本原理依據。

說人話,局部性原理在硬盤硬件設備設計中被應用的依據是:當一個文件被讀取時,在它臨近扇區所存儲的文件數據也將在近期被讀取。所以硬盤會預先讀取後者到緩存中,以便在不久的將來,這些數據被請求讀取時直接從緩存中向外部設備輸出文件數據。

局部性原理不止適合高速緩存這樣的硬件設計,它也適用於軟件設計:一個程序90%的時間運行在10%的代碼上。

3-2-2、順序讀寫和隨機讀寫

上一小節已經提到硬盤的順序讀寫和隨機讀寫有非常大的性能差異,其中主要的原因是兩者尋址操作上所耗費的時間存在巨大差異。那麼順序讀寫和隨機讀寫的差異到底有多大呢?僅僅是靠上一小節的文字描述顯然不能給讀者數值化的認識,所以在本小節中我們將使用一款名叫CrystalDiskMark的測試軟件,讓讀者具體體會一下兩者的巨大區別:

這裏寫圖片描這裏寫圖片描述

以上是筆者編寫文稿使用的某品牌筆記本上5400轉機械硬盤的測試截圖(題外話,這款筆記本用起來真想罵人),這個機械硬盤屬於中低端硬盤,但是相同級別的硬盤在萬元級以下的筆記本上卻被大量使用,所以這個測試結果很能說明一些問題。首先解釋一下以上截圖中的幾個主要項目:

在測試結果的上方寫明瞭這是一個針對E盤符的測試,每一單項所測試的讀寫數據總量爲500MB,並且每個單項測試分別執行5次。執行5次後綜合每次的測試結果取平均值,最終形成這個單項的測試結果。

“Seq”和“Seq Q32T1”這兩個選項分別代表沒有IO隊列的單線程順序讀寫和一個深度爲32的IO隊列的單線程順序讀寫,其中Q32代表隊列深度爲32,T1表示IO線程數爲1。這個隊列長度和IO線程數量都可以在CrystalDiskMark進行調整。

4K表示進行小文件讀寫測試時這些小文件的大小,這些4K文件將進行隨機讀和隨機寫測試。4K測試項是衡量固態硬盤性能的重要測試項,直接描述了固態硬盤的性能,這個我們將在下文進行說明。

從上圖的測試結果來看,順序讀寫的性能遠遠高於隨機讀寫的性能,使用了IO隊列的讀性能又遠遠高於沒有使用IO隊列的讀性能(且寫性能基本持平)。當然以上的測試數值和選用的機械硬盤型號是密切相關的,但無論數值結果如何變化,最後都會符合以上所描述的性能規則。

例如如果您對7200轉企業級硬盤進行測試,那麼所有測試項的橫向數值會高出很多;如果您的INTEL SSD 企業級固態硬盤卡進行測試,那麼橫向數值又會再高出很多倍。下圖展示了INTEL SSD 750 企業級固態硬盤卡的測試結果(截圖來源於網絡):

這裏寫圖片描這裏寫圖片描述
4、固態硬盤

看了以上來源於網絡的截圖後,是不是感覺整個世界瞬間清爽了。目前固態硬盤的生產工藝日趨成熟,單位容量價格也趨於下降通道。固態硬盤替代機械硬盤是一個必然趨勢,遲早有一天後者將被完全替換。本節向讀者介紹固態硬盤大致的構成結構和工作過程。
4-1、固態硬盤結構

固態硬盤的結構和工作原理和機械硬盤大不一樣。它主要由大量NAND Flash顆粒、Flash存儲芯片、SSD控制器控制芯片構成。他們三者的關係通過下圖進行表示:

這裏寫圖片描這裏寫圖片描述

在一個固態硬盤上會有若干Flash存儲芯片(可能有2顆、4顆、8顆等數值),每顆存儲芯片內部包含大量NAND Flash顆粒,目前(2016年)NAND Flash顆粒的製作工藝已經達到12nm(2012年的主流工藝是90nm)。無論NAND Flash顆粒的製作工藝如何,每一個單位的存儲容量都是512字節。多個Flash存儲芯片被一個SSD主控芯片,目前能夠生成SSD主控芯片的廠商不多,例如:SandForce、Marvell、三星、JMicron、Intel等。SSD主控芯片的主要工作包括識別來自於外部接口(PCI-E、SATA等)的控制指令、在將數據寫入Flash存儲芯片前接收和壓縮這些數據、在將數據送入內存前解壓從Flash存儲芯片讀取的數據、完成 LBA和PBA的映射轉換(這個過程將在下一小節進行介紹)等工作。

雖然一個單位的NAND Flash顆粒存儲容量是512字節,但是SSD主控芯片進行數據操作的最小單位並不是512字節。在SSD操作規則中定義的一個數據操作的最小單位爲4KB,它包括了8個單位的NAND Flash顆粒稱爲Flash Page(有的資料中稱爲Host Page)。如果將固態硬盤和機械硬盤進行對比,那麼機械硬盤中的一個最小的操作單位就是扇區,單位大小就是512字節;固態硬盤中的一個最小操作單位就是Flash Page,單位大小爲4K。這就解釋了上文中提到的硬盤讀寫性能測試中,爲什麼測試軟件會專門針對4K大小的文件進行讀寫測試了。

既然固態硬盤中最小的操作單位爲4K,那麼在進行操作系統文件系統格式化的時候就需要注意了。文件系統中設置的一個簇大小不能小於4K且最好爲4K的整數倍,這樣才能保證充分發揮固態硬盤的性能。

固態硬盤不依靠磁頭定位和主馬達旋轉確定數據的物理位置,所以固態硬盤沒有尋址時間。SSD控制芯片擁有的多個控制通道可以讓它同時向多個Flash存儲芯片發送讀寫指令,這類似於機械磁盤上可以獨立工作的磁頭臂,但卻沒有共享主軸馬達的限制。這些特點足以保證固態硬盤的性能遠遠高於機械硬盤。這也讓我們認識到,以下因素影響着固態硬盤的最終性能:

SSD主控芯片:上文已經說到SSD主控芯片幾乎完成了固態硬盤上所涉及的所有控制指令操作和數據讀寫操作。不同的SSD主控芯片內置的FTL算法不一樣、數據壓縮/解壓算法不一樣、控制通道數也不一樣,所以固態硬盤採用哪種SSD主控芯片將直接影響其性能,目前最好的控制芯片來自於Intel,最廣泛使用的控制芯片來自於三星。

FLash存儲芯片工藝:本文提到的NAND Flash顆粒只是其中一種使用最廣泛的型號,實際上還有NOR Flash顆粒等。NAND Flash顆粒又分爲兩種子類型:MLC存儲顆粒與SLC存儲顆粒。在相同單位體積下,MLC可以提供兩倍於SLC的存儲空間,而後者在存儲響應時間和存儲穩定性上又高於前者。所以MLC存儲顆粒市場佔有率更高,SLC存儲顆粒更傾向於企業級市場。

4-2、固態硬盤工作過程

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

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