Linux運維---磁碟存儲-2. RAID

来源:https://www.cnblogs.com/shiyw/archive/2020/02/27/12371956.html
-Advertisement-
Play Games

隨著單塊磁碟在數據安全、性能、容量上呈現出的局限,磁碟陣列(Redundant Arrays of Inexpensive/Independent Disks,RAID)出現了,RAID把多塊獨立的磁碟按不同的方式組合起來,形成一個磁碟組,以獲得比單塊磁碟更高的數據安全、性能、容量。 一. 常見的R ...


隨著單塊磁碟在數據安全、性能、容量上呈現出的局限,磁碟陣列(Redundant Arrays of Inexpensive/Independent Disks,RAID)出現了,RAID把多塊獨立的磁碟按不同的方式組合起來,形成一個磁碟組,以獲得比單塊磁碟更高的數據安全、性能、容量。

一. 常見的RAID 級別

RAID有RAID0~RAID7幾種級別,另外還有一些複合的RAID模式,比如:RAID10、RAID01、RAID50、RAID53。

常用的RAID模式有RAID0、RAID1、RAID5、RAID10。

  1. RAID0

RAID0也就是常說的數據條帶化(Data Stripping),數據被分散存放在陣列中的各個物理磁碟上,需要2塊及以上的硬碟,成本低,性能和容量隨硬碟數遞增,在所有的RAID級別中,RAID 0的速度是最快的,但是RAID 0沒有提供冗餘或錯誤修複能力,如果一個磁碟(物理)損壞,則所有的數據都無法使用。

對於有容災模式的RAID陣列,某塊磁碟損壞時,只要換上新的硬碟即可,陣列系統會自動同步數據到新的硬碟。(不支持熱插拔的話,需要先關機再開機)

  1. RAID1

RAID1也就是常說的數據鏡像(Data Mirroring),2塊及以上的硬碟(偶數個),被分為2組,數據在每組磁碟中各有一份,若其中一組有磁碟損壞,另一組可以保證數據訪問不會中斷。RAID1同RAID0一樣,有很好的讀取速度,但是寫的速度,有所下降。

  1. RAID5

RAID 5 是一種數據安全、性能、容量、成本、可行性都相對兼顧的解決方案,正因此,類似的RAID2、RAID3、RAID4、RAID6很少得以實際應用。 RAID5需要3塊及以上的硬碟, 它不是對存儲的數據直接進行備份,而是把數據和相對應的奇偶校驗信息存儲到組成陣列的各個磁碟上,簡單來說就是:任意壞掉一塊盤時,另外的N-1塊盤可以利用奇偶校驗信息,把這塊壞掉的磁碟上的數據恢復出來。 RAID 5可以理解為是RAID 0和RAID 1的折衷方案,有和RAID 0相近似的數據讀取速度,有比RAID1低的容災能力(RAID5只允許一塊磁碟損壞),因為多了奇偶校驗信息,寫入數據的速度比RAID1慢。

  1. RAID10

RAID10,名稱上便可以看出是RAID0與RAID1的結合體,顯然需要至少4塊磁碟。不過,先RAID0後RAID1,還是先RAID1後RAID0,是不一樣的。

RAID01,是先做RAID0,然後對2組RAID0再做RAID1,假設此時某個RAID0壞掉一塊磁碟,這個RAID0隨即不可用,所有的IO全部指向剩下的那個RAID0;

RAID10,是先做RAID1,然後對2組RAID1再做RAID0,假設此時某個RAID1壞掉一塊磁碟,當前RAID1仍然能提供服務,並且另一個RAID1也同時可以壞掉一塊磁碟。

所以,我們通常選擇RAID10,而不是RAID01。

  1. 不同RAID級別的讀寫性能

假設都用4塊磁碟,RAID0,RAID1,RAID5,RAID10在多線程/多CPU情況下,都可以同時讀取多塊磁碟,讀的性能都很不錯; 寫的性能(IOPS)依次遞減,大致是:RAID0 > RAID10 > RAID1 > RAID5。 二. RAID的空間計算

