1. 程式人生 > >2018-2-17Linux系統管理(6)RAID

2018-2-17Linux系統管理(6)RAID

更改 tom 副本 麻煩 imp space 通過 rap 兩個

在這一章當中我們講RAID,我們主要了解的是RAID的基礎概念,了解一下RAID的級別,以及我們如何動手講幾個磁盤或分區創建成為一個RAID分區,之後如何管理和刪除該RAID分區也在本章中進行講解。

一、RAID

RAID的全稱為:Redundant Arrays of Inexpensive Disks,我們稱之為廉價冗余磁盤陣列,不過以現在的磁盤來說可是相當的不廉價,所以說講Inexpensive改為了Independent,稱之為獨立冗余磁盤陣列,在一塊硬盤當中存儲了許多非常重要的數據,萬一該磁盤出現損壞,則計算機的業務會受到終止,數據也會導致丟失,早期的硬盤的速度是很慢的,單個的IO能力也是有限,如果該能力無法得到突破的話,那麽整個的業務能力隨之也會受到影響,用戶體驗就會很差。這樣的話,對於一個網站來說,站在用戶的觀念上,幾乎就沒有什麽價值可言。所以說要突破單塊IO的速度可能裏有限的情況。

在伯克利分校當中有一位教授發表的一篇論文,就是A case for Redudent Arrays of Inexpensive Disks RAID,這個論文的內容我們可以理解為將多塊IDE接口的硬盤通過某種介質當中一塊硬盤來使用,通過不同的組合方式來提高IO能力,甚至於耐用性等特性,那麽RAID這個名字和這種技術就這麽流傳下來了。只不過在以後的企業當中使用SCSI接口的硬盤也使用RAID技術來提高IO的能力及耐用性。

   Berkeley:A case for Redundent Arrays of Inexpensive Disks RAID
     可以將廉價的多塊磁盤,按照某種特定的結構組合起來當作一個設備來使用,提高IO能力或耐用性;

那麽我們將RAID的基本概念和它的特性功能我們來總結一下:

   RAID:將多塊硬盤組織成某種格式當成一個設備組織的技術;

     提高IO能力:
         磁盤並行讀寫;
     提高耐用性:
         磁盤冗余來實現;

二、RAID級別

RAID也是有級別之分的,只不過彼此的級別沒有誰高誰低之分的,它只不過表示的是其磁盤的格式是不一樣的,或者說多塊硬盤組織在一起的工作方式有所不同,這個我們稱之為級別。那麽RAID的實現方式也是分為硬RAID和軟RAID兩種方式來實現,硬RAID是通過RAID控制器或者是RAID擴展卡來實現的,而軟RAID是由系統來實現的,只不過軟RAID不推薦在生產環境中使用。

    級別:多塊磁盤組織在一起的工作方式有所不同;
    RAID的實現方式:
        外接式磁盤陣列:通過擴展卡提供適配能力;
        內接式RAID:主板集成RAID控制器;
        Software RAID:

不過在硬RAID中,前兩種方式是我們是通過BIOS來進行管理的,那麽我們現在介紹一下RAID每個級別的工作方式。剛才我們也講過,RAID級別並沒什麽性能高低或者說級別上下之分,僅僅用於標識磁盤組織形式上的不同,所以這個級別是一種代稱,那麽常用的級別有0-6,其該級別總結如下:

   級別:level
     代稱,知識說明磁盤的組織形式不同
     RAID-0:0, 條帶卷, strip;
     RAID-1:1, 鏡像卷, mirror;
     RAID-2
     ... ...
     RAID-5:
     RAID-6:
     RAID-10:
     RAID-01

2.1 RAID-0

