數據存儲之七種RAID淺析

物理 技術 cpp軟件架構獅 2018-12-15

RAID

前面我們介紹了磁盤的基本原理,我們知道一塊磁盤的容量和速度是有限的,對於一些應用來說,可能需要幾個TB的大小的來存放數據,我們必須要製造更大單盤容量的磁盤嗎?實際上,可以使用多塊磁盤並行起來解決這個問題,這就是RAID技術。

RAID:獨立的磁盤組成具有冗餘特性的陣列。Redundant Array of Independent Disks

數據存儲之七種RAID淺析

七種RAID

RAID 0

實現RAID 0 有兩種方式,一種是非條帶化的模式,一種是條帶化的模式。

對於非條帶化的模式:

RAID 0 : 一塊磁盤寫滿了,就往另一塊上寫, 一次IO只用到一塊磁盤,對整個系統來說容量增大了。

因為寫滿一塊物理盤以後再寫另一塊盤。對寫IO沒有任何優化,但是對讀IO能提高一定的併發IO讀機率。

我們希望可以這樣,同時向兩塊磁盤進行寫。我們可以把要寫的IO塊進行編號,1、2、3……100等,然後在$t_1$時刻,磁盤A和磁盤B同時寫入1、3兩塊,然後$t_2$時刻,同時寫入2、4塊,依次類推。

這樣就可以實現併發寫IO呢。接下來就是如何來進行塊的劃分的問題了。

其實磁盤已經經過低級格式化了,也就是劃分為若干的扇區,但是扇區只有512B大小,這麼小的粒度太消耗性能。所以我們要重新劃分磁盤,而且又不能拋棄原有的扇區。

最直接的想法就是若干個扇區組成一個Data block,比如由4個扇區組成一個塊(block)

  • data Block:N倍個扇區大小的容量,Block只有在一個Segment中是物理連續的,邏輯連續就需要跨物理磁盤。

下圖是引入了分割思想以後的硬盤,

數據存儲之七種RAID淺析

  • 不同磁盤的相同偏移處的塊組成成了Stripe,也就是條帶,Stripee
  • Segment:一個Stripee所佔用的單塊磁盤上的區域。

那麼條帶深度和條帶長度指的就是

  • 每個Segment包含的塊或者扇區的數量稱為條帶深度
  • 條帶長度:一Stripee橫跨過的扇區或者塊的個數或者字節容量。
數據存儲之七種RAID淺析

總結

數據存儲之七種RAID淺析

這就是所謂的條帶化,它是對磁盤邏輯上的劃分,相當於在磁盤上加了一個中間層而已

這樣對於一個大塊的數據,可以以條帶為單位進行寫入,也就是數據被分為了多塊寫入了4塊硬盤。而不是向之前一樣順序的寫入一個硬盤裡面

RAID 0要提升性能,條帶要做得越小越好。因為若是條帶深度容量大於寫入的數據的長度,這段數據將會落到同一個segment中,相當於本次IO只能從一塊硬盤中讀取。

但是條帶太小,併發IO機率降低。因為如果條帶太小,每次IO一定會佔用大部分物理盤,隊列中的IO只能等待IO結束後才使用物理盤。

總之,參與RAID0 的物理盤會組成一個邏輯上連續,物理上也連續的虛擬磁盤。控制器對虛擬磁盤發出的指令,被RAID控制器轉換為真實磁盤IO,再返回主機磁盤控制器,經過控制器在cache中的組合,再提交給主機控制器。

RAID 0有非常明顯的缺點,沒有任何的備份,所以任何一塊硬盤損壞均會造成數據丟失。

數據存儲之七種RAID淺析

RAID 1

RAID 0 最大的缺點是沒有備份盤。RAID 1 進行了改正。他採用了一塊用於正常使用,另一塊作為影子盤存在。

也就是寫數據的時候,會寫兩份。所以寫的時候的速度並不快,而且可用容量實際上就只有一塊盤,空間浪費很嚴重。

數據存儲之七種RAID淺析

RAID 2

RAID 0 速度快,但是沒有備份,RAID 1 有備份,但是可用容量太少。

