深刻分析各類raid級別及其速度變化比較

本文從低層原理上,深刻透析了目前存在的7種raid模式的組成原理,結構,並深入分析了各類級別相對於單盤IO速率的變化。算法

Raid0數據庫

Raid0是這樣一種模式:咱們拿5塊盤的raid0爲例子。緩存

clip_image002clip_image004

上圖中5個豎條,分別表明5個磁盤上的一個extent,也就是豎條的意思,每一個磁盤被邏輯的劃分爲N個這種extent。而後再在磁盤相同偏移的extent上,橫向邏輯分割,造成strip,一個strip橫跨過的extent個數,稱爲strip lenth,而一個strip和一個extent交叉帶,稱爲一個segment,一個segment中所包含的data block個數,稱爲strip depth。Data block,能夠是N倍個扇區大小的容量,應該能夠調節,或者不可調,隨控制器而定。併發

Raid0即是將一系列連續編號的data block,分佈到多個物理磁盤上,擴散IO,提升性能。其分佈的方式,如圖所示:這個例子中,條帶深度爲4,則0、一、二、3號data block,被放置到第一個條帶的第一個segment中,而後四、五、六、7號block,放置到第一個條帶的第二個segment中,依此類推,條帶1放滿後,繼續放條帶2。這種特性,稱爲「局部連續」,由於block只有在一個segment中是物理連續的,邏輯連續,就須要跨物理磁盤了。app

對外來講,參與造成raid0的各個物理盤,會組成一個邏輯上連續,物理上也連續的虛擬磁盤。磁盤控制器對這個虛擬磁盤發出的指令,都被raid控制器截獲,分析,根據block映射關係公式,轉換成對組成raid0的各個物理盤的真實物理IO請求指令,收集或寫入數據以後,再提交給主機磁盤控制器。分佈式

Rai0還有另外一種非條帶化模式,即寫滿其中一塊物理磁盤以後,再接着寫另外一塊,直到全部組成磁盤所有寫滿。這種模式,對IO寫沒有任何優化,可是對IO讀,能提升必定的併發IO讀概率。ide

在進一步講述raid0和其餘raid級別以前,咱們先來看一下IO的種類。IO按照能夠分爲:讀/寫IO,大/小塊IO,連續/隨機IO,順序/併發IO。下面咱們來分別介紹每一種IO。高併發

讀/寫IO,這個就不用多說了,讀IO,就是發指令,從磁盤讀取某段扇區的內容。指令通常是通知磁盤開始扇區位置,而後給出須要從這個初始扇區日後讀取的連續扇區個數,同時給出動做是讀,仍是寫。磁盤收到這條指令,就會按照指令的要求,讀或者寫數據。控制器發出的這種指令+數據,就是一次IO,讀或者寫。性能

大/小塊IO,指控制器的指令中給出的連續讀取扇區數目的多少,若是數目很大,好比128,64等等,就應該算是大塊IO,若是很小,好比1,4,8等等,就應該算是小塊IO,大塊和小塊之間,沒有明確的界限。優化

連續/隨機IO,連續和隨機,是指本次IO給出的初始扇區地址,和上一次IO的結束扇區地址,是否是徹底連續的,或者相隔很少的,若是是,則本次IO應該算是一個連續IO,若是相差太大,則算一次隨機IO。連續IO,由於本次初始扇區和上次結束扇區相隔很近,則磁頭幾乎不用換道或換道時間極短;若是相差太大,則磁頭須要很長的換道時間,若是隨機IO不少,致使磁頭不停換道,效率大大降底。

順序/併發IO,這個的意思是,磁盤控制器每一次對磁盤組發出的指令套(指完成一個事物所須要的指令或者數據),是一條仍是多條。若是是一條,則控制器緩存中的IO隊列,只能一個一個的來,此時是順序IO;若是控制器能夠同時對磁盤組中的多塊磁盤,同時發出指令套,則每次就能夠執行多個IO,此時就是併發IO模式。併發IO模式提升了效率和速度。

說完了4種IO模式,咱們再來講2個概念:

IO併發概率。單盤,IO併發概率爲0,由於一塊磁盤同時只能夠進行一次IO。對於raid0,2塊盤狀況下,條帶深度比較大的時候(條帶過小不能併發IO,下面會講到),併發2個IO的概率爲1/2。其餘狀況請自行運算。

IOPS。一個IO所用的時間=尋道時間+數據傳輸時間。IOPS=IO併發係數/(尋道時間+數據傳輸時間),因爲尋道時間相對傳輸時間,大幾個數量級,因此影響IOPS的關鍵因素,就是降底尋道時間,而在連續IO的狀況下,尋道時間很短,僅在換磁道時候須要尋道。在這個前提下,傳輸時間越少,IOPS就越高。