我們先來說一下RAID-0,其實RAID-0就是將多塊IO設備平行並當作一塊IO設備並行組織的一種磁盤結構,例如有兩塊硬盤鏈接到RAID控制器中,存儲數據時,數據流會經過RAID控制器,RAID控制器就會將數據流切分成多塊,這個塊和文件系統的塊並不是一樣的,因為並沒有到文件系統當中,而是將數據切好之後,放置在不同的磁盤裏,那麽數據對於磁盤的占用量有多大,是由RAID控制器自行分割機制處理的,而這個分割的塊稱之為chunk,並不是block,因為這個chunk是由該控制器所決定的,並不是由該磁盤上的文件系統決定。所以,控制器分割好了之後,就會分散到各個磁盤當中,那麽第一個塊給了第一個磁盤,第二個塊給了第二個,以此類推。那麽有10G的文件數據,經過分割之後,每個磁盤就會各得5G左右的數據,使得節約了磁盤空間。這個我們就稱之為條帶化,因為這個條帶化以後,分散到各個磁盤中去存儲。

缺點就是耐用性就會得到下降,例如其中一塊損壞則就無法工作,畢竟沒有冗余能力,所以無法存儲關鍵數據。我們來總結以下RAID-0:

     RAID-O:
         讀、寫性能提升:
         可用空間:N*min(S1,S2,...)
         無冗余能力
         最少磁盤數:2, 2+

技術分享圖片

2.2 RAID-1

RAID-0是一個極端,因為它沒有冗余能力,有些時候數據的關鍵性是非常重要的一件事,其中一塊硬盤壞掉了則業務無法推進,所以我們必須保證既能存儲一些關鍵數據,又能保證業務不會終止,所以就有了RAID-1的概念。對於RAID-1而言,也是存儲剛才那些數據,也是利用至少兩塊磁盤來進行組織,但是這個數據的存儲分割成為chunk之後,每一個磁盤都要存儲一份數據,如果其中一塊硬盤損壞,則不影響數據的正常的讀寫進度,所以該機制是允許一塊硬盤損壞。但是帶來的結果為存儲空間減少了一半左右,讀性能提升,但寫能力沒有提升,還很有可能會下降,因為要創建許多的副本。

     RAID-1:
         讀性能提升,寫能力略有下降;
         可用空間:1*min(S1,S2,...)
         有冗余能力;
         最少磁盤數:2, 2+

技術分享圖片

2.3 RAID-4

RAID-0和RAID-1都是極端,前者性能提升,後者可以冗余。那麽我們也需要一種級別來將這兩個級別都能夠兼具組合起來,RAID-2,3,4就是提供這種能力的,但2和3不常見,我們就直接說RAID-4。對於RAID-4來講,是將3塊以上的磁盤組織成一個RAID,而後在存儲數據時,其中一塊磁盤用於存儲校驗碼,所以當一個數據需要存儲時,仍然將數據切割成chunk,則就變成了第一塊磁盤存儲chunk1,第二塊磁盤存儲chunk2,最後一個磁盤存儲的是數據的校驗碼,進行異或存儲。例如第一塊存儲的是1101,第一個存儲的是0010,則校驗碼為1111,這樣的作用就是,假設第二塊硬盤損壞,通過第一塊和第三塊硬盤進行異或計算,則就得出第二塊所存儲的數據。
異或運算就是數字相同則為0,數字不同則為1。但要如果三塊硬盤當中兩塊同時損壞,則就無法計算,數據則丟失。允許一塊損壞可以,因為更換硬盤之後可以通過計算將數據找回來,沒有更換的話數據可以讀取與寫入,只不過需要通過運算才能得到數據,不過這樣就會對磁盤的壓力非常大,損壞率也會增加,像這種情況一塊硬盤損壞依然在線工作我們就稱之為降級模式,為了保險起見,將損壞的硬盤取出,換上新的硬盤,將業務暫停,用兩塊的硬盤數據對位異或運算生成的數據放置在該磁盤空間裏,這樣就能夠發揮該級別的最大作用,但不能允許兩塊同時損壞。
RAID-4還有一個固有的缺陷,就是將其中一個磁盤當作成了校驗盤,而校驗盤不管是那個磁盤讀取該數據,都得訪問校驗盤來進行校驗,所以比前兩個硬盤的IO壓力還要大,出現性能瓶頸,但是能允許一塊硬盤損壞,使之降級工作,所以需要找塊新的硬盤來進行替換,或者添加一塊在添加一塊新的空閑磁盤。檢測所其中一塊磁盤損壞時,新的空閑磁盤能夠迅速替補上去,之後將損壞的硬盤進行更換,更換完成之後將它變成為空閑磁盤。