RAID 2 的改進在於引入了校驗盤的概念。當數據損壞的時候,可以根據校驗盤的數字,恢復原來磁盤上的數字。

RAID 2採用“漢明碼”來進行校驗,這種糾錯技術算法比較複雜,而且需要加入大量的校驗位,比如4位數據編碼,會加入3位校驗位。

同時數據存儲的時候,會把每個IO下的數據以位為單位強行打散在每個磁盤。

磁盤最小的IO單位是512B,如何寫入1bit?上層IO可以先經過文件系統,然後通過磁盤控制器驅動向磁盤發出IO。最終IO大小都是N倍的扇區。即使只要幾個字節,也需要讀出整個扇區

所以每次必須所有聯動起來一次進行存儲,如果各磁盤的主軸沒有同步,則先讀出數據的硬盤需要等待。所以開銷也比較大。

正因為此,目前RAID2已經不怎麼使用了。

數據存儲之七種RAID淺析

RAID 3

RAID 3引入了一種新的校驗算法,可以將數據盤中的每個位做XOR運算,然後將結果寫入到校驗盤的對應位置。任何一個扇區損壞,可以通過剩餘的位和校驗位一起進行XOR運算來獲得丟失的位。

同時RAID 3 把條帶長度設置為4K字節,因為一般文件系統剛好是4KB一個塊,所以如果用4塊數據盤,條帶深度為1KB,也就是2個扇區。這樣,可以保證連續寫的時候,以條帶為單位寫入,提高並行度

所以RAID 2和RAID 3的每次IO都會牽動所有磁盤並行讀寫,每次只能做一個IO,不適合多IO併發的情況。

也說RAID 2和RAID 3適合IO塊大的情況

一般來說,RAID 3 的條帶長度= 文件系統的大小,就不會產生條帶不對齊的現象。減少碎片。

關於RAID 3的校驗盤有沒有瓶頸的問題

若一個邏輯塊是4KB,4+1塊盤,文件系統下發一個IO至少是以一個邏輯塊為單位的。所以文件系統下發一次IO,不管多大都是跨越了所有數據盤的。

  1. 連續
  2. 連續讀:尋道時間忽略,IOPS受限於傳輸時間,因為RAID 3 是把一個IO分散到N個數據盤上,即傳輸時間是單盤的1/N,即持續讀的性能是單盤的N倍。
  3. 持續寫:分擔到N個盤,也是單盤的1/N。因為每次IO寫,物理磁盤上的所有分塊都需要更新,包括校驗塊,就沒有瓶頸和熱點的區別。
  4. 隨機
  5. 隨機讀寫:多個盤同時換道,所以性能相對於單盤沒有提升。而且有的磁盤不是嚴格主軸同步的,會拖累。
  6. 併發IO:一次IO必定會佔用所有的盤,其他的盤必須等待,所以根本不能併發IO

總結起來就是RAID 3適合於連續大塊的讀和寫,不適合於隨機IO和併發IO。

數據存儲之七種RAID淺析

RAID 4

  • RAID 0屬於激進派,為了速度,根本不要備份。
  • RAID 1屬於保守派,需要浪費一個鏡像的容量。
  • RAID 2和RAID 3 屬於中庸派。

RAID 2和RAID 3已經解決了校驗盤的問題,避免了一塊盤損壞數據全丟失的問題。但是對於無法得到併發IO的問題還沒解決。

RAID 2和RAID 3的思想是讓所有數據盤都參與起來。對於隨機小塊讀寫,每秒產生的IO數目很大,但是每個IO的請求數據長度卻很短,如果所有磁盤同一時刻都在處理一個IO,得不償失。不如讓這個IO直接寫入一塊磁盤,其他的做其他的IO。

方法有:

  • 可以增加條帶深度,一個IO比條帶深度小,所以可以完全被一個磁盤所處理。直接寫入了一塊磁盤的Segment中。
  • 增大數據的隨機分佈性,不要連續在一塊磁盤分佈,要和其他IO所用的磁盤不一樣。

所以 RAID 4 的改進是增加了條帶深度,RAID 4相對於RAID 3 性能幾乎沒有提升。但是至少讓它可以進行併發IO

