|
EX436第四章:RAID陣列 4.00 本章概述: -了解RedHat Linux下各種類型的RAID陣列; -學(xué)習(xí)如何管理高級的軟RAID; -學(xué)習(xí)如何優(yōu)化軟RAID陣列; -規(guī)劃和實(shí)現(xiàn)存儲陣列的增長;
4.01 獨(dú)立的磁盤冗余陣列(RAID): RAID是Redundant Array of Independent Disk的縮寫,中文翻譯過來就叫做“獨(dú)立的冗余磁盤陣列”。磁盤技術(shù)還沒發(fā)展到如今這樣強(qiáng)大的時(shí)候,磁盤的價(jià)格非常昂貴,尤其是大容量的磁盤,更是天價(jià)。為了滿足企業(yè)級的存儲需求,早期的RAID產(chǎn)生了,最初只是為了組合廉價(jià)的小容量磁盤,以代替昂貴的大容量磁盤,后來隨著數(shù)據(jù)存儲的發(fā)展,RAID才慢慢突出其在提高數(shù)據(jù)訪問速度、提高數(shù)據(jù)可用性上的特點(diǎn)。 RAID可以將多個物理磁盤組合成一個邏輯單元,對于操作系統(tǒng)來說,它將RAID看成一個塊設(shè)備,而在RAID底層其實(shí)是由多個塊設(shè)備通過不同的冗余算法組合而成的邏輯設(shè)備。本章中講的RAID是圍繞軟件級RAID展開的,因?yàn)檐汻AID是由操作系統(tǒng)層提供,不需要RAID卡等硬件設(shè)備也能輕松做實(shí)驗(yàn),其次是軟件RAID比硬件RAID在類型上和功能上都要豐富,更利于我們充分深入地理解RAID陣列。 軟RAID有以下幾種類型: RAID0,RAID1,RAID5,RAID6,RAID10等等,這些具有代表性的RAID我們會在下面幾節(jié)內(nèi)容中詳細(xì)講解。 對于RAID的功能相信大家一定不陌生:首先是其冗余校驗(yàn)算法在保證數(shù)據(jù)完整性上的作用,同時(shí)也實(shí)現(xiàn)了容錯的功能,提高了陣列的吞吐率,最實(shí)在的是提高了存儲陣列的容量。 很多朋友搞不清楚軟件RAID和硬件RAID的本質(zhì)區(qū)別,我這里做個講解。軟件級的RAID是基于操作系統(tǒng)層面的,它的RAID抽象層是由系統(tǒng)實(shí)現(xiàn)的,它的各磁盤之間的數(shù)據(jù)分布、校驗(yàn)碼運(yùn)算、陣列修復(fù)等都是由系統(tǒng)內(nèi)核及系統(tǒng)CPU提供的,只要操作系統(tǒng)出現(xiàn)了問題,這個RAID也將朝不保夕,所以軟件RAID的可靠性是完全達(dá)不到企業(yè)級要求的;硬件級的RAID則是將很多重要功能抽離出來,嵌入到硬件RAID卡上,最重要一點(diǎn)是硬件RAID卡自身帶有專門設(shè)計(jì)用于RAID算法運(yùn)算的CPU,這樣就不需要占用系統(tǒng)CPU的資源,解決了可能因系統(tǒng)CPU中斷調(diào)度阻塞而造成的數(shù)據(jù)瓶頸。 在RadHat Linux下的軟件RAID工具是mdadm,通過這個工具我們可以創(chuàng)建各種RAID陣列,查看詳細(xì)RAID信息等等重要操作,后面我們會詳細(xì)說明使用方法。
4.02 RAID0條帶卷: RAID0又叫做Stripe,即條帶卷,是所有RAID級別中性能最好的陣列類型。RAID0之所以具有很高的性能,是因?yàn)镽AID0實(shí)現(xiàn)了帶區(qū)組,它將連續(xù)的數(shù)據(jù)分散地存儲到多個磁盤驅(qū)動器中。 當(dāng)系統(tǒng)有數(shù)據(jù)請求時(shí),就可以同時(shí)由多個磁盤中并行讀取數(shù)據(jù)。這種數(shù)據(jù)上的并行操作充分地利用了總線的帶寬,所以數(shù)據(jù)吞吐率大大提高。同時(shí)磁盤驅(qū)動器也能相對地負(fù)載均衡,從而顯著地提高磁盤的整體存取性能。 要實(shí)現(xiàn)RAID0起碼要兩個以上的磁盤驅(qū)動器,如果某次請求所需的數(shù)據(jù)剛好分布在不同的驅(qū)動器上時(shí),此時(shí)效率性能最佳,因?yàn)榇藭r(shí)可以進(jìn)行并行的讀?。蝗绻钄?shù)據(jù)恰好在同一個驅(qū)動器上,則無法并行讀取。 雖然RAID0在存取性能上有優(yōu)勢,但是其弱點(diǎn)也相當(dāng)明顯。RAID0沒有數(shù)據(jù)的差錯控制,不能保證數(shù)據(jù)的完整性可靠性,當(dāng)陣列中某個驅(qū)動器損壞時(shí),將無法讀取正確的數(shù)據(jù)。但是RAID0應(yīng)用在一些對于數(shù)據(jù)可靠性要求不高的應(yīng)用上還是不錯的,例如電影存儲、圖片站存儲等等。 RAID0配置實(shí)例: # mdadm --create /dev/md0 --level=0 --raid-devices=2 --chunk=64 /dev/sd[ab]1 # mke2fs -j -b 4096 -E stride=16 /dev/md0 在RAID中有block、chunk和stride這個3個重要參數(shù),它們描述了數(shù)據(jù)在底層的組織和分布。在創(chuàng)建RAID設(shè)備的階段首先要指定chunk的大小,如--chunk=64,chunk塊其實(shí)是RAID數(shù)據(jù)分布的基本單位,如上面創(chuàng)建的RAID0,數(shù)據(jù)是分散存儲在2個磁盤中的,如在第一塊盤寫入了一個chunk時(shí),就轉(zhuǎn)到第二塊盤繼續(xù)寫數(shù)據(jù),也就是以chunk為單位輪轉(zhuǎn)地在多塊磁盤上寫數(shù)據(jù)。 而block和stride則是在格式化創(chuàng)建文件系統(tǒng)時(shí)指定的,block好理解,就是文件系統(tǒng)層面上劃分的基本塊,你可以針對你所要存儲的數(shù)據(jù)的特點(diǎn)來指定更為合適的Block Size;而stride也成為跨步數(shù),stride=chunk/block,就是說,當(dāng)你的chunk=64,block=4096時(shí),你在第一塊的文件系統(tǒng)上寫了16個Block(16個跨步)才達(dá)到一個Chunk,也就是在磁盤上進(jìn)行16個跨步的寫操作才輪轉(zhuǎn)到下一塊磁盤。
4.03 RAID1鏡像卷: RAID1又稱為鏡像卷,使用RAID1至少需要2塊以上的磁盤,當(dāng)數(shù)據(jù)寫入時(shí),會在兩塊盤中寫入完全相同的數(shù)據(jù),形成鏡像結(jié)構(gòu),當(dāng)一組盤出現(xiàn)問題時(shí),可以使用鏡像盤,以此提高存儲的容錯能力。 RAID1的容錯策略是完全備份,同樣的數(shù)據(jù)在RAID1陣列中有兩份,這樣也使得讀性能有了很大的提高,因?yàn)樵谧x取數(shù)據(jù)時(shí)可以使主磁盤和鏡像盤兩個驅(qū)動器并行地進(jìn)行讀取。這樣使得RAID1具有極佳的讀性能。 RAID1支持熱替換,即可以在在線的狀態(tài)下取下受損的磁盤,替換上新的磁盤,此時(shí)RAID將自動進(jìn)行鏡像修復(fù)。但是由于RAID1是完全備份的策略,且出錯校驗(yàn)較為嚴(yán)格,如果是軟件級的RAID1則將會大大影響服務(wù)器的性能,尤其是在服務(wù)器負(fù)載高峰期。 RAID1配置實(shí)例: # mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sd[ab]1
4.04 RAID5奇偶校驗(yàn)卷: RAID5是帶有分布式奇偶校驗(yàn)位的塊級別條帶卷,需要3塊及以上個磁盤,RAID5具有很高的讀性能,但是寫性能則一般,因?yàn)樵跀?shù)據(jù)寫入的過程中要進(jìn)行奇偶校驗(yàn)運(yùn)算并將校驗(yàn)碼寫到磁盤中。 RAID5在物理底層數(shù)據(jù)存儲是以“異或”運(yùn)算來實(shí)現(xiàn)校驗(yàn)的,如下表,該RAID5是由以下3塊磁盤組成的,數(shù)據(jù)的寫入都是分布式的,并沒有哪一塊盤是專門用于存放校驗(yàn)碼的。
如第一行,假如1,2號盤寫入的是數(shù)據(jù),則第3塊盤則根據(jù)前兩個數(shù)據(jù)做“異或”運(yùn)算的結(jié)果存放起來,即 1 XOR 1 = 0,當(dāng)任一盤出現(xiàn)問題,例如Disk1損壞,則將Disk2和Disk3上的數(shù)據(jù)進(jìn)行“異或”運(yùn)算就能得出Disk1上的數(shù)據(jù),即 1 XOR 0 = 1。 RAID5在檢測到某盤損壞時(shí)將自動進(jìn)入降級模式,限制讀寫速度以保證現(xiàn)有已損壞的陣列不會出現(xiàn)更大的問題;RAID5支持熱備盤,即當(dāng)檢測到某磁盤損壞時(shí),陣列會自動將熱備盤頂上,并自動進(jìn)行數(shù)據(jù)修復(fù)動作。 RAID5的磁盤利用率:(N-1/N)*100% (N為磁盤數(shù)) RAID5配置實(shí)例: # mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sd[abc]1
4.05 RAID5的校驗(yàn)和數(shù)據(jù)分布: 如圖就是我上面提到過的底層數(shù)據(jù)分布,該RAID5陣列是由4個磁盤組成的,其中白色的框代表奇偶校驗(yàn)信息,可以看出數(shù)據(jù)的分布式存儲以及條帶的組成。以上數(shù)據(jù)分布模型采用的是“左對稱奇偶校驗(yàn)”策略,這在RHEL中是默認(rèn)使用的策略。
4.06 RAID5的數(shù)據(jù)排列算法: RAID陣列的數(shù)據(jù)分布有以下4種算法,分別是左對稱、右對稱、左非對稱、右非對稱,而RAID5默認(rèn)使用左對稱的數(shù)據(jù)分布算法。 Left Asymmetric左非對稱 Right Asymmetric右非對稱 sda1 sdb1 sdc1 sde1 sda1 sdb1 sdc1 sde1 D0 D1 D2 P P D0 D1 D2 D3 D4 P D5 D3 P D4 D5 D6 P D7 D8 D6 D7 P D8 P D9 D10 D11 D9 D10 D11 P D12 D13 D14 P P D12 D13 D14 ================================================================= Left Symmetric左對稱 Right Symmetric右對稱 sda1 sdb1 sdc1 sde1 sda1 sdb1 sdc1 sde1 D0 D1 D2 P P D0 D1 D2 D4 D5 P D3 D5 P D3 D4 D8 P D6 D7 D7 D8 P D6 P D9 D10 D11 D9 D10 D11 P D12 D13 D14 P P D12 D13 D14 在使用mdadm創(chuàng)建RAID陣列時(shí),可以使用--layout=<type>來指定數(shù)據(jù)和奇偶校驗(yàn)信息在陣列如何分布存儲,此處的<type>有如下4個參數(shù): Left-asymmetric:對照上面的左非對稱算法的數(shù)據(jù)分布實(shí)例,該算法描述的數(shù)據(jù)分布是,在陣列上從第一個陣列段到最后一個陣列段依次的存入數(shù)據(jù)塊,與此同時(shí),奇偶校驗(yàn)塊P也從最后一個陣列段到第一個陣列段依次寫入。 Right-asymmetric:數(shù)據(jù)塊在陣列上從第一個陣列段到最后一個陣列段依次的存入數(shù)據(jù)塊,與此同時(shí),奇偶校驗(yàn)塊P也從第一個陣列段到最后一個陣列段依次寫入。 Left-symmetric:這個是RAID5默認(rèn)的分布算法,也是對于讀請求性能最佳的數(shù)據(jù)分布機(jī)制。奇偶校驗(yàn)信息P從最后一個陣列段到第一個陣列段依次寫入。數(shù)據(jù)塊從左向右寫,且每行的數(shù)據(jù)塊都先在校驗(yàn)塊P后面開始寫,直到寫滿。 Right-symmetric:奇偶校驗(yàn)信息P從第一個陣列段到最后一個陣列段依次寫入。數(shù)據(jù)塊從左向右寫,且每行的數(shù)據(jù)塊都先在校驗(yàn)塊P后面開始寫,直到寫滿。
4.07 RAID5數(shù)據(jù)更新的開銷: 對于RAID5來說,每次數(shù)據(jù)更新需要如下4次I/O操作: -從磁盤上讀出需要更新的某個數(shù)據(jù); -更新該數(shù)據(jù),但是此時(shí)奇偶校驗(yàn)信息還沒更新過來; -讀出其他塊的數(shù)據(jù)并計(jì)算出校驗(yàn)信息; -寫回更新后的信息和校驗(yàn)信息; RAID5的數(shù)據(jù)更新開銷相對較大,以上4次I/O操作對于讀寫操作頻繁的應(yīng)用是致命,其性能的下降被操作系統(tǒng)層強(qiáng)大的cache所掩蓋了,對于性能的下降感覺不明顯。
4.08 RAID6雙份校驗(yàn)卷: RAID6即帶有雙份分布式奇偶校驗(yàn)信息的塊級別條帶卷。它與RAID5很相似,但是比RAID5多設(shè)了一個校驗(yàn)位,也就是存儲了兩份的校驗(yàn)信息。所以RAID6陣列最少需要4塊磁盤。 由于RAID6在進(jìn)行寫操作時(shí)需要計(jì)算兩個校驗(yàn)碼,所以其寫性能較RAID5要差,但是容錯能力卻有了大大的提升。RAID6可以允許2塊以上的磁盤出現(xiàn)問題,當(dāng)磁盤損壞時(shí),陣列進(jìn)入降級模式,直到陣列修復(fù)后才會取消降級保護(hù)模式。 RAID6的磁盤利用率:(1-2/N)*100% (N為磁盤數(shù)) RAID6配置實(shí)例: # mdadm --create /dev/md0 --level=6 --raid-devices=4 /dev/sd[abcd]1
4.09 RAID6的校驗(yàn)和數(shù)據(jù)分布:
上圖是RAID6的數(shù)據(jù)塊分布圖,了解RAID6的關(guān)鍵在于了解其如何在損壞2個以上的磁盤時(shí)依然保證數(shù)據(jù)的完整性。如圖Stripe1中,Device1和Divice2上保存了數(shù)據(jù)塊,Device3和Device4上則是校驗(yàn)信息。Device3的校驗(yàn)信息可以由Device1-3計(jì)算所得,Device4的校驗(yàn)信息可以由Device2-4計(jì)算所得。 當(dāng)Device1和Device2損壞時(shí),Device4上的校驗(yàn)信息就可以結(jié)合Device3和Device4來計(jì)算出Device2上的數(shù)據(jù),Device1則利用Device2和3來計(jì)算,實(shí)現(xiàn)數(shù)據(jù)的冗余校驗(yàn),保證數(shù)據(jù)的完整性。
4.10 RAID10陣列卷: RAID10是一種嵌套的RAID陣列,結(jié)合了RAID1和RAID0的特點(diǎn),既有RAID1的高容錯能力,也具有RAID0的高性能。RAID10需要4塊及以上個磁盤。 RAID10磁盤利用率:(1/N)*100% (N為磁盤數(shù)) 以下是一個RAID10配置實(shí)例: 磁盤sda1和sdb1創(chuàng)建成RAID1陣列,設(shè)備為/dev/md0;磁盤sdc1和sdd1創(chuàng)建成RAID1陣列,設(shè)備為/dev/md1;再將兩個RAID1陣列組合成一個RAID0陣列: # mdadm -C /dev/md0 --level=1 --raid-devices=2 /dev/sd[ab]1 # mdadm -C /dev/md1 -a yes --level=1 --raid-devices=2 /dev/sda[cd]1 # mdadm -C /dev/md2 -a yes --level=10 --raid-devices=2 /dev/md[01] 查看RAID設(shè)備的詳細(xì)信息: # mdadm -D /dev/md2
4.11 條帶陣列的參數(shù): 調(diào)整條帶卷的參數(shù)對于優(yōu)化陣列的性能是相當(dāng)重要的。對于RAID0、RAID5、RAID6陣列主要有Chunk Size和Stride兩個重要參數(shù)。 Chunk Size是指陣列中在每個物理磁盤上分布的數(shù)據(jù)塊的大小,通常默認(rèn)為64K,可以根據(jù)所提供服務(wù)的需求來進(jìn)行適當(dāng)?shù)膬?yōu)化。Stride即跨步數(shù),是在為陣列創(chuàng)建文件系統(tǒng)時(shí)可以指定的參數(shù),由Chunk Size / Block Size計(jì)算所得。 減小Chunk Size的大小意味著文件在存儲陣列中被分得更小,增大Chunk Size則可以使得文件保存在一個Chunk中,雖然設(shè)置大的Chunk有利于寫操作,但是過大的Chunk會使得RAID的讀性能不能很好地發(fā)揮,所以,盲目地加大Chunk Size有時(shí)會有反效果。
4.12 RAID狀態(tài)信息/proc/mdstat: /proc/mdstat中保存了當(dāng)前所有RAID陣列的詳細(xì)信息,我們可以通過查看該文件來獲取RAID的狀態(tài)信息??梢酝ㄟ^下面這條命令做實(shí)時(shí)監(jiān)控: # watch -n .5 'cat /proc/mdstat' (每隔0.5秒查看一次) 以下是各種狀態(tài)信息的實(shí)例: Initial sync'ing of a RAID1 (mirror): Personalities : [raid1] md0 : active raid1 sda5[1] sdb5[0] 987840 blocks [2/2] [UU] [=======>.............] resync = 35.7% (354112/987840) finish=0.9min (RAID1修復(fù)中。。。) speed=10743K/sec ----------------------------------------------------------------- Active functioning RAID1: # cat /proc/mdstat Personalities : [raid1] md0 : active raid1 sda5[1] sdb5[0] 987840 blocks [2/2] [UU] unused devices: <none> ----------------------------------------------------------------- Failed half of a RAID1: # cat /proc/mdstat Personalities : [raid1] md0 : active raid1 sda5[1](F) sdb5[0] 987840 blocks [2/1] [U_] (該RAID1損壞了一個磁盤) unused devices: <none>
4.13 詳細(xì)的RAID狀態(tài)信息: 要想獲取詳細(xì)的RAID信息,可以使用如下命令: # mdadm --detail /dev/md0 (--detail可以簡寫為-D) /dev/md0: Version : 00.90.03 Creation Time : Tue Mar 13 14:20:58 2007 Raid Level : raid1 Array Size : 987840 (964.85 MiB 1011.55 MB) Device Size : 987840 (964.85 MiB 1011.55 MB) Raid Devices : 2 Total Devices : 2 Preferred Minor : 0 Persistence : Superblock is persistent
Update Time : Tue Mar 13 14:25:34 2007 State : clean, degraded, recovering Active Devices : 1 Working Devices : 2 Failed Devices : 0 Spare Devices : 1
Rebuild Status : 60% complete
UUID : 1ad0a27b:b5d6d1d7:296539b4:f69e34ed Events : 0.6
Number Major Minor RaidDevice State 0 3 5 0 active sync /dev/sda5 1 3 6 1 spare rebuilding /dev/sdb5 由以上的RAID信息,我們可以看出,這是一個由兩個磁盤組成的RAID1陣列,該RAID1狀態(tài)為Clean、degraded、recovering,即表示陣列數(shù)據(jù)沒有遭到污染,目前進(jìn)入降級保護(hù)模式,且正在處于修復(fù)RAID過程中,目前已修復(fù)完成60%。
磁盤/dev/sda5處于活躍狀態(tài),而/dev/sdb5則正在參與修復(fù),一旦修復(fù)完成,RAID將取消降級模式,恢復(fù)原有的RAID性能。 SYSFS即為/sys,是在系統(tǒng)啟動后根據(jù)系統(tǒng)信息實(shí)時(shí)更新的文件信息庫,這些信息只能查看,不能隨意修改,否則可能導(dǎo)致塊設(shè)備損壞。我們可以通過查看RAID在SYSFS上的信息來更加全面地了解RAID陣列。 # cat /sys/block/mdX/md 通過以上命令可以查看到該陣列保存了以下信息: Level:指定了RAID陣列的級別; raid_disks:該陣列所組成的磁盤; chunk_size (RAID0,5,6,10):對于RAID0,5,6,10則有指定Chunk Size; component_size:本參數(shù)是針對鏡像卷的,指定各盤統(tǒng)一的可用容量大??; new_dev:可寫的文件,里面可以用“major:minor”這樣的字段來描述要添加到陣列中的新磁盤; safe_mode_delay:文件內(nèi)容是一個時(shí)間參數(shù),默認(rèn)是200ms,如果經(jīng)過了200ms時(shí)間沒有對陣列有寫請求,則該陣列將會被認(rèn)定為clean狀態(tài); sync_speed_{min,max}:當(dāng)陣列損壞,進(jìn)入修復(fù)模式的時(shí)候,該文件內(nèi)顯示當(dāng)前陣列修復(fù)的速度。單位為kiB/s。 sync_action:用于監(jiān)控和控制陣列修復(fù)重建的過程。里面可以設(shè)置為resync、recover、idle、check、repair 5項(xiàng)中的任一項(xiàng)。 Stripe_cache_size:用于為所有的讀寫操作做同步。增加這個數(shù)值可以提升該陣列的讀寫性能,但是將消耗較多的系統(tǒng)內(nèi)存。 在陣列信息目錄,即/sys/block/mdX/目錄中,以上陣列信息保存在以它們命名的文件中,可以如此查看: # cat /sys/block/mdX/level
4.15 RAID的配置文件: 對于軟件級RAID來說,其在操作系統(tǒng)層最重要的配置文件就是/etc/mdadm.conf。這個配置文件用來簡化配置RAID陣列的架構(gòu),可以使得多個RAID陣列可以共享熱備盤,可以通過以下命令創(chuàng)建一個已經(jīng)存在的陣列的信息: # mdadm --verbose --examine --scan 配置文件示例: DEVICE partitions ARRAY /dev/md0 level=raid1 num-devices=2 UUID=c5dac4d3:2d6b9861:ab54c1f6:27c15a12 devices=/dev/sda2,/dev/sdc2 ARRAY /dev/md1 level=raid0 num-devices=2 UUID=4ed6e3cc:f12c94b1:a2044461:19e09821 devices=/dev/sda1,/dev/sdc1 每個RAID陣列在配置文件中都是以ARRAY開頭指定,每個陣列信息包括以下幾個參數(shù)信息:uuid、super-minor、name、devices、level、num-devices、spares、spare-group、auto、bitmap、metadata等。
4.16 監(jiān)控RAID: RAID陣列提供了事件的通知功能,其實(shí)就是對RAID陣列狀態(tài)的監(jiān)控,在設(shè)置對某個RAID陣列做監(jiān)控之前,首先應(yīng)確定本機(jī)的郵件功能是否可以正常工作。 設(shè)置郵件做事件的通知需要在/etc/mdadm.conf中加入相應(yīng)的參數(shù),如下3個參數(shù): MAILADDR root@example.com MAILFROM root@node1.example.com PROGRAM /usr/sbin/script.sh 其中的PROGRAM參數(shù)指的是當(dāng)事件發(fā)生時(shí)將執(zhí)行script.sh這個腳本,如果該陣列中有某部分?jǐn)?shù)據(jù)非常重要,那么當(dāng)磁盤損壞的時(shí)候,可以使用這個參數(shù)執(zhí)行腳本,自動地備份重要的數(shù)據(jù)。 可以通過以下命令測試設(shè)置: # mdadm --monitor --scan --oneshot --test 為了設(shè)置的監(jiān)控生效,必須保證mdmonitor進(jìn)程正確地運(yùn)行: # chkconfig mdmonitor on ; service mdmonitor start
4.17 重新條帶化/重塑RAID設(shè)備: 重新條帶化或重塑RAID陣列其實(shí)就是將原來陣列中的數(shù)據(jù)重新以新的層次排列成新的陣列。當(dāng)開始重新條帶化的時(shí)候,陣列的關(guān)鍵信息所在的關(guān)鍵區(qū)(Critical Section)將會被重新寫入新陣列的架構(gòu)信息,但是在重寫關(guān)鍵區(qū)的過程中,一旦遇到系統(tǒng)崩潰或者掉電的情況,原本陣列的關(guān)鍵區(qū)信息將會被損毀,導(dǎo)致陣列無法使用。 為了避免關(guān)鍵區(qū)數(shù)據(jù)的丟失,mdadm有以下措施: 1. 關(guān)閉對陣列關(guān)鍵區(qū)的寫操作; 2. 在重新條帶化之前備份關(guān)鍵區(qū)的信息; 3. 若發(fā)生掉電等情況時(shí),可以繼續(xù)之前的重新條帶化; 4. 最后作廢備份的關(guān)鍵區(qū)信息,回復(fù)對關(guān)鍵區(qū)的寫操作; Mdadm提供了一個機(jī)制用于對重新條帶化過程中發(fā)生了中斷的陣列恢復(fù)關(guān)鍵區(qū)。 例如為RAID5增加磁盤這樣的動作就需要重新條帶化,重新條帶化和重塑是不一樣的概念,重新條帶化需要改變關(guān)鍵區(qū)的信息,因?yàn)檎麄€RAID陣列的底層數(shù)據(jù)分布和架構(gòu)都發(fā)生了改變,但是重塑卻不同,它不會改變陣列的大?。ɡ鏑hunk Size等),不會改變關(guān)鍵區(qū)信息,重塑發(fā)生在磁盤的扇區(qū)上,用于對陣列中的磁盤的數(shù)據(jù)分布進(jìn)行調(diào)整。
4.18 在線拉伸RAID5: 本小節(jié)主要講如何在線拉伸RAID5陣列,即在線地為RAID5增加磁盤數(shù),以實(shí)現(xiàn)RAID陣列的容量增長。 在2.6.17和更新的linux內(nèi)核中,軟件級RAID5才能在文件系統(tǒng)在線的情況下為陣列增加磁盤。在增加磁盤之前需要為原陣列中的數(shù)據(jù)做重塑(Reshaping),RAID5的重塑過程將比較慢,可以通過以下的內(nèi)核參數(shù)優(yōu)化重塑的速度,這是RAID數(shù)據(jù)傳輸?shù)淖钚≈迪拗?,默認(rèn)是1000: # echo 25000 > /proc/sys/dev/raid/speed_limit_min 首先先向RAID5陣列添加一塊新的磁盤: # mdadm --add /dev/md0 /dev/hda8 重塑RAID5陣列: # mdadm --grow /dev/md0 --raid-devices=4 監(jiān)控重塑的過程和估算重塑完成的時(shí)間: # watch -n 1 'cat /proc/mdstat' 拉伸RAID陣列上的文件系統(tǒng): # resize2fs /dev/md0
4.19 關(guān)鍵扇區(qū)備份: 重塑操作的第一階段就是對震了關(guān)鍵區(qū)的備份,默認(rèn)地,關(guān)鍵區(qū)將備份到陣列的空閑磁盤上,如果沒有空閑磁盤則會備份到內(nèi)存中,但是關(guān)鍵區(qū)備份在內(nèi)存是不夠安全的,一旦發(fā)生斷電,內(nèi)存中的關(guān)鍵區(qū)備份也將損毀。 可以用以下命令在重塑陣列的過程中將關(guān)鍵區(qū)備份到一個文件中: # mdadm --grow /dev/md0 --raid-devices=4 --backup-file=/tmp/md0.tmp 當(dāng)磁盤重新條帶化完成時(shí),mdadm將自動刪除該關(guān)鍵區(qū)備份文件。 若在重新條帶化對關(guān)鍵區(qū)進(jìn)行操作的時(shí)候發(fā)生了系統(tǒng)崩潰或掉電的情況,則可以利用關(guān)鍵區(qū)備份文件進(jìn)行恢復(fù),命令如下: # mdadm --assemble /dev/md0 --backup-file=/tmp/md0.tmp /dev/sd[a-d]
4.20 在RAID5中拉伸磁盤的大?。? 本小節(jié)要講的是如何將一個RAID5陣列中的每一個磁盤都替換成更大的磁盤,或者更換老化的磁盤,做這樣的拓展的操作思路是這樣的,首先在陣列中停用某塊磁盤,然后把磁盤拆下來,換上一個更大容量的新磁盤,將新磁盤添加到陣列中,此時(shí)將進(jìn)行RAID的修復(fù)動作,等到修復(fù)完成時(shí),再用以上的方法替換掉其余兩塊磁盤,至此,RAID陣列中的全部磁盤都換成了大容量的新磁盤。下一步是拉伸RAID陣列,之后是拉伸RAID上的文件系統(tǒng)。 值得注意的時(shí),在新磁盤還沒有完成數(shù)據(jù)修復(fù)之前,千萬不要急著停用下一塊磁盤,我們知道,RAID5陣列壞了2個磁盤便徹底損壞了。 停用RAID5陣列中的/dev/vg0/disk1: # mdadm --manage /dev/md0 --fail /dev/vg0/disk1 --remove /dev/vg0/disk1 將新磁盤添加到RAID5陣列: # mdadm --manage /dev/md0 --add /dev/vg0/disk2 監(jiān)控?cái)?shù)據(jù)修復(fù)的過程: # watch -n 1 'cat /proc/mdstat' 當(dāng)RAID5陣列中的全部磁盤都被替換成了新磁盤,此時(shí)可以將RAID陣列空間拉伸到最大: # mdadm --grow /dev/md0 --size=max 拉伸RAID5上的文件系統(tǒng): # resize2fs /dev/md0
4.21 在RAID設(shè)備中共享熱備盤: 共享熱備盤應(yīng)用挺廣泛的,硬件級的RAID也提供了這樣的功能,共享熱備盤就是指多個RAID陣列可以共享一塊熱備盤,而不需要為每個陣列都分配熱備盤,這樣可以節(jié)省成本,又不會影響RAID的使用。 在企業(yè)級應(yīng)用中,你的熱備盤數(shù)量應(yīng)該大于等于你陣列的數(shù)量,才能保證足夠的可靠性。 首先應(yīng)該將當(dāng)前的RAID信息刷新到配置文件中: # mdadm --verbose --examine --scan >> /etc/mdadm.conf 選擇一個共享熱備盤組的名字(例如share1)。 在需要加入共享熱備盤的陣列的陣列信息后加入如下參數(shù): Spare-group=share1 添加了熱備盤之后,就可以通過停用某塊磁盤來測試熱備盤是否成功設(shè)置: # mdadm /dev/md0 --fail /dev/sda1 --remove /dev/sda1 當(dāng)停用并移除了/dev/sda1時(shí),熱備盤自動地加入到該陣列并自動地開始陣列的修復(fù)工作。 熱備盤的設(shè)置也可以在RAID震了創(chuàng)建的時(shí)候設(shè)置: # mdadm -C /dev/md0 -l 5 -n 4 -x 1 -c 64 spare-group=share1 /dev/sd[a-e]1 其中,-x指定了熱備盤的數(shù)量,spare-group=share1指定了加入到的共享熱備盤組。
4.22 重命名RAID陣列: 當(dāng)我們需要把本系統(tǒng)中的RAID陣列移植到另一個系統(tǒng)中,但是該系統(tǒng)中已經(jīng)存在了同名的RAID陣列時(shí),我們就需要先對本系統(tǒng)的RAID進(jìn)行重命名。 以下我們將把/dev/md0重命名為/dev/md3。 首先我們要了解RAID由哪些磁盤組成: # mdadm -D /dev/md0 停止RAID陣列: # mdadm --stop /dev/md0 將該RAID陣列重新組裝: # mdadm --assemble /dev/md3 --super-minor=0 --update=super-minor /dev/sda5 /dev/sdb5 此處的--super-minor=0是指定了原來的命名信息(參照/dev/md0),--update=super-minor則是指更新陣列中的超級快信息。
4.23 RAID的Write-intent位圖: RAID的位圖功能是用來記錄哪個RAID的區(qū)域自從上一次同步之后發(fā)生了改變,RAID陣列會周期性地將這些信息寫入到位圖中。 當(dāng)RAID陣列在做同步的時(shí)候發(fā)生了掉電,那么在重新啟動陣列時(shí)將需要一次完全的數(shù)據(jù)同步,如果設(shè)置了Write-intent位圖,則可以知道哪些是沒有同步的,就不需要完全的數(shù)據(jù)同步,就可以極大地減少修復(fù)的時(shí)間。 如果將一個RAID陣列中的某塊磁盤停用移除,再重新添加到該RAID陣列時(shí),RAID陣列將重新為其做數(shù)據(jù)同步,但是如果該陣列設(shè)置了Write-intent位圖,重新添加進(jìn)去后則只需要簡單的同步便實(shí)現(xiàn)了修復(fù)。
4.24 在RAID1開啟Write-intent位圖功能: 位圖文件在創(chuàng)建它之前是沒有存在的。Internal bitmap是存放在陣列的metadata中的,External bitmap是存放在磁盤上的位圖文件,該文件必須保存在除自身RAID陣列以外的介質(zhì)上。 在為RAID陣列開啟Write-intent位圖功能之前,首先要保證陣列已經(jīng)同步了的且superblock超級塊信息是完好的。 保證RAID陣列處于良好的狀態(tài): # mdadm --detail /dev/mdX 添加一個Internal bitmap位圖: # mdadm /dev/md0 --grow --bitmap=internal 監(jiān)控位圖的狀態(tài): #watch -n 1 'cat /proc/mdstat' 關(guān)閉位圖功能: # mdadm /dev/md0 --grow --bitmap=none
4.25 在RAID1開啟Write-behind位圖功能: 該位圖功能默認(rèn)是--write-behind=256,即每當(dāng)有256個對陣列的寫請求時(shí)才進(jìn)行RAID陣列的同步寫操作。 該功能對于利用RAID1實(shí)現(xiàn)異地備份是非常有效的,RAID1的異地備份常常是通過光纖或高速以太網(wǎng)來使本地和異地的磁盤形成RAID1鏡像備份,但是因?yàn)榫W(wǎng)絡(luò)的延時(shí),若每次寫入數(shù)據(jù)時(shí)都要進(jìn)行數(shù)據(jù)的同步則大大影響了寫入的性能,設(shè)置了這個位圖功能則可以使得達(dá)到一定的寫請求時(shí)再進(jìn)行同步操作,可以提高陣列的寫性能。 # mdadm /dev/md0 --grow --write-behind=512
4.26 RAID的錯誤處理和數(shù)據(jù)一致性檢查: RAID陣列總是被動地檢查壞道,RAID的檢查可以修復(fù)邏輯層的壞道,但卻不能修復(fù)物理壞道。 可以通過以下命令開始壞道的檢查: # echo check >> /sys/block/mdX/md/sync_action 監(jiān)控?cái)?shù)據(jù)一致性檢查的過程: # watch -n 1 'cat /proc/mdstat'
|
|
|