技術分享圖片

2.5 RAID-5

剛才在RAID-4中我們講過,將其中一塊磁盤作為校驗盤對於它的IO的讀寫壓力是非常大的,以及有可能會導致性能瓶頸所在。因此,對於RAID-5而言,采用一種循環校驗的方式,比如說,第一塊數據存儲在第一塊磁盤上,第二塊數據存儲在第二塊磁盤上,校驗碼放置的在第三塊磁盤。接著,第三塊數據存儲在第二塊磁盤上,第四塊數據存儲在第三塊磁盤上,那麽校驗碼就放在第一塊磁盤上。在接著,第五塊數據存放於第三塊磁盤上,第六塊數據存儲於第一塊磁盤上,那麽校驗碼放置在第二塊磁盤上。以此類推,輪流存儲,訪問均衡。
一般來講RAID-5的校驗碼的組織格式是由左對齊的方式來對chunk進行布局。

     RAID-5:
         讀、寫性能提升
         可用空間:(N-1)*min(S1,S2,...)
         有容錯能力:1塊磁盤
         最少磁盤數:3, 3+

技術分享圖片

2.6 RAID-6

在RAID-5中,是可以允許損壞一個磁盤,不過要是兩塊損壞也是有可能的,那麽為了防止兩個一同損壞,RAID-6就是提供了此解決方案,用兩塊磁盤做循環校驗,也就是說,校驗碼在每個磁盤上存儲兩次。

    RAID-6:
        讀、寫性能提升
        可用空間:(N-1)*min(S1,S2,...)
        有容錯能力:2塊硬盤
        最少磁盤:4, 4+

技術分享圖片

三、混合類型

RAID-1和RAID-0進行組合我們就稱之為混合類型,通常組合為RAID-10和RAID-01,那麽10就表示先倆倆一組做成RAID-1,在將這些RAID-1做成RAID-0。那麽01就是先分成兩組先做成RAID-0,再將兩組的RAID-0組成RAID-1。

3.1 RAID-10

所謂的RAID-10就表示,假設共有六塊硬盤,先做RAID-1,後做RAID-0,則意味著六塊硬盤倆倆一組,每一組就是一個鏡像卷,共有三組鏡像,磁盤空間率為50%,做成RAID-1,在這個較高的級別之上,我們把三組RAID-1組織成RAID-0即可,所以我們組織數據大致上存儲任何數據先切割成三塊,每一組鏡像卷發一塊,而每一組的數據都要存儲兩份。那麽其中一組鏡像卷中的磁盤損壞,對於該組的磁盤以及其它組的磁盤並不影響,但是某個組裏兩個同時損壞,則麻煩很大,雖然幾率很低。這也是比較理想,也比較靠譜的一種存儲機制。

    RAID-10:
        讀、寫性能提升
        可用空間:N*min(S1,S2,...)/2
        有容錯能力:每組鏡像最多只能壞一塊;
        最少磁盤數:4, 4+

技術分享圖片

3.2 RAID-01

所謂的RAID-01就表示,假設也共有六塊硬盤,則先做RAID-0,把六塊磁盤分成兩組,因為鏡像通常分成兩兩一組,先把其中三塊磁盤做成RAID-0,也就是我們稱為的條帶,然後將這兩組條帶做成鏡像,也就是RAID-1,它們的空間利用率也是50%,把數據chunk成兩塊以後,在較高級別的RAID-1中復制出兩份,第一組一份,第二組一份,而後將每組的數據切割成三片,每組都存儲一片,但相比10來說,切割次數過多,另一個來說就是鏡像卷損壞則有一組無法進行存儲。

技術分享圖片

3.3 JBOD