數據存儲之七種RAID淺析

RAID 5

RAID 4相對於RAID 3 性能幾乎沒有提升。而且因為每個IO必定會佔用校驗盤, 所以校驗盤成為了瓶頸,而且是熱點盤,容易壞。

這樣看來RAID 4其實有些不倫不類。

RAID 4的關鍵錯誤在於忽略了校驗盤,每個IO不管怎麼樣都會讀寫校驗盤的。

RAID 5的改進在於將校驗盤把校驗盤分割開,依附於數據盤。把條帶做得很大,保證每次IO不會佔滿整個條帶。

2塊盤的RAID 5系統,對於寫操作來說不能併發IO,因為訪問一塊盤的時候,校驗信息一定在另一塊盤中。同理,3塊盤也不能

所以最低可以併發IO的RAID 5 需要4塊盤,此時最多可以併發兩個IO,併發的機率是0.0322。

RAID 5 磁盤數量越多,併發的機率越大。

RAID 5與RAID 0相比

RAID 5 是繼RAID 0 , RAID 1以後又一個可以實現併發IO的陣式,但是比RAID 1更划算,比RAID 0更安全。

  • 容量方面:隨著磁盤數增加,RAID5浪費的是N分之一,而RAID永遠是二分之一。
  • 性能方便:RAID 5和RAID 0都是使用條帶來提升性能,但是RAID 6又克服了RAID 0的無保護。

RAID 5與RAID 3相比

RAID 5的連續讀寫不如RAID 3,因為RAID 3 的條帶深度很小,每次IO可以牽動所有的磁盤為之服務。

RAID 5 每次IO一般只使用一塊數據盤,先放滿一個Segment,再去下一個磁盤的Segment存放,塊編號是橫向進行。

所以RAID 3在IO SIZE大的時候高性能,RAID 5在隨機IOPS大時有高性能。

RAID 5的缺點

RAID 5的缺點是寫懲罰:寫性能差,因為每寫一扇區就要產生其校驗扇區,一併寫入校驗盤。

新數據過來,控制器立即讀待更新扇區的數據,然後讀此條帶的校驗數據根據公式新數據的校驗數據 = (老數據 EOR 新數據) EOR 老校驗數據 得到新校驗數據,然後寫到磁盤中。

所以每次寫入都需要更新校驗盤。浪費3個其他動作,也就是讀老數據,讀老校驗數據,然後寫新數據和校驗數據,浪費了除了“寫新數據”之外的操作。

總結:隨機併發IO和寫性能二者只能取其一。

RAID 5EE

RAID 5的缺點是不能壞兩塊盤,因為如果一塊盤壞了,可以用其他數據校驗出。

可在陣式中增加熱備盤,不參與組陣,只有在損壞的時候立刻頂替,其他盤恢復數據。如果此時有請求此盤的IO,則其他盤暫代。

  • RAID 5E :讓陣中其他盤都從各自的領地裡面保留出一塊空間,作為熱備盤。
  • RAID 5EE:熱備盤融合到數據盤中,如校驗盤一般。
數據存儲之七種RAID淺析

RAID 6

同樣RAID 6也是為了解決RAID 5只能壞一塊盤的問題。

如果壞了兩塊盤,相當於存在兩個未知數,要求解兩個未知數據,一定需要另外一個不相關的等式來求解。

所以使用兩套算法各自算出一個等式,分別放在兩塊校驗盤中。

優點是更安全,缺點是寫懲罰更大。

數據存儲之七種RAID淺析

RAID 卡

軟件RAID運行於操作系統底層,將SCSI 或者IDE控制器提交上來的物理磁盤,虛擬成虛擬磁盤,再提交給卷管理程序。但是

軟件RAID :

  • 佔用內存空間
  • 佔用CPU
  • 無法把操作系統盤做成RAID :如果操作系統損壞了,就無法運行。

既然軟件這麼多缺點,所以人們謀求用硬件來實現RAID的方法。

RAID卡就是利用獨立硬件來實現RAID功能的方法。

一般在SCSI卡上增加了額外的芯片用於RAID功能。

