本文從低層原理上,深刻透析了目前存在的7種raid模式的組成原理,結構,並深入分析了各類級別相對於單盤IO速率的變化。算法
Raid0數據庫
Raid0是這樣一種模式:咱們拿5塊盤的raid0爲例子。緩存
上圖中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塊盤的例子來講明:
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
因爲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
無論是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性能,消除了校驗盤瓶頸。
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
爲了解決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
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讀改寫 |
提高併發係數倍 |
提高併發係數倍 |
提高極小 |
沒有提高 |
提高併發係數倍 |
提高併發係數倍 |
性能降低 |
性能降低 |