JBOD的全稱為just a Bunth Of Disk,說白了就是僅僅一組磁盤而已,各個磁盤沒有誰大誰小之分,所以它的功能就是:

    JBOD:just a Bunth Of Disks
        功能:將多塊磁盤的空間合並成一個大的連續空間使用;
        可用空間:sum(S1,S2,...)

我們現在總結以下常用級別:

   常用級別:RAID-0, RAID-1, RAID-5, RAID-50, JBOD

四、實現方式

我們剛才講到過RAID的實現方式共有兩種,分別為:

   實現方式:
     硬件實現方式
     軟件實現方式

由於硬件條件的顯示,硬RAID就不實現了,我們可以實現軟RAID,不過在生產環境中我們不可能使用軟RAID,那麽下面我們在CentOS 6或7中實現軟raid方式來實現。在6中是利用一個內核模塊,該模塊的功能是將多個設備磁盤進行組合,這個模塊的名稱為md模塊(mutil devices),由內核組合成一個設備,抽象之後向用戶空間提供系統調用接口就可以了。

為了與md模塊進行一個通信,我們需要在用戶空間中使用一個管理md模塊的一個工具或命令,該命令為mdadm(multi disk admin)工具,它是一種模式化的工具,支持許多模式,比如管理模式以及追蹤模式。

    CentOS 6上的軟件RAID的實現:
        結合內核中的md(multi devices)
        
        mdadm:模式化的工具
            命令的語法格式:mdadm [mode] <raiddevice> [options] <component-device>
                支持的RAID級別:LINEAR, RAID0, RAID1, RAID5, RAID6, RAID10
                
            模式:
                創建:-C
                裝配:-A
                監控:-F
                管理:-f, -r, -a

那麽就是raid設備,通常在/dev/md#路徑中,不過需要註意的是,CentOS 6和7對md識別是會有變化的,重啟之後很有可能會更改md號,而對於不同的模式來說,其選項也是有所不同的,而可以為任意塊設備。

   <raiddevice>: /dev/md#
   <component-devices>: 任意塊設備

在軟RAID添加一塊硬盤沒有必要,所以我們就以分區為例來創建軟RAID。
首先我們先說一下創建模式:

   -C:創建模式
     -n #:使用#個塊設備來創建此RAID;
     -l #:指明要創建的RAID級別;
     -a {yes|no}:自動創建目標為RAID設備的設備文件;
     -c CHUNK_SIZE:指明塊大小;
     -x #:指明空閑的個數;前提需要是否有冗余功能;

例如:創建一個10G可用的RAID-5:

   # mdadm -C /dev/md0 -a yes -n 3 -x 1 -l 5 /dev/sda{7,8,9,10}

創建並格式化完成之後,我們可以查看該raid分區,我們使用-D選項:

   -D:顯示raid的詳細信息
    mdadm -D /dev/md#

現在我們將該raid設備其中一塊分區標記為損壞,使用-f選項。

   # mdadm /dev/md0 -f /dev/sda7

這時候查看/proc/mdstat,會重新進行位與位之間的同步,我們可以使用watch命令,每個一秒動態顯示該文件的進度。

   # watch -n1 `cat /proc/mdstat`

那麽現在我們將剛才標記為損壞的盤重新添加進去。

   # mdadm /dev/md0 -a /dev/sda7

通過以上的步驟,我們可以基本掌握軟raid的管理操作,那麽我們現在總結以下raid的管理模式。

   管理模式:
     -f:標記指定磁盤為損壞;
     -a:添加磁盤;
     -r:移除磁盤;
    
   觀察md的狀態:
     # cat /proc/mdstat

如果想raid設備停止的話,我們則可以停止該raid設備。

   停止md的狀態:
     mdadm -S /dev/md#

那麽剛才講到的的watch命令就是能夠在指定某個時間動態刷新顯示該命令信息,其命令選項為:

   -n #:刷新時間,單位為秒;

   watch -n# 'COMMAND'


2018-2-17Linux系統管理(6)RAID