數據存儲之七種RAID淺析

SCSI RAID卡上一定要包含SCSI控制器,因為其後端連接依然是SCSI的物理磁盤。

操作系統如何看待邏輯磁盤

RAID控制器向OS提交的是虛擬邏輯盤,而非所有的物理磁盤。每個邏輯盤對OS來說都是一塊單獨的磁盤。

比如安裝了2塊IDE磁盤和4塊SCSI磁盤,IDE直接連接到IDE接口,SCSI連接到PCI接口的SCSI卡上。

若無RAID,可以看到6塊硬盤。

可以通過RAID程序把兩塊IDE做成RAID 0 , 變成了2*80G = 160G的磁盤。

4塊SCSI磁盤做RAID 5,相當於3塊盤的容量,即216GB。

所以磁盤管理器其實可以看到兩塊硬盤,可以格式化為NTFS等文件格式。

與分區對比

與分區不同,分區是OS在物理磁盤上做再次劃分。而RAID 卡提供給OS的是任何時候是一塊或者幾塊的邏輯盤,也就是OS認為的物理磁盤。

OS在磁盤上還可以進行分區,格式化。

LUN:條帶化以後,RAID程序操控SCSI控制器向OS層的驅動程序代碼提交虛擬化之後的虛擬盤

RAID 控制器如何管理邏輯磁盤

RAID 卡可以對邏輯磁盤進行再次的劃分,既然要劃分,必須對某塊磁盤的某個區域劃分給那塊邏輯盤用心裡有數,所以有必要在每塊磁盤保留一個區域,記錄劃分信息、RAID類型以及組內的磁盤信息。這種統一的RAID信息格式:DDF 。

RAID卡可針對總線上某幾塊磁盤做一種RAID類型,然後針對另幾塊磁盤做另一種RAID類型。

一種RAID類型包含的磁盤共同組成了一個RAID GROUP ,簡稱RG。

邏輯盤就是從RG劃分出來的,原則上不能跨RG來劃分,因為RG的RAID類型不一樣,性能就不一樣。

RAID 卡上的內存

RAID卡上的內存,有數據緩存和代碼執行內存的作用

  • RAID 控制器和磁盤通道控制器之間需要一個緩存來適配。適配不同速率的通信
  • 緩存數據IO:緩存隊列,執行或者優化合並。

RAID卡的緩存

對於上層的寫IO,有兩種手段來處理;

  • Write Back模式:將上層發來的數據保存在緩存中之後,立即通知主機IO完成,執行下一個IO。實際上此時數據還在緩存中,沒有寫入磁盤。RAID卡在空閒的時候,一條一條或者批量寫入磁盤,其實是欺騙了主機。如果意外,數據丟失,上下數據不一致。需要使用電池來保護緩存。
  • Write Through模式:只有在寫入到磁盤之後才會通知主機,但是緩存的提速作用沒有優勢。緩衝作用依舊生效。

對於讀緩存

  • 有一種算法叫PreFetch:預取,讀緩存。其實就是認為主機下一次IO,有很大的機率是讀取到所在磁盤位置的相鄰數據。所以在主機還沒發出讀請求的時候,就先把相鄰的數據讀到緩存中。對大文件應用很適用。
  • 還有一種緩存算法:假設主機的下一次IO可能還會讀取上一次讀過的數據。讀了一段數據到緩存之後,如果數據被主機的寫IO更改了,不會立即寫入磁盤,而是留在緩存中。等到主機有一段時間不用了,則寫入磁盤中。

中高端的RAID卡一般有256M的RAM作為緩存。

數據存儲之七種RAID淺析

卷管理層

到目前為止,我們已經可以通過RAID卡對外呈現一個一個的邏輯盤了,但是邏輯盤存在一個非常大的問題就是不夠靈活。

如果一開始就劃分一個100G的邏輯盤,如果數據盛不下了,此時把其他磁盤上未使用的空間挪一部分到邏輯盤上。

但是從RAID卡里面增加邏輯盤容量很費功夫。即使實現了,上層文件系統也無法立刻感知到。所以對要求不間斷服務的服務器不適用。

