數據的存儲介質-磁盤的RAID

上次介紹了磁盤,這篇來介紹一下RAID
要介紹RAID技術的緣由,實際上是由於目前大部分分佈式存儲在作的事情其實RAID在不少年前就已經作到了,因此若是你但願作存儲相關的事情,那麼RAID是必需要理解,但不必定要用到的概念:)安全

計算機要存儲和讀取數據,主要依託這麼兩個部件:網絡

1.通訊管道和通訊協議,心靈感應還須要靠電波通訊呢不是?~通常來講這通訊管道在計算機內就是總線,使用電信號,在計算機外則不少選擇,能夠選擇光,能夠選擇無線電波,也能夠選擇電信號,甚至能夠動用卡車和油輪嘛J,在磁盤存儲領域,有很是多種通訊管道和通訊協議,粗略的按照發展時間序列來排列的話:ide/ata/sata/scsi/sata3mb/sata6mb。大概是這個順序,通道的吞吐量也是逐漸的提高。運維

2.數據存儲介質,通常來講也就那麼幾種,光蝕刻,磁帶,固態電子等。每一種都有本身的一些特性。tcp

而raid的主要目標就是合理的使用上述資源,經過數據分區(partition)和數據複製(replication),來提高數據存取的總體吞吐量,iops以及安全性和能夠性。分佈式

(RAID,RedundantArrayofIndependentDisks)獨立磁盤冗餘陣列,其實產生的核心緣由很簡單,單個硬盤的iops和數據安全性都不夠高,那麼天然而然就會想到,若是有不少塊磁盤存儲介質,把這些磁盤進行合理的組織,讓他們並行的提供讀寫,不是就能實現更高的吞吐量和更高的數據安全級別了麼?這就是raid的基本想法,其實RAID/軟RAID/GoogleFilesystem/HDFS要作到的事情都是同樣的:ide

經過切分和複製組裝大量存儲,實現更高的吞吐量和更高的數據安全級別。性能

由於RAID的各種介紹廣見於各種網站,所以這裏就用幾句句話來快速的介紹一下幾種常見的RAID模式吧:網站

RAID0,RAID1,RAID5,RAID10,RAID01,當年看這些概念的時候總覺得這些數字之間有什麼繼承或者進化關係,但其實這些數字之間是不要緊的,只是個惟一標識而已。。。網絡傳輸協議

RAID0把全部磁盤按照條件進行全局分區,保證數據能夠儘量並行的寫入到這些磁盤中,從而提高讀寫性能,HDFS/GFS也借鑑了這個機制。通常來講就是給每個固定大小的文件塊一個惟一的標識,寫的時候按照這個標識往某塊磁盤中寫入,讀的時候根據這個標識從某塊磁盤中讀取這批數據。spa

RAID1數據複製鏡像,簡單來講就是依託冗餘的方式把數據複製多分從而可以保證數據安全。HDFS/GFS裏面也借鑑了這個機制,作法就是把數據文件順序的寫在同一個機架的三個不一樣的機器內,從而保證數據安全。代價是N倍的數據空間消耗,同時在一塊硬盤壞掉後,由於須要在新磁盤作數據冗餘,所以某些磁盤會有一段時間的「較高延遲不該期」

RAID5是對RAID1在空間浪費上的改進,主要思路就是三塊磁盤組成一個組,假設有A,B,C.每一個磁盤上都會被全局分區,而後C上面存AB的XOR後數據。這樣當A壞掉的時候,能夠根據C,B恢復A,B壞掉能夠根據A,C恢復B,C壞掉能夠根據A,B恢復C。與RAID1相比的好處是:由於RAID1由於是全鏡像,因此假設數據量是Nmb,那麼實際磁盤存儲了2Nmb,而RAID5則只須要存儲1.5Nmb。代價是額外的計算量,而且,raid5的寫入速度也通常比較慢。

RAID1+0與RAID0+1,就是把raid1和raid0結合到一塊兒,1+0和0+1的區別在於:

先作數據冗餘而後再作數據分區(raid10),(圖片的下層是「先」上層是「後」:)

(圖片來自wiki)

194905282.png

仍是先作數據分區而後作數據複製冗餘(raid01)195024955.jpg

(圖片來自wiki)

