詳細的介紹了獨立硬碟冗餘陣列,並演示了Linux下的軟RAID的實現過程。 ...
獨立硬碟冗餘陣列(RAID,Redundant Array of Independant Disks),舊稱為廉價磁碟冗餘陣列(Redundant Array of Inexpensive Disks)。1987年美國加州伯克利分校的一篇名為《A Case for Redundant Arrays of Inexpensive Disk(RAID)》論文誕生,這標志著RAID技術的開始。
那麼什麼是RAID呢?簡單的來講就是把多個硬碟組合起來,成為一個硬碟陣列組,操作系統會把它當做是一個硬碟,其性能能夠達到甚至超過單個昂貴容量大的硬碟。RAID提供了多種硬碟組合的方式,相比單個硬碟來說,提高了硬碟得I/O能力。多個磁碟之間相互冗餘,提高了耐用性。 RAID的硬碟組合方式有:RAID-0,RAID-1,RAID-2,RAID-3,RAID-4,RAID-5,RAID-6,RAID-7,RAID10,RAID-01,RAID-50,RAID-53,RAID-60,JBOD。RAID的實現模式
Software RAID:
軟體磁碟陣列,由CPU處理和協調一個RAID裡面各個硬碟的作業,這樣就會給CPU帶來較多的運算壓力,分為3種:
1)基於主板的的磁碟陣列:通常上是由主板上的晶元組提供RAID功能。
2)硬體輔助磁碟陣列:需要RAID卡和相關廠商提供的驅動程式,RAID功能是由驅動程式和CPU運算來提供
3)操作系統的RAID功能:Linux、windows Server等操作系統內置的RAID功能
雖然軟RAID實現的有多種,但是在生產環境還是不建議使用的。
Hardware RAID:
硬體磁碟陣列,在RAID卡上內置了CPU處理器,這樣就不占用伺服器的CPU了。一般硬體磁碟陣列都會有備份的電源模塊和NVRAM(非易失性記憶體),當系統斷掉後,備份電源開始供電,將硬碟讀寫的日誌保存在記憶體中,當系統恢復,備份電源關閉供電,再在NVRAM讀取日誌數據,繼續完成上次斷電前沒有完成的作業。
常用RAID介紹
常用的RAID有:RAID0,RAID-1,RAID-5,RAID6,RAID-10,RAID50。
RAID0
RAID0,也稱條帶捲(striping)。在RAID0中,數據會被切成片,按一定順序會被寫到所有的磁碟裡面,如下圖:
若一片數據被切割成了A1-A8,將存儲在一個由2塊Disk組成的RAID0,那麼第一段數據塊A1會被存儲在Disk0中,第二段數據塊A2會被存儲在Disk1中,第三段數據塊會被存儲在Disk0中,以此類推,這一片數據會被均分到2塊磁碟上。
RAID0的優缺點:
1)速度快,寫和讀的能力得到了提高;
2)RAID0沒有冗餘的能力,一旦一塊磁碟出現了故障,則所有的數據都將不會恢復;
3)RAID0需要N塊磁碟才能實現(N>=2);
4)能夠存儲數據的大小為N*min(S1,S2,S3,S4....)
在RAID0中有兩個重要的參數:
條帶寬度:stripe width,它指的是可以被並行寫入的數據塊的個數,也就是實現RAID0中磁碟的個數;
條帶大小:stripe size,它指的是每次寫入磁碟的數據塊的大小,大小一般為2KB或者512KB甚至更大,size越小,數據被分割的次數就越多。stripe size對性能是有一定的影響的,在生產環境中,需要調整好。
RAID1
RAID1,鏡像化,在RAID1中,數據會被覆製成多份,存儲在多個磁碟上,如下圖:
若一片數據將要被存儲,數據會被覆製成多份(取決RAID1的磁碟個數),然後存儲到每一個磁碟上。
RAID1的優缺點:
1)冗餘性和數據的可靠性最高,只要不是磁碟同時損壞了,一般都不會帶來數據丟失的問題;
2)RAID1的容量取決容量最小的那個磁碟,寫入速度也是取決於最小的那個磁碟,較大的磁碟的剩餘空間可 以分區使用,不會造成浪費;
3)RAID1的讀取速度理論上來說是磁碟個數的倍數;
4)RAID1需要N塊磁碟才能實現(N>=2)
5)能夠存儲數據的大小為min(S1,S2,S3...)
RAID3
RAID3,數據類似於RAID0,被條帶化的存儲在多個磁碟中,數據以位元組為單位,與RAID0不同的是,RAID3單獨使用了一塊獨立的磁碟用來存儲數據的奇偶校驗值,如下圖所示:
數據被切片存儲在Disk0-2上,同時計算處奇偶校驗值存儲在Disk3上,這樣即使Disk0-2中損壞一塊磁碟,也能根據奇偶校驗值得到損壞磁碟的數據。
RAID3的優缺點:
1.較高的容錯能力;
2.不適合寫入操作較多的情景,會給校驗盤帶來一定的負載,適合讀取操作較多的應用環境;
3.RAID3需要N塊磁碟(N>=3);
4.能夠存儲數據的大小為(N-1)*min(S1,S2,S3,S4....)。
RAID4和RAID3類似,RAID4不是以位元組為存取單位,RAID4的數據以塊(一般為512位元組)為單位,如下圖:
以塊為單位帶來的好處就是,減少了奇偶檢驗的次數,比如,如果一段數據的大小為10個位元組,在RAID3上可能需要計算2次奇偶檢驗值了,但是在RAID4上,10個位元組都會被放在第一個磁碟上,並不需要計算。
RAID4的優缺點:
1.較高的容錯能力;
2.提高了小量數據的I/O能力;
3.RAID4需要N塊磁碟(N>=3);
4.能夠存儲數據的大小為(N-1)*min(S1,S2,S3,S4....)。
RAID5RAID5可以理解成是RAID0和RAID1的折中方案,把數據條帶化後存儲,並且將數據奇偶檢驗值存儲在所有的硬碟上,如下圖:
數據被條帶化存儲到了磁碟上,並且每個磁碟上都能夠存儲奇偶檢驗值,其讀寫速度和RAID0差不多,可能寫的時候要慢一點,比較要計算奇偶檢驗,這樣,即使壞掉一塊磁碟,只需要更換上好的磁碟,RAID會利用剩下奇偶檢驗去重建磁碟上的數據。
RAID5的優缺點:
1)較高的容錯能力;
2)讀寫速度快;
3)RAID4需要N塊磁碟(N>=3);
4)能夠存儲數據的大小為(N-1)*min(S1,S2,S3,S4....)。
RAID6
與RAID5類似,只是增加了第二個獨立的奇偶檢驗信息塊,使用了兩種不同的奇偶檢驗演算法,如下圖所示:
數據仍然是被條帶化得存儲在磁碟上,但是會計算出兩個獨立的奇偶檢驗值,相對於RAID5來說有更多的I/O操作和計算量,所以RAID6通常不會以軟體來實現,一般會使用硬體實現,RAID6也是最常見的磁碟陣列。
RAID6的優缺點:
1)較高的容錯能力
2)同一RAID6中最多運行同時損壞2塊磁碟,更換磁碟後,數據將被重新計算寫入;
3)RAID6需要N個磁碟(N>=4);
4)RAID容量為(N-2)*min(s1,s2,s3,...)
RAID 01RAID 01是一種混合的磁碟陣列,即是RAID0和RAID1的混合,先做條帶,再做鏡像:
RAID01中,同組RAID0只要出現一個磁碟損壞,那麼這個RAID 0就不能你使用了,值剩下其他組的磁碟運作,可靠性較低。
RAID01的優缺點:
1)數據可靠性低
2)RAID01需要N個磁碟(N>=4)
RAID 10和RAID 01相反,RAID10是先做RAID1,再做RAID0,如下圖所示:
RAID10和RAID01在讀寫速度上沒有什麼太大的差別,但是RAID10的數據安全性比較高,若下圖左邊那組RAID1中磁碟損壞了一個,另外一個也能用,右邊那組RAID1再損壞一個數據也是恢復的,除非一組RAID1中的磁碟都壞掉了。
RAID 10的優缺點:
1)較高的容錯能力
2)RAID10需要N個磁碟(N>=4)
RAID 50
RAID 50是RAID5和RAID0的組合,先做RAID5,再做RAID0,RAID 5至少需要3顆硬碟,因此要以多組RAID 5構成RAID 50,至少需要6顆硬碟,如下圖。
在底層的任意一組或者多組的RAID5中出現了一個磁碟的損壞是可以接受的,但是若出現了2個或者以上的磁碟損壞,整個RAID50就會損壞。
RAID50的優缺點:
1)較高的容錯能力
2)RAID10需要N個磁碟(N>=6)
JBODJust a Bunch of Disks,能夠將多塊磁碟的空間合併起來的一個連續的空間,可靠性較低。
在Linux系統上實現Software RAID
在centos中,使用模塊化得工具mdadm,如果沒有可以使用:
yum -y install mdadm基本用法如下:
命令的語法格式:mdadm [mode] <raiddevice> [options] <component-devices> -C:創建模式 -n #: 使用#個塊設備來創建此RAID; -l #:指明要創建的RAID的級別; -a {yes|no}:自動創建目標RAID設備的設備文件; -c CHUNK_SIZE: 指明塊大小; -x #: 指明空閑盤的個數; -D:顯示raid的詳細信息 mdadm -D /dev/md# 管理模式: -f:標記指定磁碟為損壞 -a:添加磁碟 -r:移除磁碟 停止md設備: mdadm -S /dev/md#
舉例:創建一個可用空間為10G的RAID1設備,文件系統為ext4,有一個空閑盤,開機可自動掛載至/backup目錄。
先來分析一下:RAID1為鏡像磁碟陣列,最少需要2個磁碟,可用空間為10G,即磁碟最小大小為10G即可,我們這裡就使用1塊硬碟的不同分區來模擬各個磁碟,每個10G:
[root@localhost ~]# fdisk -l /dev/sdb Disk /dev/sdb: 128.8 GB, 128849018880 bytes 255 heads, 63 sectors/track, 15665 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0xf9b59c0f Device Boot Start End Blocks Id System /dev/sdb1 1 1306 10490413+ 83 Linux /dev/sdb2 1307 2612 10490445 83 Linux /dev/sdb3 2613 3918 10490445 83 Linux
使用以下命令創建RAID1系統,-C為創建模式,/dev/md0設備文件名,-n 2:使用2個塊設備創建此RAID,-x 1:指定1個空閑盤的,-l:指定硬碟RAID等級,-a yes:自動創建RAID的設備文件,/dev/adb{1,2,3}:指定磁碟位置
[root@localhost ~]# mdadm -C /dev/md0 -n 2 -x 1 -l 1 -c 128 -a yes /dev/sdb{1,2,3} mdadm: Note: this array has metadata at the start and may not be suitable as a boot device. If you plan to store '/boot' on this device please ensure that your boot-loader understands md/v1.x metadata, or use --metadata=0.90 Continue creating array? y mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started.
使用 cat /proc/mdstat 查看RAID構建的進度和預期完成的時間:
unused devices: <none> [root@localhost ~]# cat /proc/mdstat Personalities : [raid1] md0 : active raid1 sdb3[2](S) sdb2[1] sdb1[0] 10482176 blocks super 1.2 [2/2] [UU] [=============>.......] resync = 68.6% (7200128/10482176) finish=0.2min speed=200001K/sec unused devices: <none> [root@localhost ~]# cat /proc/mdstat Personalities : [raid1] md0 : active raid1 sdb3[2](S) sdb2[1] sdb1[0] 10482176 blocks super 1.2 [2/2] [UU] unused devices: <none>查看RAID1的詳情:
[root@localhost ~]# mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Sun Jul 30 05:16:32 2017 Raid Level : raid1 Array Size : 10482176 (10.00 GiB 10.73 GB) Used Dev Size : 10482176 (10.00 GiB 10.73 GB) Raid Devices : 2 Total Devices : 3 Persistence : Superblock is persistent Update Time : Sun Jul 30 05:17:25 2017 State : clean Active Devices : 2 Working Devices : 3 Failed Devices : 0 Spare Devices : 1 Name : localhost.localdomain:0 (local to host localhost.localdomain) UUID : a46c7642:a46e274a:05923aeb:4c1ae0e9 Events : 17 Number Major Minor RaidDevice State 0 8 17 0 active sync /dev/sdb1 1 8 18 1 active sync /dev/sdb2 2 8 19 - spare /dev/sdb3
格式化RAID1為ext4文件系統:
[root@localhost ~]# mkfs.ext4 /dev/md0 mke2fs 1.41.12 (17-May-2010) 文件系統標簽= 操作系統:Linux 塊大小=4096 (log=2) 分塊大小=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 655360 inodes, 2620544 blocks 131027 blocks (5.00%) reserved for the super user 第一個數據塊=0 Maximum filesystem blocks=2684354560 80 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 正在寫入inode表: 完成 Creating journal (32768 blocks): 完成 Writing superblocks and filesystem accounting information: 完成 This filesystem will be automatically checked every 35 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.將/dev/md0掛載到/backup目錄下:
[root@localhost ~]# mount /dev/md0 /backup/ [root@localhost ~]# [root@localhost ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/VolGroup-lv_root 51606140 1122252 47862448 3% / tmpfs 953276 0 953276 0% /dev/shm /dev/sda1 495844 33466 436778 8% /boot /dev/mapper/VolGroup-lv_home 67708512 184084 64085020 1% /home /dev/md0 10317624 154100 9639416 2% /backup
可以使用 -f 將其中的某個磁碟模擬為壞的故障硬碟
[root@localhost backup]# mdadm /dev/md0 -f /dev/sdb1 mdadm: set /dev/sdb1 faulty in /dev/md0再來看一下RAID1的詳細信息,/dev/sdb3狀態變為active
[root@localhost backup]# mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Sun Jul 30 05:16:32 2017 Raid Level : raid1 Array Size : 10482176 (10.00 GiB 10.73 GB) Used Dev Size : 10482176 (10.00 GiB 10.73 GB) Raid Devices : 2 Total Devices : 3 Persistence : Superblock is persistent Update Time : Sun Jul 30 05:37:02 2017 State : clean Active Devices : 2 Working Devices : 2 Failed Devices : 1 Spare Devices : 0 Name : localhost.localdomain:0 (local to host localhost.localdomain) UUID : a46c7642:a46e274a:05923aeb:4c1ae0e9 Events : 38 Number Major Minor RaidDevice State 2 8 19 0 active sync /dev/sdb3 1 8 18 1 active sync /dev/sdb2 0 8 17 - faulty /dev/sdb1
使用 -r 選項能夠移除壞的硬碟
[root@localhost backup]# mdadm /dev/md0 -r /dev/sdb1
mdadm: hot removed /dev/sdb1 from /dev/md0
好的,我們再來添加一塊分區當做磁碟
[root@localhost backup]# fdisk /dev/sdb WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). Command (m for help): n Command action e extended p primary partition (1-4) p Selected partition 4 First cylinder (3919-15665, default 3919): Using default value 3919 Last cylinder, +cylinders or +size{K,M,G} (3919-15665, default 15665): +10G Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. WARNING: Re-reading the partition table failed with error 16: 設備或資源忙. The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8)
咦,有告警!因為當前的磁碟已經有分區被掛載當根文件系統的目錄上了,內核沒有識別,我們來查看/proc/parttions,果真沒有識別
[root@localhost backup]# cat /proc/partitions major minor #blocks name 8 16 125829120 sdb 8 17 10490413 sdb1 8 18 10490445 sdb2 8 19 10490445 sdb3 8 0 125829120 sda 8 1 512000 sda1 8 2 125316096 sda2 253 0 52428800 dm-0 253 1 4096000 dm-1 253 2 68788224 dm-2 9 0 10482176 md0使用以下命令通知內核強制重讀以下磁碟分區表
[root@localhost backup]# partx -a /dev/sdb
添加/dev/sdb4到RAID1
[root@localhost backup]# mdadm /dev/md0 -a /dev/sdb4
mdadm: added /dev/sdb4
查看RAID1的詳細信息,/dev/sdb4成功被加入
[root@localhost backup]# mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Sun Jul 30 05:16:32 2017 Raid Level : raid1 Array Size : 10482176 (10.00 GiB 10.73 GB) Used Dev Size : 10482176 (10.00 GiB 10.73 GB) Raid Devices : 2 Total Devices : 3 Persistence : Superblock is persistent Update Time : Sun Jul 30 05:51:52 2017 State : clean Active Devices : 2 Working Devices : 3 Failed Devices : 0 Spare Devices : 1 Name : localhost.localdomain:0 (local to host localhost.localdomain) UUID : a46c7642:a46e274a:05923aeb:4c1ae0e9 Events : 40 Number Major Minor RaidDevice State 2 8 19 0 active sync /dev/sdb3 1 8 18 1 active sync /dev/sdb2 3 8 20 - spare /dev/sdb4
設置開機可以自動掛載只/backup目錄下,修改配置文件/etc/fstab即可
# # /etc/fstab # Created by anaconda on Fri Jul 28 06:34:35 2017 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/VolGroup-lv_root / ext4 defaults 1 1 UUID=bc67ad74-46b3-4abc-b8a7-c4fb7cd6552a /boot ext4 defaults 1 2 /dev/mapper/VolGroup-lv_home /home ext4 defaults 1 2 /dev/mapper/VolGroup-lv_swap swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 /dev/md0 /backup ext4 defaults 0 0
小知識點: 在查看RAID創建過程的進度時候,可加上watch命令動態查看創建RAID的進度 watch [options] 'COMMAND' 選項 -n# :指定刷新間隔,單位秒
watch -n1 'cat /proc/mdstat'