歸根結底,因為RAID控制器是由硬件來實現RAID的,所以操作起來不靈活,如果OS把RAID控制器提交上來的邏輯盤,加以組織和再分配。就非常靈活,其實就是加一層靈活的管理層。

卷管理層:Volume Manager,LDM(邏輯磁盤管理)

LVM開始是Linux系統上的一種實現,後來移植到AIX和HPUX等系統

  • PV:OS識別的物理磁盤(或者RAID提交的),類似一塊麵團
  • VG:多個PV放到一個VG裡面,VG(volume group)卷組。VG會將所有的PV首尾相連,組成邏輯上連續編址的存儲池。
  • PP:物理區塊,Physical Partition,在邏輯上將一個VG分割為連續的小塊。(把一大盆面掰成大小相等的無數塊小面塊)。LVM會記錄PP的大小和序號的偏移。如果PV本身是經過RAID控制器虛擬化而成的LUN,扇區可能是位於若干條帶中,物理上不一定連續。
  • LP:邏輯區塊,可以對應一個PP,也可以對應多個PP,前者對應前後沒有什麼區別。後者又分為兩種情況。
  • 多個PP組成一個大LP,像RAID 0
  • 一個LP對應幾份PP,這幾份PP每一份內容一樣,類似RAID1。然後用一個LP來代表他們,往這個LP寫數據,也就是寫到了這個LP對應的幾份PP中。
  • LV:若干LP組成LV (邏輯卷),也就是LVM所提供最終可以用來存儲數據的單位。生成的邏輯卷,在主機看來還是普通的磁盤,可以進行分區和格式化。

大小可以隨時變更,也不需要重啟OS。前提是還有備用的PP。

操作很簡單:創建PV,加入VG ,創建LV,格式化,隨便擴展。

最大的好處:生成的LV可以跨越RAID卡提交給OS的物理或者邏輯盤。

數據存儲之七種RAID淺析

卷管理軟件的實現

那麼卷管理軟件到底怎麼實現的呢?

LVM會記錄某塊物理盤的名稱、容量,誰是誰,從哪裡到哪裡是屬於這塊盤的,地址是多少等。這些信息記錄在磁盤某個區域,LVM中這個區域叫VGDA

LVM可以通過讀取每塊物理磁盤上的這個區域來獲得LVM的配置信息,比如PP大小,初始偏移,PV的數量,排列順序和映射關係等。

LVM初始化的時候讀取信息,然後在緩存中生成映射公式,從而完成LV的掛載。如果此時上層來一個IO,LVM就需要通過緩存中的映射關係判斷地址對應到實際物理磁盤的哪個地址。然後通過磁盤控制器驅動直接給這個地址發數據。這個地址被RAID控制器接收到了,還需要做一次轉換。

總之:卷管理軟件就是運行在OS磁盤控制器驅動程序之上的軟件,作用是實現RAID卡硬件管理磁盤空間所實現不了的靈活功能,比如隨時擴容。

磁盤在VM這一層處理之後,稱為卷更為恰當。因為磁盤控制器看待磁盤,就是盤片+磁頭,而卷管理軟件看待磁盤,會認為它是一個線性的大倉庫,而不管倉庫用什麼方式存儲。

倉庫的每個房間都有一個地址(LBA),VM只需要知道一共有多少,讓庫管員(磁盤控制器驅動)從某段地址(LBA地址段)存取貨物(數據),那麼庫管員立即操控機器(磁盤控制器)來各個房間取貨物(數據),這就是VM的作用。

** 即從底到上依次是:物理磁盤、磁盤控制器、IO總線、總線驅動、磁盤控制器驅動、卷管理程序**

在底層磁盤擴容之後,磁盤控制器驅動程序會通知VM已經增大了多少容量

擴大、收縮卷需要其上的文件系統來配合。

MBR 和VGDA

分區管理是最簡單的卷管理方式,分區就是將一個磁盤抽象為一個倉庫,然後將倉庫劃分為一庫區、二庫區等。

分區管理和卷管理最大的不同在於,分區管理只能針對單個磁盤進行劃分,而不能將磁盤進行合併再劃分。