在做RAID時,通常選擇統一規格的磁碟,如果真的有不同空間大小、不同讀寫速度的磁碟,陣列系統會以空間小、速度低的為標準,空間大、速度高的磁碟向下相容。比如:100G,50G的2塊磁碟做RAID0,得到的空間為50G*2 = 100G。

RAID的空間計算公式: RAID0的空間:Disk Size * N RAID1的空間:(Disk Size * N)/2 RAID5的空間:((N-1)/N) * (Disk Size * N) = (N-1) * Disk Size RAID10的空間:(Disk Size * N/2)/2 + (Disk Size * N/2)/2 = (Disk Size * N)/2

假設都用4塊磁碟,每塊磁碟都為100G RAID0的空間:100G * 4 = 400G RAID1的空間:(100G * 4)/2 = 200G RAID5的空間:(4-1) * 100G = 300G RAID10的空間: (100G * 4)/2 = 200G 三. RAID的IOPS計算

  1. 單塊硬碟的IOPS是固定的 關於單塊磁碟IOPS的計算,中有詳細的方法,但通常這個值是相對固定的,不需要重覆計算,參考如下:

可以發現,同樣轉數,不同型號的單塊磁碟,IOPS都維持在一個類似的數量級。

  1. RAID的IOPS計算 有了單塊磁碟的IOPS,那麼多塊磁碟的IOPS計算就很簡單了,比如,對於RAID0或者單純串聯磁碟(JBOD: just a bunch of disks)的存儲來說,10塊175 IOPS的磁碟的總IOPS就是10*175 = 1750 IOPS。 但是對於其他RAID級別並不是這樣,因為RAID有多次寫IO的開銷存在,簡單來說就是:對RAID發起一次寫IO,RAID內部會有不止一次的寫IO發生,RAID內部的IO開銷如下:

從圖中得到公式:用戶讀IO+N*用戶寫IO = 總IOPS (N就是RAID內部的IO開銷次數)

假設用戶讀寫請求各一半(50%),同樣還是以10塊175 IOPS的磁碟為例: 50% * 用戶總IO請求數 + N * (50% * 用戶總IO請求數) = 175 IOPS * 10

以RAID1為例,那麼N = 2,上式變為:1.5 *用戶總IO請求數 = 1750 IOPS 用戶總IO請求數 = 1167 IOPS 這就是10塊175 IOPS的磁碟做了RAID1,所能提供的IOPS。

可參考寫懲罰(write penalty)

  1. RAID的IOPS計算在現實中的應用 在實際使用中,我們通常不是計算現有RAID的IOPS,而是反過來:選擇好磁碟規格,RAID模式,測試出系統的讀寫比例,系統需要達到的IOPS,然後看看,需要多少塊硬碟來完成陣列,才能達到這樣的IOPS需求?

假設:選擇了175 IOPS的磁碟,做RAID1,系統讀寫比例為60%:40%,系統需要達到2000 IOPS 問:要配置多少塊這樣規格的硬碟?

把上面的公式改為通用公式: reads * WorkloadIOPS + writesimpact * (writes * Workload_IOPS) = 175 * M 60% * 2000 + 2 * (40% * 2000) = 175 * M M = 16 (也就是說,要達到指定的2000 IOPS,RAID1需要配置16塊175 IOPS的磁碟)

可能有人會覺得,系統的讀寫請求比例,系統需要達到多少IOPS,並不知道,如果沒有前期測試的話,那麼只能根據經驗來估測了。 四. RAID在資料庫存儲上的應用

以SQL Server資料庫為例,看下不同的RAID級別適用於什麼場景: RAID0,由於沒有容災機制,很少被單獨使用。

RAID1,操作系統、SQL Server實例、日誌文件; RAID5,數據文件,備份文件; RAID10,所有類型都適用,不過考慮成本,通常不會全部使用RAID10。 五、使用mdadm創建RAID 創建RAID陣列

我們可以通過 mdadm 命令來創建軟體RAID,比如下麵命令可以創建一個RAID5

sudo mdadm --create /dev/md0 -a yes -l 5 -n 3 /dev/sdb /dev/sdc /dev/sdd -x  1 /dev/sde  

其中