RAID0+1和raid1+0在四塊磁盤組成的陣列裏面讀寫吞吐量在正常狀況下其實沒有本質差異,但想想,假設咱們使用了raid0+1,寫了一組順序的數據,0,1,2,3,4,5,6,7,8,9,10.他以mod2的方式被分配到兩塊磁盤上,當這兩塊磁盤中的一塊,好比是mod2=0的那塊磁盤損壞了,那麼爲了保證數據的寫入順序,這組raid0的兩塊磁盤勢必會停留在0,2,4,6,8,10這幾個寫入中的某一個上,還不能跳過有問題的數據,不然會出現寫入亂序,數據會錯亂的。對四塊磁盤組成的raid0+1,壞一塊盤就等於兩塊盤不能用了,明顯不划算,因此raid0+1只存在於思想實驗中。。。默認通常都是raid1+0方式。再稍微擴展一點,其實目前全部的文件系統,如GFS,HDFS,FASTFS等,採用的方式都相似raid1+0。再擴展一點,其實全部的有狀態kv存儲,都是一個raid1+0..也就是先數據複製,再數據切分。

雖然原理徹底相同,可是Raid的實現方式有很是多種形式,下面讓我來作個概要性的介紹

一種模式是在單臺計算機內部實現raid。爲了可以對raid的實現有更深刻的理解,咱們還須要來回顧一下計算機的基本體系結構。

(圖片來自網絡)

195149459.jpg

從上面的圖中可以看到兩個關鍵的設備,南橋和北橋,他們的主要都用來處理cpu與其餘設備之間的io操做,差異在於北橋由於距離cpu比較近,因此主要面向一些高速設備,好比內存和pci-e,可以提供更低延遲和更高的吞吐量。而南橋則主要負責與一些慢速設備的連接工做。磁盤麼就像老牛拉破車,因而就必然被分配到了慢速設備的後面。

在開始的時候,咱們主要使用的磁盤接口就是上圖中的IDE總線,但隨着技術的逐漸發展,在一臺機器上僅僅只支持兩塊硬盤的IDE已經明顯的不可以知足平常要求了,因而就出現了後續的幾套新的協議,SCSI,ATA,SATAetc,這些協議的位置都是磁盤讀寫控制協議的一種,主要差異在於可以達到的理論速度值不同,支持的協議也由於不一樣廠商的小農意識有意無心的設計的有那麼點兒不兼容(其實這就是市場經濟的體現~哈哈)。

Raid的實現方法能夠不少樣,不過大部分狀況下就是一層decorator,接在ide/ata/sata/scsi等協議層的後面。

而後,這裏會有一個很重要的問題須要解決了,就是傳說中的單機數據複製CAP問題,因此藉此機會就來詳細的作個闡述。

固然,用後面產生的CAP這個概念來闡述單機數據複製的問題,這個方式確定會有點彆扭,不過其實他們都描述了同一個問題,而只有一個條件發生了變化。理解清楚這個變化的條件,對於理解整個問題會有很大的幫助。咱們在未來會在無數的地方不斷地從各類不一樣的角度來闡述這個問題的:

先來描述一下問題:若是想要數據更安全,並儘量提升數據的可用性,一個比較可行的方法就是把一份數據多存幾份。那麼問題就來了,如何可以保證一組有序數據(Data0,Data1,Data2…DataN)可以以最低的延遲在N個磁盤上同時成功呢?沒錯!就是高性能原子性操做問題,咱們又不得不面對原子性這頭怪獸了!

我來嘗試作一個分析:首先,以N個磁盤爲前提,串行的按照磁盤1,磁盤2,磁盤3..磁盤N這個順序寫入數據是確定不行了,不然得慢死,必定要可以並行。

一種合理的並行策略通常來講是這樣進行的:取第一個數據Data0,並行的發送給全部磁盤進行寫入並等待,當全部磁盤反饋寫入成功後,標記Data0已經被寫成功了,而後取Data1,並行的發送給全部磁盤進行寫入並等待,當全部磁盤反饋寫入成功後,標記Data1已經被寫成功了。…而後取DataN重複操做。

這裏有一個很是重要的操做要提醒你們注意:」標記Data已經被寫成功了」,這步操做是不可以省略的,並且也不能丟失!讓咱們來看看若是省略或丟失了會有什麼。