每秒IO吞吐量。顯然,每秒IO吞吐量=IOPS乘以平均IO SIZE。Io size越大,IOPS越高,每秒IO吞吐量就越高。設磁頭每秒讀寫數據速度爲V,V爲定值。則IOPS=IO併發係數/(尋道時間+IO SIZE/V,代入,得每秒IO吞吐量=IO併發係數乘IO SIZE乘V/(V乘尋道時間+IO SIZE。咱們能夠看出影響每秒IO吞吐量的最大因素,就是IO SIZE和尋道時間,IO SIZE越大,尋道時間越小,吞吐量越高。相比能顯著影響IOPS的因素,只有一個,就是尋道時間。

下面咱們來具體分析一個從上到下訪問raid0磁盤的過程。假如某一時刻,主機控制器發出指令:讀取 初始扇區10000 長度128。Raid控制器接受到這個指令以後,當即進行計算,根據對應公式(這個公式是raid控制器在作邏輯條帶化的時候制定的)算出10000號扇區所對應的物理磁盤的扇區號,而後依次計算出邏輯上連續的下128個扇區所在物理磁盤的扇區號,以後,分別向對應這些扇區的磁盤,再次發出指令,此次是真實的讀取數據了,磁盤接受到指令,各自將數據提交給raid控制器,通過控制器在cache種的組合,再提交給主機控制器。

分析以上過程,咱們發現,若是這128個扇區,都落在同一個segment中的話,也就是說條帶深度容量大於128個扇區的容量(64K),則此次IO就只能真實的從這一塊物理盤上讀取,性能和單盤相比會減慢,由於沒有任何優化,反而還增長了raid控制器額外的計算開銷。因此要提高性能,讓一個IO儘可能擴散到多塊物理盤上,就要減少條帶深度,磁盤數量不變的條件下,也就是減少條帶大小strip size。讓這個IO的數據被控制器分割,同時放滿第一個segment、第二塊物理磁盤上的第二個segment。。。。。。。依此類推,這樣就能極大的佔用多塊物理盤。在這裏你們可能存在一個誤區,就是老是覺得控制器是先放滿第一個segment,再放滿第二個segment,實際上是同時進行的,由於控制器把每塊盤要寫入或者讀取的數據都計算好了,是同時進行的。因此,raid0要提高性能,條帶作的越小越好。可是這裏又一個矛盾出現了,就是條帶過小,致使併發IO概率降底,由於若是條帶過小,則每次IO必定會佔用大部分物理盤,而隊列中的IO就只能等待此次IO結束後才能使用物理盤。而條帶太大,又不能充分提升傳輸速度,這兩個是一對矛盾,按照需求來採用不一樣的方式。

咱們接着分析raid0相對於單盤的性能變化。根據以上總結出來的公式,能夠推得如下表格:

RAID0

IOPS

併發IO

順序IO

併發IO

順序IO

隨機IO

連續IO

隨機IO

連續IO

隨機IO

連續IO

隨機IO

連續IO

Io size/strip size較大

不支持

不支持

提高極小

提高了N乘係數倍

不支持

不支持

提高極小

提高了N乘係數倍

Io size/strip size較小

提高了(1+併發係數)倍

提高了(1+併發係數+係數)係數倍

提高極小

提高了係數倍

提高了(1+併發係數)倍

提高了(1+併發係數+係數)倍

提高極小

提高了係數倍

注:併發IO和IO size/strip size是一對矛盾,二者老是對立。N=組成raid0的磁盤數目。係數=io size/strip size和初始LBA地址所處的strip偏移綜合係數,大於等於1。併發係數=併發IO的數量

Raid1

Raid1是這樣一種模式,咱們拿2塊盤的例子來講明:

clip_image006 clip_image007

Raid1和raid0不一樣,raid0對數據沒有任何保護措施,每一個block都沒有備份或者校驗保護措施。Raid對虛擬邏輯盤上的每一個物理block,都在物理盤上有一份鏡像備份。也就是說數據有兩份。對於raid1的寫IO,速度不但沒有提高,並且有所降低,由於數據要同時向多塊物理盤寫,時間以最慢的你個爲準,由於是同步的。而對於raid1的讀IO請求,不但能夠併發,並且就算順序IO的時候,控制器也能夠象raid0同樣,從兩塊物理盤上同時讀數據,提高速度。Raid1沒有srip的概念。一樣咱們總結出一個表格:

RAID1

IOPS

併發IO

順序IO

併發IO

順序IO

隨機IO

連續IO

隨機IO

連續IO

隨機IO

連續IO

隨機IO

連續IO

提高N或者併發係數倍

提高N倍或者併發係數

提高極小

提高了N 倍

不支持

事物性IO可併發,提高併發係數倍

沒有提高

沒有提高

注:raid1沒有strip的概念。N=組成raid1鏡像物理盤的數目。

在讀、併發IO的模式下,因爲能夠併發N個IO,每一個IO佔用一個物理盤,這就至關於提高了N倍的IOPS。因爲每一個IO只獨佔了一個物理盤,因此速度相對於單盤並無改變,因此無論是隨機仍是順序IO,相對單盤都不變。

在讀、順序IO、隨機IO模式下,因爲IO不能併發,因此此時一個IO能夠同時讀取N個盤上的內容,可是是在隨機IO模式下,那麼尋道時間影響很大,縱使同時分塊讀取多個磁盤的內容,也架不住尋道時間的抵消,因此性能提高極小

在讀、順序IO、連續IO模式下,尋道時間影響到了最低,此時傳輸速率爲主要矛盾,同時讀取多塊磁盤的數據,時間減小爲1/N,因此性能提高了N倍。

寫IO的時候和讀IO狀況相同,就不作分析了。寫IO由於要同時向每塊磁盤寫入備份數據,因此不能併發IO,也不能分塊並行。可是若是控制器把優化算法作到極至的話,仍是能夠併發IO的,好比控制器從IO隊列中提取連續的多個IO,能夠將這些IO合併,併發寫入磁盤。前提這幾個IO必須是事物性的,也就是說LBA必須連續,否則不能做爲一個大的合併IO,並且和文件系統也有關係,文件系統碎片越少,併發概率越高。

Raid2

raid2是一種比較特殊的raid模式,他是一種專用raid,如今早已被淘汰。他的基本思想是,IO到來以後,控制器將數據分割開,在每塊物理磁盤讀或者寫1bit。這裏有個疑問,磁盤的最小IO單位是扇區,512字節,如何寫入1bit呢?其實這個寫入1bit,並不是只寫入1bit。咱們知道上層IO,能夠先通過文件系統,而後才經過磁盤控制器驅動來向磁盤發出IO,最終的IO大小,都是N倍的扇區,也就是Nx512字節,N大於等於1,不可能發生N小於1的狀況,即便你須要的數據只有幾個字節,那麼也一樣要讀出或者寫入整個扇區,也就是512字節。明白這個原則以後,咱們再來看一下raid2中所謂的「每一個磁盤寫1bit」是個什麼概念。IO最小單位爲扇區,512字節,咱們就拿一個4塊數據盤+3塊校驗盤的raid2系統給你們來講明一下。這個環境中,raid2的一個條帶大小是4bit(1bit乘4塊數據盤),而IO最小單位是一個扇區,那麼若是分別向每塊盤寫1bit,就須要分別向每塊盤寫一個扇區,每一個扇區只包含1bit有效數據,這顯然是很差的,由於太浪費空間,沒有意義。由於IO數據到來時,咱們拿如下IO請求爲例:寫入 初始扇區10000 長度1,這個IO目的是要向LBA10000寫入一個扇區的數據,也就是512字節。Raid2控制器接受到這512字節的數據以後,先將其放入cache,而後計算須要寫入的物理磁盤的信息,好比定位到物理扇區,分割數據成bit,而後一次性寫入物理磁盤扇區。也就是說第一塊物理盤,控制器會寫入本次IO數據的第一、五、九、1三、1七、21。。。。。。。。。。。等等位,第二塊物理盤會寫入二、六、十、1四、1八、22。。。。。。。。。。等等位,其餘兩塊物理盤一樣方式寫入。直到這樣將數據寫完。咱們能夠計算出來,這512字節的數據寫完以後,此時每塊物理盤只包含128字節的數據,也就是一個扇區的四分之一,那麼這個扇區剩餘的部分,就是空的。若是要利用起這部分空間,那麼等下次IO到來以後,控制器對數據進行bit分割,將要填入這些空白區域的數據,控制器將首先讀出原來的數據,而後和新數據合併以後,一併再寫回這個扇區,這樣作效率和速度都大打折扣。咱們能夠發現,其實raid2就是將本來連續的一個扇區的數據,以位爲單位,分割存放到不連續的多塊物理盤上,由於這樣能夠全組並行讀寫,提升性能。每一個物理磁盤扇區實際上是包含了N個扇區的「殘體」。那麼若是出現須要更新這個IO的4個扇區中某一個扇區的狀況,怎麼辦?這種狀況下,必須先讀出原來的數據,和新數據合併,而後在一併寫入。其實這種狀況出現的很是少。咱們知道上層IO的產生,通常是須要先通過os的文件系統,而後纔到磁盤控制器這一層的。因此磁盤控制器產生的IO,通常都是事務性的,也就是這個IO中的全部扇區,很大概率上對於上層文件系統來講,是一個完整的事務,因此不多會發生只針對這個事務中某一個原子進行讀寫的狀況。這樣的話,每次IO很大概率都會包含入這些邏輯上連續的扇區的,因此沒必要擔憂常常會發生那種狀況,即使發生了,控制器也只能按照那種低效率的作法來作,不過整體影響較小。可是若是隨機IO比較多,那麼這些IO初始LBA,頗有可能就會命中在一個兩個事務交接的扇區處,這種狀況,就致使速度和效率大大下降了。連續IO出現這種狀況的概率很是小了。

Raid2由於每次讀寫都須要全組磁盤聯動,因此爲了最大化其性能,最好保證每塊磁盤主軸同步,使得同一時刻每塊磁盤磁頭所處的扇區邏輯編號都一致,並存並取,達到最佳性能,若是不能同步,則會產生等待,影響速度。

基於raid2的並存並取的特色,raid2不能實現併發IO,由於每次IO都佔用了每塊物理磁盤。

Raid2的校驗盤對系統不產生瓶頸,可是產生延遲,由於多了計算校驗的動做。校驗位和數據位是一同並行寫入或者讀取的。Raid2採用海明碼來校驗數據,這種碼能夠判斷修復一位錯誤的數據,而且使用校驗盤的數量太多,4塊數據盤須要3塊校驗盤,可是隨着數據盤數量的增多,校驗盤所佔的比例會顯著減少。

Raid2和raid0有些不一樣,raid0不能保證每次IO都是多磁盤並行,由於raid0的分塊相對raid2以位爲單位來講是太大了,而raid2因爲她每次IO都保證是多磁盤並行,因此其數據傳輸率是單盤的N倍,爲了最好的利用這個特性,就須要將這個特性的主導地位體現出來,而根據IOPS=IO併發係數/(尋道時間+數據傳輸時間),尋道時間比數據傳輸時間大幾個數量級,因此爲了體現數據傳輸時間減小這個優勢,就必須避免尋道時間的影響,而避免其影響的最佳作法就是:儘可能產生連續IO而不是隨機IO,因此,raid2最適合連續IO的狀況。另外,根據每秒IO吞吐量=IO併發係數乘IO SIZE乘V/(V乘尋道時間+IO SIZE,若是將IO size也增大,則每秒IO吞吐量也將顯著提升。因此,raid2最適合的應用,就是:產生連續IO,大塊IO的狀況,不言而喻,文件服務,視頻流服務等等這些應用,適合raid2,不過,raid2的缺點太多,好比校驗盤數量多,算法複雜等等,它逐漸的被raid3替代了。

RAID2

IOPS

順序IO

順序IO

非事務性隨機IO

事務性隨機IO

連續IO

非事務性隨機IO

事務性隨機IO

連續IO

IO知足公式條件

提高極小

提高極小

提高N倍

性能下降

提高極小

提高N倍

注:N=數據盤數量。Raid2不能併發IO

Raid3

clip_image009

因爲raid2缺點比較多,好比非事務性IO對他的影響,校驗盤數量太多等等。Raid2的劣勢,就在於它的將數據以bit爲單位,分割,將本來物理連續的扇區,轉變成物理不連續,邏輯連續的,這樣就致使了它對非事務性IO的效率低下。爲了從根本上解決這個問題,raid3出現了。既然要從根本上解決這個問題,首先就是須要拋棄raid2對扇區進行分散的作法。Raid3保留了扇區的物理連續。Raid2將數據以bit爲單位分割,這樣爲了保證每次IO佔用所有磁盤的並行性。而raid3一樣也保留了這個特色,可是沒有以bit爲單位來分散數據,而就是以扇區或者幾個扇區爲單位來分散數據。Raid3還採用了高效的XOR校驗算法,可是這種算法只能判斷數據是否有誤,不能判斷出哪一位有誤,更不能修正。XOR校驗使得raid3無論多少塊數據盤,只須要一塊校驗盤就足夠了。

Raid3的每個條帶,其長度很小,深度爲1。這樣的話,每一個segment的大小通常就是1個扇區或者幾個扇區的容量。以上圖的例子來看,4塊數據盤,一塊校驗盤,每一個segment,也就是圖中的一個block portion,假如爲2個扇區大小,也就是1k,則整個條帶大小爲4k,若是一個segment大小爲8個扇區,即4k,則整個條帶大小爲16K。

咱們仍是用一個例子來講明raid3的做用機制。好比,一個4數據盤,1校驗盤的raid3系統,segment size爲2個扇區大小即1k。raid3控制器接受到了這麼一個IO:寫入 初始扇區10000 長度8,即總數據量爲8乘512字節=4k。則控制器先定位LBA10000所對應的真實物理LBA,假如LBA10000剛好在第一個條帶的第一個segment的第一個扇區上,那麼控制器將這個IO數據裏的第一、2個512字節寫入這個扇區,同一時刻,第三、4個512字節會被同時寫入這個條帶的第二個segment中的兩個扇區,其後的數據一樣被寫入第三、4個segment中,此時剛好是4k的數據量。也就是說這4k的IO數據,同時被寫入了4塊磁盤,每塊磁盤寫入了兩個扇區,也就是一個segment,他們是並行寫入的,包括校驗盤,也是並行寫入的,因此raid3的校驗盤沒有瓶頸,可是有延遲,由於增長了計算校驗的開銷。但現代控制器通常都使用專用的XOR硬件電路而不是cpu來計算xor,這樣就使得延遲降到最低。上面那個狀況是IO size恰好等於一個條帶大小的時候,若是IO size小於一個條帶大小呢?咱們接着分析,仍是剛纔那個環境,此時控制器接收到IO大小爲2K的寫入請求,也就是4個連續扇區,那麼控制器就只能同時寫入兩個磁盤了,由於每一個盤上的segment是2個扇區,其餘兩個磁盤此時就是空閒的,也只能獲得兩倍的單盤傳輸速率。咱們再來看看IO size大於一個條帶大小的狀況,會發生什麼。仍是那個環境,控制器收到的IO size=16k。則控制器一次所能並行寫入的,是4k,這16k就須要分4批來寫入4個條帶。其實這裏的分4批寫入,不是前後,而仍是同時,也就是這16k中的第一、五、九、13k將由控制器連續寫入磁盤1,第二、六、十、14k,連續寫入磁盤2,依此類推,直到16k數據所有寫完,是並行一次寫完,這樣校驗盤也能夠一次性計算校驗值而且和數據一同並行寫入。而不是「分批」。

經過比較,咱們發現,與其使得IO size小於一個條帶的大小,空閒一些磁盤,不如使得Io size大於或者等於條帶大小,使得沒有磁盤空餘。由於上層IO size是不受控的,控制器說了不算,可是條帶大小是控制器說了算的,因此若是將條帶大小減小到很小,好比2個扇區,一個扇區,則每次上層IO,通常狀況下都會佔用全部磁盤,進行併發傳輸。能夠提供和raid2同樣的傳輸速度,並避免raid2的諸多缺點。Raid3和raid2同樣,不能併發IO, 由於一個IO要佔用所有盤,就算IO size小於strip size,由於校驗盤的獨享,也不能併發IO。

RAID3

IOPS

併發IO

順序IO

併發IO

順序IO

隨機IO

連續IO

隨機IO

連續IO

隨機IO

連續IO

隨機IO

連續IO

Io size大於strip size

不支持

不支持

提高極小

提高了N倍

不支持

不支持

提高極小

提高了N倍

Io size小於strip size

不支持

事物性IO可併發,提高併發係數倍

提高極小

提高了N乘IO size/strip size倍

不支持

事物性IO可併發,提高併發係數倍

提高極小

提高了N乘IO size/strip size倍

注:N=組成raid3的數據磁盤數量。和raid2相同,事物性連續IO可能併發。

和raid2同樣,raid3一樣也是最適合連續大塊IO的環境,可是它比raid2成本更低,更容易部署。

具體分析:

無論任何形式的raid,只要是面對隨機IO,其性能比單盤沒有大的優點,由於raid做所的只是提升傳輸速率,併發IO,容錯。隨機IO只能靠下降單個物理磁盤的尋道時間來解決。而raid不能優化尋道時間。因此隨機IO,raid3也一樣沒有優點。

連續IO,由於尋道時間的影響因素能夠忽略,raid3最拿手,由於象raid2同樣,raid3能夠大大加快數據傳輸速率,由於他是多盤併發讀寫。因此理論上能夠相對單盤提升N倍的速率。

Raid4

clip_image011

無論是Raid2仍是raid3,他們都是爲了大大提升數據傳輸率而設計,而不能併發IO。諸如數據庫等等應用,他們的特色就是隨機IO和小塊IO。想提升這種環境的IOPS,根據公式:IOPS=IO併發係數/(尋道時間+數據傳輸時間),隨機讀致使尋道時間很大,靠提升傳輸許率已經不是辦法。因此觀察這個公式,想在隨機IO頻發的環境中提升IOPS,惟一可以作的,只有提升IO併發係數,不能併發IO的,想辦法讓他併發IO,併發係數小的,想辦法提升係數。

在raid3的基礎上,raid4被髮展起來。咱們分析raid3的性能的時候,曾經提到過一種狀況,就是io size小於strip size的時候,此時有磁盤處於空閒狀態,而若是抓住這個現象,同時讓隊列中的下一個IO來利用這些空閒的磁盤,豈不是正好達到併發IO的效果了麼?因此raid4將一個segment的大小作的比較大,以致於平均IO size老是小於strip size,這樣就能保證每一個IO少佔用磁盤,甚至一個IO只佔用一個磁盤。

是的,這個思想對於讀IO是對路子的,可是對於寫IO的話,有一個很難克服的問題,那就是校驗盤的爭用。考慮這樣一種狀況:4塊數據盤+1塊校驗盤組成的raid4系統,某時刻一個IO佔用了前兩塊盤+校驗盤,此時雖而後兩塊是空閒的,能夠同時接受新的IO請求,可是若是接受了新的IO請求,則新IO請求一樣也要使用校驗盤,因爲一塊物理磁盤不能同時處理多個IO,因此新IO雖然佔有了數據盤的寫權限,可是寫校驗盤的時候,仍然要等舊IO寫完後,才能寫入校驗,新IO才能完成,這樣的話,就和順序IO無異了,數據盤可併發而校驗盤不可併發,這樣不能實現併發IO。

下面咱們來講幾個概念。

整條寫、重構寫與讀改寫

整條寫(Full-stripe Write):整條寫須要修改奇偶校驗羣組中全部的條帶單元,所以新的奇偶校驗值能夠根據全部新的條帶數據計算獲得。不須要額外的讀、寫操做。所以,整條寫是最有效的寫類型。整條寫的例子,好比raid2,raid3。他們每次IO老是幾乎能保證佔用全部盤,所以每一個條帶上的每一個segment都被寫更新,因此控制器能夠直接利用這些更新的數據計算出校驗數據以後,在數據被寫入數據盤的同時,將計算好的校驗信息寫入校驗盤。

重構寫(Reconstruct Write):若是要寫入的磁盤數目超過陣列磁盤數目的一半,採起重構寫方式。在重構寫中,從這個條帶中不須要修改的segment中讀取原來的數據,再和本條帶中全部須要修改的segment上的新數據計算奇偶校驗值,並將新的segment數據和沒有更改過的segment數據以及新的奇偶校驗值一併寫入。顯然,重構寫要牽涉更多的I/O操做,所以效率比整條寫低。重構寫的例子,好比raid4中,若是數據盤爲8塊,某時刻一個IO只更新了一個條帶的6個segment,剩餘兩個沒有更新,則重構寫模式下,會將沒有被更新的兩個segment的數據讀出,和須要更新的前6個segment的數據計算出校驗數據,而後將這8個segment連同校驗數據一併寫入磁盤。能夠看出,這個操做只是多出了讀兩個segment中數據的操做。

讀改寫(Read-Modify Write):若是要寫入的磁盤數目不足陣列磁盤數目的一半,採起讀改寫方式。讀改寫過程以下:(1)從須要修改的segment上讀取舊的數據;(2)從條帶上讀取舊的奇偶校驗值;(3)根據舊數據、舊校驗值和須要修改的segment上的新數據計算這個條帶上的新的校驗值;(4)寫入新的數據和新的奇偶校驗值。這個過程當中包含讀取、修改、寫入的一個循環週期,所以稱爲讀改寫。讀改寫計算新校驗值的公式爲:新數據的校驗數據=(老數據 EOR 新數據) EOR 老校驗數據。若是待更新的segment已經超過了條帶中總segment數量的一半,則此時不適合使用讀改寫,由於讀改寫須要讀出這些segment中的數據和校驗數據,而若是採用重構寫,只須要讀取剩餘不許備更新數據的segment中的數據便可,然後者數量比前者要少,因此超過一半,用重構寫,不到一半,用讀改寫。整條更新,就用整條寫。寫效率:整條寫>重構寫>讀改寫

明白了這些概念以後,咱們就能夠繼續深刻理解raid4了。若是僅僅根據爭用校驗盤來下結論說raid4不支持併發IO,在通過了以上三個概念的描述以後,看來顯然是片面的。咱們設想這樣一種情形,某時刻一個IO只佔用了所有磁盤的幾塊盤,另外一些磁盤空閒,若是此時讓隊列中下一個IO等待的話,那麼固然不可實現併發IO。此時咱們考慮:若是隊列中有這樣一個IO,它須要更新的LBA目標和正在進行的IO剛好在同一條帶上,而且處於空閒磁盤,而又不衝突,那麼此時咱們剛好就可讓這個IO也搭一下正在進行的IO的順風車,反正都是要更新這個條帶的校驗segment,與其兩個IO前後更新,不如讓他們同時更新各自的數據segment,而控制器負責計算本條帶的校驗塊。這樣就完美的達到了IO併發。可是,有個問題,這種狀況遇到的概率真是小之又小。即使如此,控制器若是能夠對隊列中的IO目標LBA進行掃描,將目標處於同一條帶的IO,讓其併發寫入,這就多少相似NCQ技術了,不過這種技術須要上層軟件的配合,由於亂序IO,會失去事務的順序性,因此還須要上層軟件做一些處理。

除了在控制器內部實現這種算法以外,咱們還能夠直接在上層來實現這種模式。上層就是指操做系統的文件系統。由於文件系管理着底層磁盤。文件系統決定數據寫往磁盤上的哪些扇區。因此徹底能夠在文件系統這個層次上,將兩個不一樣事物的IO寫操做,儘可能放到相同的條帶上,也就是說,好比一個條帶大小爲16k,能夠前8k放一個IO的數據,後8k放也另外一個IO的數據,這兩個IO在通過文件系統的計算以後,經由磁盤控制器驅動程序,向磁盤發出同時寫入整個條帶的操做,這樣就構成了整條寫,若是實在不能佔滿整條,那麼也應該儘可能達成重構寫模式,這樣不但併發了IO,還使得寫效率增長。這種在文件系統專門爲raid4作出優化的方案,最點型的就是netapp公司的磁盤陣列操做系統data ontap,這個操做系統中文件系統模塊稱爲WAFL。WAFL文件系統的設計方式確保可以最大限度地減小校驗盤尋址操做。 上圖右半部對比顯示了WAFL如何分配一樣的數據塊,從而使得RAID 4更加有效。 WAFL老是把相關的數據塊寫到彼此鄰近的條帶中,消除校驗盤上的長時間尋址操做。只要可能,WAFL也把多重數據塊寫到一樣的條帶中,從而進一步減小校驗盤上的阻塞。FFS在上圖左半部中使用六道獨立的條帶,所以導致六個校驗盤塊須要更新。 上圖右半部中,WAFL使用僅僅3道條帶,即只有三個校驗塊須要更新。從而大大提升了RAID性能,消除了校驗盤瓶頸。

clip_image012

RAID4

IOPS

特別優化的併發IO

順序IO

特別優化的併發IO

順序IO

隨機IO

連續IO

隨機IO

連續IO

隨機IO

連續IO

隨機IO

連續IO

Io size/strip size較大

衝突

衝突

提高極小

提高了N倍

衝突

衝突

沒有提高

提高了N倍

Io size/strip size較小

提高極小

提高併發係數倍

幾乎沒有提高

幾乎沒有提高

提高併發係數倍

提高併發係數乘N倍

性能降底

性能降底

注:N爲raid4數據盤數量。Io size/strip size太大則併發IO概率很小。

值得注意的是,若是io size/strip size的值過小,則順序IO讀,無論是連續仍是隨機IO,幾乎都沒有提高。順序IO寫,性能降低,由於io size很小,又是順序IO,則只能進行讀改寫,性能降底很多。

因此,若是要使用raid4,不進行特別優化,是不行的,至少要讓他能夠進行併發IO。咱們觀察表格可知,併發IO模式下,性能都有所提高。然而若是要優化到併發概率很高,實則不容易。目前只有netapp的WAFL文件系統還在使用raid4,其餘產品均未見使用。面臨淘汰,取而代之的是擁有高併發概率的raid5系統。

Raid5

clip_image013clip_image014clip_image016

爲了解決raid4系統不能併發IO困難的窘境,raid5相應而出。Raid4併發困難,是由於他的校驗盤爭用的問題,若是能找到一種機制,能有效解決這個問題,則實現併發就會很是容易。Raid5偏偏解決了校驗盤爭用這個問題。Raid5採用分佈式校驗盤的作法,將校驗盤打散在raid組中的每塊磁盤上。如圖所示。每一個條帶都有一個校驗segment,可是不一樣條帶中其位置不一樣,在相鄰條帶之間循環分佈。爲了保證併發IO,raid5一樣將條帶大小作的較大,以保證每次IO數據不會佔滿整個條帶,形成隊列其餘IO等待。因此,raid5若是要保證高併發率,那麼每一個IO幾乎都是讀改寫模式,尤爲是在隨機IO的狀況下,因此raid5擁有較高的寫懲罰,可是在隨機IO頻發的環境下,仍然能保持較高的IOPS。

們來分析一下raid5具體的做用機制。以上圖爲例的環境,條帶大小80k,每一個segment大小16k。某一時刻,上層產生一個寫IO:寫入 初始扇區10000 長度8,即寫入4k的數據。控制器收到這個IO以後,首先定位真實LBA地址,假設定位到了第1個條帶的第2個segment(位於圖中的磁盤2)的第1個扇區(僅僅是假設),則控制器首先對這個segment所在的磁盤發起IO寫請求,讀出這8個扇區中原來的數據到cache,與此同時控制器也向這個條帶的校驗segment所在的磁盤(即圖中的磁盤1)發起IO讀請求,讀出對應的校驗扇區數據並保存到cache,隨後利用XOR校驗電路來計算新的校驗數據,利用公式:新數據的校驗數據=(老數據 EOR 新數據) EOR 老校驗數據。如今cache中存在:老數據,新數據,老校驗數據,新校驗數據。而後控制器當即再次向相應的磁盤同時發起IO寫請求,將新數據寫入數據segment,將新校驗數據寫入校驗segment,並刪除老數據和老校驗數據。

在上述過程當中,這個IO佔用的,始終只有一、2兩塊盤,由於所要更新的數據segment咱們假設位於2盤的1條帶的2號segment,而這個條帶對應的校驗segment位於1盤,自始至終其餘任何磁盤都沒有用到。那麼若是此時隊列中有這麼一個IO,他的LBA初始目標假如位於圖中下方紅框所示的數據segment中(4盤),IO長度也不超過segment的大小,而這個條帶對應的校驗segment位於3盤上,這兩塊盤未被其餘任何IO佔用,因此,此時控制器就能夠併發的處理這個IO,和上方紅框所示的IO,達到併發。

Raid5相對於通過特別優化的raid4來講,在底層就實現了併發,能夠脫離文件系統的干預,任何文件系統的IO,均可以實現高併發概率,而不像基於wafl文件系統的raid4,須要在文件系統上規劃計算出併發環境。

Raid5磁盤數量越多,可併發的概率就越大。

RAID5

IOPS

併發IO

順序IO

併發IO

順序IO

隨機IO

連續IO

隨機IO

連續IO

隨機IO

連續IO

隨機IO

連續IO

Io size近似strip size

不支持

不支持

提高極小

提高了N倍

不支持

不支持

提高極小

提高了N倍

IO size大於segment size重構寫

提高併發係數倍

提高併發係數倍

幾乎沒有提高

提高了IO size/segment size倍

提高併發係數倍

提高併發係數倍

性能降低

提高極小

Io size小於segment size讀改寫

提高併發係數倍

提高併發係數倍

提高極小

沒有提高

提高併發係數倍

提高併發係數倍

性能降低

性能降低

raid5最適合小塊IO,併發IO的狀況下,性能都較單盤有所提高。

Raid6

clip_image018

raid6以前的任何raid級別,最多能保障在壞掉一塊盤的時候,數據仍然能夠訪問,可是若是同時壞掉兩塊盤,則數據將會丟失。爲了增長raid5的保險係數,raid6被創立。Raid6比raid5多增長了一塊校驗盤,同時也是分佈打散在每塊盤上,用另外一個方程式來計算新的校驗數據,這樣,raid6同時在一個條帶上保存了兩份數學上不相關的校驗數據,這樣可以保證同時壞兩塊盤的狀況下,數據依然能夠經過聯立這兩個數學關係等式來求解丟失的數據。Raid6較raid5在寫的時候,會同時讀取或者寫入額外的一份校驗數據,不過因爲是並行同時操做,因此比raid5慢不了多少。其餘特性和raid5相似。

RAID6

IOPS

併發IO

順序IO

併發IO

順序IO

隨機IO

連續IO

隨機IO

連續IO

隨機IO

連續IO

隨機IO

連續IO

Io size近似strip size

不支持

不支持

提高極小

提高了N倍

不支持

不支持

提高極小

提高了N倍

IO size大於segment size重構寫

提高併發係數倍

提高併發係數倍

幾乎沒有提高

幾乎沒有提高

提高併發係數倍

提高併發係數倍

性能降低

提高極小

Io size小於segment size讀改寫

提高併發係數倍

提高併發係數倍

提高極小

沒有提高

提高併發係數倍

提高併發係數倍

性能降低

性能降低

相關文章
相關標籤/搜索