--create /dev/md0 創建一個新RAID,名字叫做 /dev/md0 -a yes 自動在/dev/下創建對應的RAID陣列設備 -l 5 指定RAID級別為5 -n 3 指定硬碟數量。表示用三塊硬碟來創建RAID5,分別為 /dev/sdb, /dev/sdc, /dev/sdd

我們會發現 /dev 下出現了一個名為 md0 的設備

ls -l /dev/md0

brw-rw----. 1 root disk 9, 0 Sep 11 09:40 /dev/md0

自動啟用RAID

在創建好RAID以後,可以將RAID信息保存到 /etc/mdadm.conf 文件中,這樣在下次操作系統重新啟動時,系統會自動載入這個文件來啟用RAID

sudo mdadm -D --scan >/etc/mdadm.conf
cat /etc/mdadm.conf

ARRAY /dev/md0 metadata=1.2 name=MiWiFi-R3-srv:0 UUID=ece6c656:c9999ff6:9d17c0ec:08a0e3af

查看RAID陣列信息

創建好RAID陣列後,我們可以通過 mdadm --misc 模式來查看剛創建好的RAID的詳細信息

mdadm --misc --detail /dev/md0

/dev/md0:
           Version : 1.2
     Creation Time : Tue Sep 11 09:40:45 2018
        Raid Level : raid5
        Array Size : 16758784 (15.98 GiB 17.16 GB)
     Used Dev Size : 8379392 (7.99 GiB 8.58 GB)
      Raid Devices : 3
     Total Devices : 3
       Persistence : Superblock is persistent

       Update Time : Tue Sep 11 10:03:35 2018
             State : clean 
    Active Devices : 3
   Working Devices : 3
    Failed Devices : 0
     Spare Devices : 0

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : resync

              Name : MiWiFi-R3-srv:0  (local to host MiWiFi-R3-srv)
              UUID : ece6c656:c9999ff6:9d17c0ec:08a0e3af
            Events : 18

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       3       8       48        2      active sync   /dev/sdd

或者我們也可以通過 /proc/mdstat 文件來查看RAID的簡潔信息

cat /proc/mdstat

Personalities : [raid6] [raid5] [raid4] 
md0 : active raid5 sdd[3] sdc[1] sdb[0]
      16758784 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>

使用RAID陣列

在創建好RAID陣列後,我們就不能直接操作組成陣列的磁碟了,否則會損壞剛創建好的RAID陣列。 我們通過 /dev/md0 這個設備來進行文件格式化和掛載

set -x
exec 2>&1
mkfs.xfs -f /dev/md0
mount /dev/md0 /mnt
mount |grep md0

+ mkfs.xfs -f /dev/md0
meta-data=/dev/md0               isize=512    agcount=16, agsize=261760 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=4188160, imaxpct=25
         =                       sunit=128    swidth=256 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=8 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
+ mount /dev/md0 /mnt
+ mount
+ grep md0
/dev/md0 on /mnt type xfs (rw,relatime,seclabel,attr2,inode64,sunit=1024,swidth=2048,noquota)

關閉RAID

我們可以通過 mdadm --misc 模式來關閉RAID。這會釋放所有資源

在關閉RAID之前需要先卸載RAID:

sudo umount /mnt

然後關閉RAID

sudo mdadm --misc --stop /dev/md0

關閉RAID後,我們可以通過 mdadm --misc --zero-superblock 來清空磁碟中RAID陣列的超級塊信息。 清空就能夠正常使用這些磁碟了

mdadm --misc --zero-superblock /dev/sdb
mdadm --misc --zero-superblock /dev/sdc
mdadm --misc --zero-superblock /dev/sdd

模擬RAID故障

我們可以通過 mdadm --manage /dev/md0 --fail 來將某塊磁碟設置成故障狀態

sudo mdadm /dev/md0 -f /dev/sdd 2>&1

mdadm: set /dev/sdd faulty in /dev/md0

然後我們再來查一下這個RAID的信息

sudo mdadm --misc --detail /dev/md0