由於從可見性要求來講,沒有被標記爲所有寫成功的數據是不可以被讀取到的,由於可能有些磁盤寫成功了,而有些則沒有。所以必須儘量快的對已經所有寫成功的記錄進行標記。

而若是丟失,則意味着數據丟失,那麼RAID就失效了。

這就是多塊磁盤同時並行寫時候面臨的問題。是否是跟gfs/hdfs面臨的問題同樣?哈哈,原本gfs/hdfs就是在「借鑑」磁盤的raid策略嘛。

既然這個寫成功的log這麼重要,還丟不得,而且每次讀還都須要用到,那但是個寶,得多來幾份存着。等一下,這個log應該被存在哪裏?raid在作的事情自己不就是爲了讓數據可以寫到多個地方麼?若是這個log也要被儘量快的寫到多個地方,那麼保證寫log到多份的那個log’應該怎麼保證安全呢?保證log’寫到多份的那個log’’應該怎麼保證安全呢?因而咱們就進入到了無窮倒退的悖論裏面去了。這其實也是CAP中必然面臨的問題~

必須打破循環!因而,單機raid利用了一個取巧的方式來解決問題:單點的raid卡,內存,ssd和電池。

由於raid卡是個單點的存儲,因此他只須要把數據的log保存在本地的內存中就會返回成功,那麼下一個問題就來了,內存是易失性存儲啊,外一斷電數據丟了怎麼辦?這時候就要靠ssd和電池來拯救世界了~電池會給raid卡供電,讓raid卡可以把還在內存中的數據謄寫到ssd裏面。

沒錯,不太酷,但能工做。並且也很巧妙的就解決了CAP的問題。你問:這不是解決吧,raid卡是單點啊。

沒錯,確實是單點,不過這個單點由於只使用內存和簡單的邏輯控制器,出現異常的機率要遠遠小於磁盤出現問題的機率。所以,大部分人在機器的運維生涯中應該是見不到raid卡壞掉的。

第二種實現,我也簡單說說,其實也很好理解,就是放在外面獨立成爲一臺新的機器。

單個刀片就算是再能裝,6塊到8塊盤就已經會讓空間捉襟見肘了,個人cpu運算能力超強,但磁盤太慢,6塊盤遠遠趕不上cpu的運算速度增加。那麼有沒有其餘方式可以用更多磁盤組織到一塊兒的方式呢?

有需求天然就有市場,盤櫃就進入了你們的視線:

195235826.jpg

(圖片來自網絡,特地找了一個看不見廠家標識的XD)其實盤櫃能夠擴展到很大,像個小房子hoho..

他的核心原理跟咱們上面提到的單機raid其實徹底同樣,也是由一個單點的raid路由策略模塊和一大堆磁盤組成的陣列一致,同時,由於磁盤被拿到了原來機器的外面,原來用於內部數據傳輸的傳輸協議由於缺乏遠程機器地址類的信息,比較難以解決在跨機器的網絡中進行數據傳輸的問題,所以就產生了一些新的網絡傳輸協議。這就是基於光纖的FibreChannel,將scsi/sata嫁接上ip協議的協議嫁接派和後來產生的infiniband。

上面的這些協議,都有一些存儲廠商在背後進行支持,但本質沒變,與tcp/ip地址要作的事情同樣,須要在傳輸的包內加上對端地址信息(相似ip),而後再加一層封裝來標記和分割數據包(tcp),從而讓數據能夠被傳遞到遵循相同封裝協議的其餘機器上。但這裏不擴展這些協議的設計理念和市場佔有率的不一樣,由於目前還沒人能取得絕對盛世,感興趣的讀者能夠自行查閱相關資料。

通常來講,複製和切分只須要作一次,不必在全部邏輯層都作這麼個事情,減小層次就能夠直接減小軟件的複雜度。目前,在gfs/hdfs裏面都存在着這樣的冗餘浪費,由於上層邏輯層作了partitionreplication,下層若是再使用raid,等於屢次partitionreplication,邏輯層次過多,會下降總體性能和磁盤利用率。所以目前在一些互聯網企業中,工程師們也可能會選擇的方式就是完全放棄傳統raid,使用裸設備,而所有使用上層邏輯複製和切分。

相關文章
相關標籤/搜索