分區信息保存在磁盤上,位於LBA1這個扇區,又稱為MBR也就是主引導記錄。

BIOS代碼都是固定的,所以必定要執行MBR上的代碼,新出來的規範EFI可以靈活定製從那個磁盤的哪個扇區啟動,

MBR除了包含啟動指令代碼,還包含了分區表。啟動的時候,程序會跳轉到活動分區去讀取代碼做OS啟動。所以必須有一個活動分區。

卷管理軟件在劃分了邏輯卷以後同樣需要記錄卷怎麼劃分的,使用一種叫VGDA的數據結構。

高級VM沒有拋棄MBR,而是在此基礎上,增加了類似VGDA的這樣的數據結構來動態管理磁盤。

文件系統

文件系統相當於理貨員,與庫管員一起完成管理糧庫的工作。

應用程序只需要告訴文件系統需要放多少的數據或者讀多少數據,而文件系統不需要關心倉庫到底在那裡,放到那個房間。

文件系統需要將數據存放在那裡記錄下來。

如果存取的數據量大,每次記錄的數很大。將8個房間劃分為一個邏輯房間,稱作“簇”

數據如果找連續的簇進行存放,則還必須花時間把整理倉庫,整理出連續的空間來,所以不如在描述數據存放的方式,比如數據 10000 簇2,6,18,這樣就可以解決空間浪費的問題,而且不需要經常整理庫。

但是這樣又存在一個問題,數據描述的方式變得長短不一,可以為了簡化處理,需要給一個定長的描述。比如數據 100000 首簇1,然後在在首簇做一個標記,寫明下一個簇是多少號,然後找到下一個簇,根據簇的路標,到下下個簇進行取貨,依此類推。

如果要尋找空的簇,只需要找格子上沒有寫字的簇即可。

總結一下,

描述貨物的三字段:名稱、數量、存放的第一個簇。

進一步優化:

貨物雖然有可能存放在不連續的簇中,但是這些簇往往也是局部連續的。所以如果是一段一段的找而不是一簇一簇的找,會節約時間。比如簇段1~3,簇段5~7等等。

所以記錄數據存放信息的本子就是元數據,也就是用來描述數據怎麼組織的數據。

如果記錄本丟失,縱然貨物無損,也無法取出,因為無法判斷貨物的組織結構了。

文件系統的IO方式

IO Manager是OS內核中專門來管理IO的模塊,可以協調文件系統、磁盤驅動的運作,流程如下

  • 應用調用文件系統接口
  • IO Manager把請求發送給文件系統模塊
  • 文件系統映射為卷的LBA
  • 文件系統向IO Manager調用卷管理軟件模塊的接口
  • 卷管理軟件將卷對應的LBA反映為實際的LBA,並請求調用磁盤控制器驅動程序。
  • IO Manager向磁盤控制器驅動程序請求將對應的LBA段從內存寫入到物理磁盤。

文件系統IO:

  • 同步IO:進程調用了IO以後,必須等到下位程序返回信號,否則一直等待,被掛起。
  • 如果下位程序沒有得到數據
  • 阻塞IO:下位程序等待自己的下位程序返回數據。
  • 非阻塞IO:通知上位程序數據沒收到。
  • 異步IO:請求發出以後,執行本線程的後續代碼,直到時間片到或者被掛起。這樣應用程序的響應速度不會受IO瓶頸的影響,即使這個IO很長時間沒有完成。

異步IO和非阻塞IO另一個好處:文件系統不需要等待及時返回數據,可以對上次的IO進行優化排隊。

Direct IO:文件系統有自己的緩存機制,數據庫也有緩存,IO發出之前已經經過自己的優化了,如果又在文件系統層面再優化一次,多次一舉。使用Direct IO以後IO請求、數據請求以及回送數據不被文件系統緩存,直接進入應用程序的緩存中,可以提升性能。此外,在系統路徑上任何一處引入了緩存,若採用write back模式,都存在數據一致性的問題,因為Direct IO繞過了文件系統的緩存,降低了數據不一致性。

數據存儲之七種RAID淺析

參考

《大話存儲》

相關推薦

推薦中...