/dev/md0:
           Version : 1.2
     Creation Time : Tue Sep 11 10:32:21 2018
        Raid Level : raid5
        Array Size : 16758784 (15.98 GiB 17.16 GB)
     Used Dev Size : 8379392 (7.99 GiB 8.58 GB)
      Raid Devices : 3
     Total Devices : 3
       Persistence : Superblock is persistent

       Update Time : Tue Sep 11 10:35:12 2018
             State : clean, degraded 
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 1
     Spare Devices : 0

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : resync

              Name : MiWiFi-R3-srv:0  (local to host MiWiFi-R3-srv)
              UUID : c031d0c9:998a4e86:5cf90e71:52b229cd
            Events : 20

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       -       0        0        2      removed

       3       8       48        -      faulty   /dev/sdd

你會發現 /dev/sdd 的狀態現在變成了 faulty, 但是RAID5這個級別是允許一塊磁碟損壞而不造成數據損壞的。 移除RAID陣列中的磁碟

sudo mdadm --manage /dev/md0 --remove /dev/sdd

更換新磁碟

set -x
exec 2>&1
sudo mdadm --manage /dev/md0 --add /dev/sdd
sudo mdadm --misc --detail /dev/md0

+ sudo mdadm --manage /dev/md0 --add /dev/sdd
mdadm: added /dev/sdd
+ sudo mdadm --misc --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Tue Sep 11 10:32:21 2018
        Raid Level : raid5
        Array Size : 16758784 (15.98 GiB 17.16 GB)
     Used Dev Size : 8379392 (7.99 GiB 8.58 GB)
      Raid Devices : 3
     Total Devices : 3
       Persistence : Superblock is persistent

       Update Time : Tue Sep 11 10:40:41 2018
             State : clean, degraded 
    Active Devices : 2
   Working Devices : 3
    Failed Devices : 0
     Spare Devices : 1

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : resync

              Name : MiWiFi-R3-srv:0  (local to host MiWiFi-R3-srv)
              UUID : c031d0c9:998a4e86:5cf90e71:52b229cd
            Events : 22

    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       -       0        0        2      removed

       3       8       48        -      spare   /dev/sdd​

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • find 解釋 語法 示例 ...
  • ln 解釋 語法 示例 軟鏈接 硬鏈接 軟鏈接和硬鏈接區別 ...
  • 目錄 mkdir cd pwd rmdir cp mv rm mkdir 解釋 語法 示例 cd 解釋 語法 示例 pwd 解釋 語法 示例 rmdir 解釋 語法 示例 cp 解釋 語法 示例 mv 解釋 語法 示例 rm 解釋 語法 示例 ...
  • 目錄 touch cat more less head tail touch 解釋 語法 示例 cat 解釋 語法 示例 more 解釋 語法 示例 less 解釋 語法 示例 head 解釋 語法 示例 tail 解釋 語法 示例 ...
  • 目錄處理命令:ls 解釋 語法 ls 列出當前目錄下的所有文件(沒有隱藏的) ls a ls l 列出當前目錄下所有的文件的詳細信息 詳細解釋 第一個單獨解釋 ls lh 列出文件詳細信息,文件單位由系統判定顯示,或顯示K,或現實M 解釋 ls ld 查看目錄的詳細信息,而不是文件夾下的文件信息 l ...
  • 距離centos8.0(現在已經更新到8.1了)的發佈已經過去幾個月了,作為一個剛剛接觸過幾個月centos的萌新來說,本文想通過實際的操作體驗來說對比一下centos8代與7代 首先,centos8 dvd版的鏡像有7G大,也是我目前安裝過最大的操作系統鏡像了,首先從官網下載後,安裝的時候就踩了一 ...
  • 文件目錄結構 閑話篇: linux我也是最近才開始學,寫隨筆是為分享學習經驗的同時也留著供自己以後來參考。因為linux一切皆文件的基本哲學思想。所以我決定從文件目錄開始寫。 正文: 首先linux文件系統格式為ext3/4(ext是extended的縮寫,意為擴展,全稱linux擴展文件系統),這 ...
  • Everspin 是設計,製造和商業銷售離散和嵌入式磁阻RAM(MRAM)和自旋傳遞扭矩MRAM(STT-MRAM)的全球領導者,其市場和應用領域涉及數據持久性和完整性,低延遲和安全性至關重要。Everspin在數據中心,雲存儲,能源,工業,汽車和運輸市場中部署了超過1.2億個MRAM和STT-MR ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...