簡介
在工程架構領域里,存儲是一個非常重要的方向,這個方向從底至上,我分成了如下幾個層次來介紹:
硬件層:講解磁盤,SSD,SAS, NAS, RAID等硬件層的基本原理,以及其為操作系統提供的存儲界面;
操作系統層:即文件系統,操作系統如何將各個硬件管理并對上提供更高層次接口;
單機引擎層:常見存儲系統對應單機引擎原理大概介紹,利用文件系統接口提供更高級別的存儲系統接口;
分布式層:如何將多個單機引擎組合成一個分布式存儲系統;
查詢層:用戶典型的查詢語義表達以及解析;
主板結構
在進入對硬件層的分析前,讓我們來看看電腦主板上各個原件之間的關系。
上圖展示了主板上主要元件的結構圖,以及他們之間的總線連接情況。核心連接點是北橋和南橋兩塊芯片。
其中北橋比較吊,連接的都是些高速設備。一般來說只連接CPU,內存和顯卡幾種設備。不過近些年也出現了PCIE2.0的高速接口接入北橋,使得一些符合標準的設備就可以接入北橋。
而南橋就相對搓了,他負責接入所有低速設備。什么USB,鼠標,磁盤,聲卡等等都是接在南橋上的。而不同的設備用途和協議都有很大不同,所以設計了不同的交互協議。由于歷史原因,不同設備傳輸介質可能都不一樣,導致總線上布線十分復雜。所以到目前為止,主流設備都已經統一成為了PCI總線,大家一起用這條總線。
讀寫過程
我們來模擬一下CPU要從磁盤讀入一份數據的過程:
CPU發出一條指令說哥要準備讀數據了
這條指令依次通過系統總線,橋間總線,PCI總線傳遞到了磁盤控制器。控制器收到指令了之后知道這是一次讀請求,且讀完了是否要發中斷的信息。做好一些準備工作,等待讀取數據。
CPU再發出一條指令說要讀取的邏輯地址
這條指令還是通過系列總線發給磁盤控制器之后。磁盤控制器就忙活了,查找邏輯快對應的物理塊地址,查找,尋道等工作,就開始讀取數據了。
CPU再發出一條指令說讀入內存的地址
當收到這條指令之后,CPU就不管了,他告訴一個叫DMA的總管,說接下來就靠你了。DMA設備會接管總線,負責將磁盤數據通過PCI總線,橋間總線,內存總線同步到內存指定位置。
寫操作的過程是類似的,就不累述了。
上面我們只是講解了在主板上數據流轉的過程,但是還有一個黑盒,就是磁盤控制器。這哥們到底是怎么管理的各個磁盤呢?在下一節我們將為你描述。
存儲介質原理
上面講了計算機讀取數據的過程。這一章我們來大概說一下常見的存儲介質的存儲原理。
磁帶
磁帶就跟小時候聽歌的時候的磁帶類似。一條黑色帶子上面有很多小的磁性粒子,根據粒子的南北級來判定0/1。
軟盤
軟盤比磁帶要先進一點,記錄數據的原理是一樣的,只是可以隨機讀取,而磁帶只能順序讀取。
硬盤
硬件原理
如果說前兩個都是古老的東西,技術含量一般的話。硬盤就是一個很有技術含量的存儲設備了,主要包含三大設備:
電機的目的是控制磁臂精準定位到磁道,一個磁道可能很小,要精準定位到哪個地方是高科技。
盤面
盤面主要有兩點。一點是基板要足夠光滑平整,不能有任何瑕疵;一點是要將磁粉均勻的鍍到基板上。這里有兩個高科技,一個是磁粉的制造,一個是如何均勻的鍍到基板上。
磁頭
磁頭的主要難點是要控制好跟盤面的距離,跟軟盤類似,硬盤也是通過修改磁粉的南北極來記錄數據的。如果隔得太遠,就感知不到磁性數據了,隔得太近呢,又可能把盤面刮到。當然0/1的表示并不是只有一個磁粉,而是一片區域的磁粉。
現在磁盤都是利用空氣動力學,將磁頭漂浮在盤面上面一點距離來控制磁頭和盤面的距離。但是當硬盤停止工作不轉的時候,磁頭就肯定掉在盤面上了,所以一般盤面靠近圓心的地方一般都有一塊沒有磁粉的地方,用于安全停靠磁頭。當硬盤要開始工作的時候,磁頭在同心圓里面起飛,飛起來了之后再移動到其他地區。
不過我一直在想,是否可以有這樣的技術,能在磁臂上裝多個磁頭,每個磁道對應一個,停止工作的時候就把磁臂固定在某個高度讓他不挨著盤面,這樣是不是能大大提高硬盤的讀寫效率,因為這樣減少了尋道的時間。
基本概念
硬盤組成原理圖如下:
如上圖, 硬盤主要有如下幾個概念(概念比較簡單,就不解釋了):
扇區
磁道
柱面
讀寫過程
讀寫過程得分成兩頭來說,一頭說將數據從各個盤面中讀取出來;一頭說如何將數據送給計算機。
從盤面中讀取數據
我們知道再磁盤中,順序讀取會比隨機讀取快很多,那么有這么多盤面,磁道,這個順序到底是什么順序呢?
假設我們現在是再順序遍歷磁盤上的數據,那么讀取順序是這樣的。首先讀完最上面一塊盤面的最外面一個磁道,等盤面旋轉完一圈之后,即這個磁道被讀取完畢,然后立即切換到第二塊盤面,讀第二塊盤面的最外面一個磁道,以此類推,直到讀完最底下一塊盤面。然后磁臂在向內移動一個磁道,重復剛才的過程,直到讀到最里面一個磁道。
其實再讀取過程中還會更復雜一點,因為盤面是一直勻速高速旋轉的,可能在一個扇區過度到下一個扇區的時候,就那么一點時間,可能存在誤差,導致下一個扇區的數據沒讀到。為了解決這個問題,一般數據是在磁道上是間隔存儲的。假設一個數據有10個扇區,分別為,d1,d2,。..,d10;為了說明這個思想,我們假設一個磁道正好也有10個扇區,分別為,s1,s2,。..s10。如果是緊挨著存放的話,那么扇區和數據的對應關系為:[(s1,d1), (s2, d2), 。.. , (s10, d10)]。這樣就存在剛才說的有誤差。那么間隔存儲的話,映射關系為:[(s1,d1), (s3,d2), (s5,d3), 。.., (s2, d10)]。
而且在切換盤面的時候,雖然是電子切換,但是速度還是會有一定延遲,下一個盤面和上一個盤面的起始點位置不能一一對應,也是會有一定錯開的。
在古老的磁盤里面,這些值可能還需要用戶來設置,不過現在都是廠商給咱們設置好,用戶不需要關心了。
由于磁臂的移動要比盤面的切換要慢很多(一個是機械切換,一個是電子切換),所以為了減少磁臂的移動,所以如上的順序讀取會是先讀一個柱面,再讀取下一個磁道,而不是先讀完一個盤面,在讀下一個盤面。
那么既然磁臂的移動如此的慢,剛才講了順序讀取的時候的磁臂移動邏輯。那么在真實情況下,有大量隨機訪問的情況下,磁臂是如何移動的呢?這里就需要考慮常見的磁臂調度算法了:
RSS:隨機調度。這個就是扯蛋,只是拿來給別人做綠葉對比性能用的。
FIFO:先進先出。這個對于隨機讀取來說,性能很不友好。
PRI:交給用戶來管理。這個跟FIFO類似,只不過優先級是由用戶來指定的,不僅增加了用戶使用磁盤的成本,效率也不見得高。
SSTF:最短時間調度。這個是指磁頭總是處理離自己這次請求最近的一次請求處理。這樣最大的問題就是會存在餓死的情況。
SCAN:電梯算法。在磁盤上往復。這個是比較常見的算法,跟電梯類似,磁臂就一個磁道一個磁道的動,移動最外面或者最里面的磁道就轉向。這個算法不會餓死。
C-SCAN:類似電梯算法,只是單向讀取數據。磁臂總是再內圈到外圈的時候讀取數據,當到達外圈過后迅速返回內圈,返回過程中不讀取數據,在重復之前的過程。
LOOK:類似SCAN,只是會快速返回,如果前面沒有讀寫請求就立即返回。
C-LOOK:類似C-SCAN和SCAN之間的關系。
一般來說,再IO比較少的情況下,SSTF性能會比較好,在IO壓力比較大的情況下,SCAN/LOOK算法會更優秀。
大家可以到這里來看看硬盤讀取數據的視頻:http://v.ku6.com/show/2gl1CHY7iNa_CVLum3NQHg.html
將數據送給計算機
剛才我們從磁盤中讀到了數據,接下來我們講解磁盤通過什么樣的接口跟計算機做交互。這個接口也叫磁盤管理協議。
磁盤管理協議的定義又分成兩部分:軟件和硬件。其中軟件是指指令級,目前指令級就兩個:ATA和SCSI;硬件代表數據傳輸方式,一般都是主板上的導線傳輸原理,但并不限制,數據甚至可以通過TCP/IP傳輸。定義一個協議需要同時定義了指令級以及硬件傳輸方式。
ATA
全稱是Advanced Technology Attachment,現在看起來不咋地,不過從名字看來,當時這個東西還是很高級的。
這個指令是上個世紀80年代提出的。按照硬件接口的不同,又分成了兩類,一類是并行ATA(PATA,一類是串行ATA(SATA)。一開始流行起來的是PATA,也叫IDE。不過由于并行線抗干擾能力太差,排線占空間,不利電腦散熱。而更高級的SATA協議自從2000年被提出之后,很快PATA/IDE接口的磁盤就被歷史淘汰,目前的ATA接口的磁盤只有SATA磁盤了。
SCSI
全稱是Small Computer System Interface。也是上個世紀80年代提出來的,當時設計他的目的就是為了小型服務器設計的磁盤交互接口。用該接口可以達到更大的轉速,更快的傳輸效率。但是價格也相對較高。
所以目前基本上在服務器領域SCSI磁盤會比較多,在PC機領域SATA硬盤會比較多。不過隨著SATA盤的進化以及其得天獨厚的價格優勢,在服務器領域SATA也在逐步侵蝕SCSI的市場。
不過SCSI也不會坐以待斃,他按照PATA進化成SATA的思路,自己也搞串行化,進化出來了SAS(Serial Attach SCSI)接口。這個接口目前很對市場胃口,不僅價格低廉,而且性能也還不錯。所以估計SATA淘汰PATA的一幕在不久的將來也會在SCSI領域里上演。
SCSI指令還可以通過Internet傳輸(iSCSI),通過FC網絡傳輸(FC-SCSI),這些我們會再后文提及。
ssd
硬件原理
ssd是近些年才火起來的存儲介質。ssd一般有兩種,一種利用flash閃存為芯片,另一種直接用內存(DRAM)作為存儲介質,只是在里面加了個電池,在斷電以后還能繼續用電池來維持數據。
我們本文中講的ssd全部是都指代前者,即用flash閃存做存儲介質。先來看一下ssd的存儲原理。
在磁盤中0/1的表示是用的磁粉的南北極的信息,在閃存中則用的是電子信號。他利用的是一種叫浮動門場效應晶體管作為基本存儲介質。在該晶體管里面,主要是由兩個門電路構成:控制門和浮動門。在兩個門之間有一堆電子。當控制門加上一個電勢的時候,電子就往浮動門那邊跑,然后控制門斷開電勢,電子會儲存在浮動門那邊(靠中間的二氧化硅絕緣層),則代表二進制中的0;控制門加一個反向電勢的時候,電子跑回到控制門這邊,浮動門那邊沒電子,代表二進制中的1。這樣就通過檢測浮動門那邊的電勢就能得到0或者1。而且現在有的ssd制造商,根據不同的電勢,將一個晶體管表示的值從0/1拓展到0/1/2/3。這樣就使得存儲容量翻倍。這種類型的晶體管叫MLC(Multi Level Cell),相對,只表示0/1的叫SLC(Single Level Cell)。不過一般而言,MLC的出錯率也高很多,所以目前市面上主流產品還是SLC的。
了解了ssd的基本原理之后,我們來看看ssd是怎么組織這些晶體管的。看如下幾個概念:
Page。一般一個Page為4K。則該Page包含4K*8個晶體管,Page是ssd讀寫的最小單元;
Block。一般128個Page組成一個Block,Block的概念非常重要,讀寫數據的控制都是針對Block的,待會我們再重點講一下Block的概念;
Plane。一般2048個Block組成一個Plane;
一塊芯片再包含多個Plane,多個Plane之間可以并行操作。
Block的組織,見下圖:
如圖,可以看到block中的晶體管是按照井字型組織的。一橫排就代表一個Page,所以一個Block一般就有128行,4K*8列。當然,由于還需要針對每個Page加一些糾錯數據,所以一般還會多一些列。
橫排是控制線,負責給電壓,來做充電放電的作用;豎排是讀取線,負責讀浮動門里的電勢之用。
讀寫過程
讀取的過程是這樣的:
假設要讀取第三行數據,那么會給第三行控制線的電勢置位0,其他127行控制線都會給一個電勢,這樣就能保證再豎排的讀取線上只讀到第三行的數據,而讀不到其他數據。可以看到ssd再讀取數據的時候不再需要尋道這些復雜的事情,速度會比傳統的磁盤塊很多。
而ssd寫入就比較麻煩了,因為ssd無法再一個block內對部分cell充電,對部分cell放電,這樣信號會相互干擾從而造成不可預期的情況發生。那ssd怎么處理這個問題呢,那就暴力了,把一個block的數據全部讀到ssd自帶的內存當中,并做好修改,接下來把整個block全部放電,即擦除所有數據,最后再將內存中整個block寫回。可以看到,即使是只修改一個bit的數據,也需要大動干戈,倒騰4K*128這么多數據,所以ssd寫數據的代價是很大的。但是瘦死的駱駝比馬大,比起機械硬盤,還是要快好幾個數量級的。
而且,ssd還有一個很頭疼的問題,就是隨著充放電次數的增加,中間的二氧化硅絕緣層絕緣效果會逐步降低,當降低到一定程度之后浮動門保存不住電子了的話,這個晶體管就算廢了。所以單個晶體管還有擦寫次數壽命,目前主流的晶體管這個上限大概是10萬的數量級。而MLC的更差,只有1萬次左右。
那么針對如上兩個問題,ssd目前一般都有哪些解決方案來應對呢?
為了優化寫的時候的性能,一般ssd并不在寫的時候做擦除。而是在寫數據的時候,選擇另外一塊干凈的block寫數據。對于老的block數據,會做一個標記,回頭定期做擦除工作;
對于壞掉的晶體管,可以通過額外的糾錯位來實現。根據不同的糾錯算法,可以容忍同一個Page中壞掉的位的個數也是不一樣的。如果超過上限,只能報告說不可恢復的錯誤。
常見存儲介質性能數字
最后我們來對比一下目前主流的硬盤和ssd的參數,這是筆者在工作中測試得到的數據,測試數據為各種存儲介質在4K大小下的隨機/順序 讀/寫數據,數字做了模糊化處理,保留了數量級信息,大家看個大概,心里有數即可:
測試項\磁盤類型 | SATA | SAS | SSD |
順序讀(MB/s) | 400 | 350 | 500 |
順序寫(MB/s) | 200 | 300 | 400 |
隨機讀(IOPS) | 700 | 1300 | 7w |
隨機寫(IOPS) | 400 | 800 | 3w |
硬盤組合
上面一節中,我們了解了單個磁盤的存儲原理和讀寫過程。在實際生產環境中,單個磁盤能提供的容量和性能還是有限,我們就需要利用一些組合技術將多個磁盤組合起來提供更好的服務。
這一節,我們主要介紹各種磁盤組合技術。首先,我們會看一下最基本的組合技術RAID系列技術;然后,我們在看一下更大規模的集成技術SAN和NAS。
RAID
RAID技術是上個世紀80年代提出來的。
RAID0:條帶化。讀寫效率都很高。但是容錯很差。
RAID1:鏡像存儲。讀效率可達2倍,寫的時候差不多。容錯牛B。
RAID2 & RAID3:多加一塊校驗盤。在RAID0的基礎之上多了容錯性。RAID2和RAID3的區別是使用了不同的校驗算法。而且這兩個的校驗是針對bit的,所以讀寫效率很高。
RAID4 & RAID5 & RAID6:這幾個都是針對block的,所以效率比RAID2&RAID3要更差一些。RAID4是沒有交錯,有一塊盤就是校驗盤;RAID5是有交錯,每塊盤都有數據和校驗信息;RAID6是雙保險,存了兩個校驗值。
目前用得比較多的就是Raid5和Raid1。
Raid的實現方式一般有兩種:軟Raid和硬Raid。軟Raid是指操作系統通過軟件的方式,對下封裝SCSI/SATA接口的硬盤操作,對上提供虛擬硬盤的接口,中間實現Raid對應邏輯;硬Raid就是一個再普通的SCSI/SATA卡上加了一塊芯片,里面執行可以執行Raid對應的邏輯。
現在一般的Raid實現方案都是硬Raid,因為軟Raid有如下兩個確定:
占用額外的內存和CPU資源;
Raid依賴操作系統,所以操作系統本身無法使用Raid,如果操作系統對應的那塊硬盤壞了,那么整個Raid就無法用了;
現在Raid卡一般都比較高級,可以針對插在上面的多塊磁盤做多重Raid。比如這三塊磁盤做Raid5,另外兩塊做Raid1。然后對操作系統提供兩塊『邏輯盤』。這里的邏輯盤對操作系統而言就是一塊磁盤,但實際底層可能是多塊磁盤。
邏輯盤不一定要占據整塊獨立的磁盤,同樣RAID的幾塊盤也可以做成多塊邏輯盤。假設有三塊磁盤做成了Raid5,假設一共有200G空間,也可以從中在劃分成兩塊,每塊100G,相當于用戶就看到了兩塊100G的磁盤。不過一般邏輯盤不會跨Raid實現。倒不是不能做,而是沒需求,而且對上層造成不一致的印象:這磁盤怎么忽快忽慢的呀。
這個邏輯盤還有一個英語名字:LUN(Logic Unit Number),現在存儲系統一般把硬件虛擬出來的盤叫『LUN』,軟件虛擬出來的盤叫『卷』。LUN這個名詞原本是SCSI協議專屬的,SCSI協議規定一條總線最多只能接16個設備(主機或者磁盤),在大型存儲系統中,可能有成千上萬個設備,肯定是不夠的,所以發明了一個新的地址標注方法,叫LUN,通過SCSI_ID+LUN_ID來尋址磁盤。后來這個概念逐步發展成為所有硬件虛擬磁盤了。
操作系統看到邏輯盤之后,一般還要再做一次封裝。邏輯盤始終都還是硬件層在做的事情,硬件層實現的特點就是效率高,但是不靈活,比如邏輯盤定好了100G就是100G,空間用光了想要調整為150G就只有干瞪眼了,實現成本很高。為了達到靈活性的目的,所以操作系統還要再做一層封裝『卷管理』。這層卷管理就是把邏輯盤在軟件層再拆分合并一下,組成新的操作系統真正看到的“磁盤”。
最后操作系統再在這些卷上面去做一些分區,并在分區上安裝操作系統等工作。
磁盤獨立鬧革命
上面都是講的單臺機器內部的磁盤組織方式,而單臺機器所提供的存儲空間是有限的,畢竟機器大小空間是有限的,只能放得下那么幾塊盤。在一般的2U的機器里面能放得下20塊盤就算是很不錯的了。在實際工業需求中,對于一些大型應用來說,肯定是遠遠不夠的。而工業界采用的方案就是:堆磁盤,單臺機器裝不下這么多磁盤就單獨拿一個大箱子來裝磁盤,再通過專線接到電腦接口上。
當然,在近些年又發展起來了一塊新的技術領域大數據存儲的市場——分布式存儲。分布式存儲價格便宜,但是性能較低,占據了不少不需要太高性能和查詢語義不復雜的市場。分布式存儲我們后面再談,現在先看看堆磁盤這條路。
當磁盤多了之后,人們發現,磁盤容量是上去了,但是傳輸速度還是上不去。默認SCSI的導線傳輸機制有如下幾個限制:
規定最多只能接16個設備,也就是說一個存儲設備最多只能有15臺機器來訪問;
SCSI導線最長不能超過25米,這對機房布線來說造成了很大的挑戰;
于是SCSI在一些企業級應用市場開始遭到嫌棄,于是人們就尋求別的硬件解決方案,人們找到了:FC網絡。
FC網絡是上個世紀80年代研究網絡的一幫人搞出來的網絡交互方式,跟以太網是同類產品,有自己完整的一套OSI協議體系(從物理鏈路層到傳輸層以及應用層)。他就是以太網的高富帥版本,價格更貴,性能更高。而當時FC網絡也主要是為了高速骨干網設計的,人家都沒想到這東西還在存儲系統領域里面大放異彩。
這里提一下,FC中的F是Fibre,而不是Fiber。前者是網絡的意思,而不是光線。雖然一般FC網絡都采用光纖作為傳輸介質,但是其主要定義并不只是光纖,而是一整套網絡協議。
但是不管怎么樣,FC網絡的引入,完美解決了SCSI導線的問題:
FC網絡就跟以太網類似,有自己的交換機,網絡連接方式和路由算法,可以隨便連接多少個設備;
光纖傳輸最大甚至可以有上百公里,也就是說主機在北京,存儲可以在青島;
傳輸帶寬更大;
并且只是替換了硬件層的東西,指令集仍然是SCSI,所以對于上層來說遷移成本很低,所以在企業級應用里得到了廣泛使用。
就目前主流的存儲協議:短距離(機內為主)使用SAS,長距離使用FC。
經過如上的系列技術發展,大規模存儲系統的技術方案也就逐漸成熟了,于是市面上就逐步出現了商業化的產品,其實就是一個帶得有一堆磁盤的盒子,這個盒子我們把它叫做SAN(Storage Area Network)。
說到SAN,就必須要提另外一個概念:NAS(Network Attach Storage)。因為字母都一樣只是換了個順序,所以比較容易混淆。NAS其實就是SAN+文件系統。SAN提供的還是磁盤管理協議級的接口(ATA/SCSI);NAS直接提供一個文件系統接口(ext/NTFS)。但是一般來說,SAN都是以FC網絡(光纖高速網狀網絡)提供給主機的,所以性能高;而NAS一般都是通過以太網接入存儲系統的,所以性能低。
另外,經常跟SAN和NAS一起的還有另外一個概念,DAS(Direct Attached Storage)。這個跟SAN類似,只是DAS只能被一臺機器使用,而SAN提供了多個接口可以供多個用戶使用。
責任編輯:Ct
評論
查看更多