1. 摘要
早在1978年美國加州大學伯克利分校就提出了RAID虛擬存儲系統。RAID全稱:Redundant Array of Independent Disk,獨立冗余磁盤陣列。其思想是將多塊獨立的磁盤按不同的方式組合為一個邏輯磁盤,從而提高存儲容量或提升存儲性能或提供數據備份功能。RAID存儲系統的組合方式根據RAID級別定義。
RAID種類:軟件RAID,硬件RAID。在現有的操作系統中如Windows、Linux、Unix等已經集成了軟RAID的功能。軟RAID可以實現與硬件RAID相同的功能,但由於其沒有獨立的硬件控制設備,所以性能不如硬件RAID,但軟RAID實現簡單、不需要額外的硬件設備。硬件RAID通常需要有RAID卡,RAID卡本身會有獨立的控制部件與內存,所以不會占有系統資源,效率高、性能強。當然目前市面上有很多主板已經集成了RAID卡,具體的使用方式可以參考硬件說明書。
現在RAID存儲系統被廣泛應用於生產環境作為存儲解決方案。
******************************************************************************************************
2. RAID級別
RAID根據組合的方式不同有多種設計解決方案,以下介紹幾種常見的RAID方案(RAID級別)。
2.1. RAID 0(不含校驗與冗余的條帶存儲)
多塊磁盤組合為RAID 0後,數據將被分割並分別存儲在每塊硬盤中,所以能最大的提升存儲性能與存儲空間,但無法容錯,RAID 0至少需要兩塊磁盤。存儲原理如下圖:( )為剩余空間。
RAID 0
|
---------------------
| |
(_DATA1_) (_DATA2_)
(_DATA3_) (_DATA4_)
(_DATA5_) (_DATA6_)
(_DATA7_) (_DATA8_)
( ) ( )
( ) ( )
磁盤1 磁盤2
說明:如果有一個文件要寫入RAID 0,則該文件會被分割為多個部分(上圖分割了8個數據塊),DATA1與DATA2被同時分別存入磁盤1與磁盤2,其他部分依次類推。讀取該文件時,將同時從磁盤1與磁盤2中讀取數據。
如果兩塊磁盤的存儲空間為20G,則RAID 0的總存儲空間為40G。
缺點:因為沒有校驗與備份,兩個硬盤中如果有一塊磁盤損壞,即磁盤中的任何一個數據塊損壞將導致整個文件無法讀取。
2.2. RAID 1(不含校驗的鏡像存儲)
多塊磁盤組合為RAID 1後,數據將被同時復制到每塊硬盤中,制作這種磁盤陣列至少需要2塊硬盤,該級別的RAID只要有一塊磁盤可用即可正常工作,該級別的陣列安全行是最好的,磁盤利用率是最低的。
RAID 1
|
-------------------------
| |
(_DATA1_) (_DATA1_)
(_DATA2_) (_DATA2_)
(_DATA3_) (_DATA3_)
(_DATA4_) (_DATA4_)
( ) ( )
( ) ( )
磁盤1 磁盤2
說明:如果有一個文件要寫入RAID 1,則該文件會被分成數據塊寫入磁盤1,同時寫入磁盤2,DATA1與DATA2被同時存入磁盤1與磁盤2,其他部分依次類推。RAID 1寫入數據的效率會降低,因為數據需要同時寫入兩塊硬盤,但RAID 1讀取數據的效率會提升,因為可以同時從兩塊硬盤讀取數據。
2.3 RAID 2(位級別的校驗式條帶存儲)
多塊磁盤組合為RAID 2後,數據將以位(bit)為單位同步式分別存儲在不同的硬盤上,並采用海明碼對數據進行校驗與恢復。
RAID 2
|
--------------------------------
| | |
(_DATA1_) (_DATA2_)(_Parity1_)
(_DATA3_) (_DATA4_)(_Parity2_)
(_DATA5_) (_DATA6_)(_Parity3_)
(_DATA7_) (_DATA8_)(_Parity4_)
( ) ( ) ( )
( ) ( ) ( )
磁盤1 磁盤2 磁盤3
說明:如果有一個文件要寫入RAID 2,則該文件會被分成數據位分別同步寫入到不同的磁盤中,DATA1與DATA2進行海明碼運算後別寫入校驗盤中,其他部分依次類推。RAID 2對大數據量的讀寫具有很高的性能,但少量數據的讀寫時性能反而不好,該磁盤陣列至少需要3塊硬盤。
異或運算:
0 異或 0 = 0
0 異或 1 = 1
1 異或 0 = 1
1 異或 1 = 0
數據1:10010110
數據2:01011001
異或運算結果:11001111
從這些數據可以看出任何一組數據丟失,都可以由另外兩組數據運算恢復!
2.4 RAID 3(字節級別的校驗式條帶存儲)
該級別的磁盤陣列可以參考RAID 2的讀寫原理,僅數據分割的單位為字節。
2.5 RAID 4 (數據塊級別的校驗式條帶存儲)
該級別的磁盤陣列與RAID 5類似,僅校驗數據被寫入至同一塊硬盤中。
RAID 4
|
----------------------------------------------
| | | |
(_DATA1_) (_DATA2_)(_DATA3_) (_Parity1_)
(_DATA4_) (_DATA5_)(_DATA6_)(_Parity2_)
(_DATA7_) (_DATA8_)(_DATA9_)(_Parity3_)
(_DATA10_) (_DATA11_)(_DATA12_)(_Parity4_)
( ) ( ) ( ) ( )
( ) ( ) ( ) ( )
磁盤1 磁盤2 磁盤3 磁盤4
2.6 RAID 5 (數據塊級別的分布式校驗條帶存儲)
RAID 5
|
-------------------------------
| | |
(_DATA1_) (_DATA2_)(_Parity1_)
(_DATA3_) (_Parity2_)(_DATA4_)
(_Parity3_) (_DATA5_)(_Parity4_)
( ) ( ) ( )
( ) ( ) ( )
磁盤1 磁盤2 磁盤3
******************************************************************************************************
3. Linux軟件RAID實例(紅色字體為自己輸入的命令,其他為命令的輸出)
第一步:
查看磁盤信息如下:
#[root@localhost ~]# fdisk -l
Disk /dev/sda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 2610 20860402+ 8e Linux LVM
Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdb doesn't contain a valid partition table
Disk /dev/sdc: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdc doesn't contain a valid partition table
Disk /dev/sdd: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdd doesn't contain a valid partition table
由以上信息可以看出本機有sdb,sdc,sdd三塊硬盤未分區,如果需要在Linux中實現軟RAID,可以將每塊硬盤分一個區組建RAID,同樣可以對硬盤分多個區實現軟RAID,這裡我們每塊硬盤分兩個區。
第二步:
創建硬盤分區:
[root@localhost ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
Command (m for help): n新建分區
Command action可選擇的分區類型有Primary(主分區)和extended(擴展分區)
e extended
p primary partition (1-4)
p這裡選擇主分區
Partition number (1-4): 1分區編號輸入為1
First cylinder (1-261, default 1): 默認從第一個磁柱開始分區(回車即可)
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-261, default 261): +1G輸入分區大小(注意+)
一下方法與上面相同,創建第二個分區:
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (124-261, default 124): (回車)
Using default value 124
Last cylinder or +size or +sizeM or +sizeK (124-261, default 261): (回車)
Using default value 261
這裡輸入t,用來改變分區類型
Command (m for help): t
Partition number (1-4): 1注明修改第一個分區的類型
Hex code (type L to list codes): fd格式為fd,即raid。不清楚格式時可以輸入L查看所有分區類型
Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): fd
Changed system type of partition 2 to fd (Linux raid autodetect)
Command (m for help): p查看硬盤分區結果
Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 123 987966 fd Linux raid autodetect
/dev/sdb2 124 261 1108485 fd Linux raid autodetect
Command (m for help): w保存退出
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
**********************************************
**** 其他兩塊硬盤執行相同操作!!! ****
**********************************************
[root@localhost ~]# partprobe -a自動識別新建的分區
第三步:
創建RAID,這裡僅以RAID0與RAID5為例,其余級別的磁盤陣列操作方法類似
RAID 0
1.創建RAID 0
[root@localhost ~]# mdadm -C /dev/md0 -l 0 -n 3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: array /dev/md0 started.
注釋:-C為創建(create), -l指定RAID級別(level),-n說明磁盤個數
2.查看RAID 0詳細信息
[root@localhost ~]# mdadm --detail /dev/md0查看md0信息
/dev/md0:
Version : 0.90
Creation Time : Thu May 17 03:46:55 2012創建時間
Raid Level : raid0 RAID級別
Array Size : 2963520 (2.83 GiB 3.03 GB)RAID磁盤空間
Raid Devices : 3磁盤個數
Total Devices : 3
Preferred Minor : 0
Persistence : Superblock is persistent
Update Time : Thu May 17 03:46:55 2012
State : clean
Active Devices : 3活動磁盤個數
Working Devices : 3 工作磁盤個數
Failed Devices : 0錯誤磁盤個數
Spare Devices : 0空閒磁盤個數
Chunk Size : 64K
UUID : 62e9bd3e:f4dcf02d:319e2a62:8099eb72設備UUID
Events : 0.1
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 33 1 active sync /dev/sdc1
2 8 49 2 active sync /dev/sdd1
格式化並使用:
[root@localhost ~]# mkfs.ext3 /dev/md0
[root@localhost ~]# mkdir /raid0; mount /dev/md0 /raid0
RAID 5
1.創建RAID 5
[root@localhost ~]# mdadm -C /dev/md1 -l 5 -n 3 -x 1 /dev/sdb2 /dev/sdc2 /dev/sdd2 /dev/sde2
mdadm: array /dev/md1 started.
注釋:-C為創建(create), -l指定RAID級別(level),-n說明磁盤個數,x指定備用設備個數(因為RAID 5允許設備的損壞,因此指定一個備用設備,可以在活動設備損壞時自動替換為備用設備)
2.查看RAID 5詳細信息
[root@localhost ~]# mdadm --detail /dev/md1
/dev/md1:
Version : 0.90
Creation Time : Thu May 17 03:55:31 2012
Raid Level : raid5
Array Size : 2216832 (2.11 GiB 2.27 GB)
Used Dev Size : 1108416 (1082.62 MiB 1135.02 MB)
Raid Devices : 3活動磁盤為3
Total Devices : 4總磁盤數為4,1個為備用磁盤
Preferred Minor : 1
Persistence : Superblock is persistent
Update Time : Thu May 17 03:56:20 2012
State : clean
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 64K
UUID : 6c02bbcd:2a7a1d34:940e387b:ce0fa999
Events : 0.2
Number Major Minor RaidDevice State
0 8 18 0 active sync /dev/sdb2
1 8 34 1 active sync /dev/sdc2
2 8 50 2 active sync /dev/sdd2
3 8 66 - spare /dev/sde2該磁盤為備用磁盤
格式化並使用:
[root@localhost ~]# mkfs.ext3 /dev/md1
[root@localhost ~]# mkdir /raid5; mount /dev/md1 /raid5
4.性能測試對比
**************************
** 普通磁盤:寫入模擬 **
**************************
[root@localhost ~]# time dd if=/dev/zero of=txt bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 21.7965 seconds, 48.1 MB/s
real 0m23.262s
user 0m0.001s
sys 0m2.209s
可以看出對普通磁盤寫入1G的數據所需總時間為23.262秒
*************************
** RAID 0:寫入模擬 **
*************************
[root@localhost raid0]# time dd if=/dev/zero of=txt bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 3.87193 seconds, 271 MB/s
real 0m4.308s
user 0m0.001s
sys 0m1.604s
可以看出對RAID 0寫入1G數據所需總時間為4.308秒
*************************
** RAID 5:寫入模擬 **
*************************
[root@localhost raid5]# time dd if=/dev/zero of=txt bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 12.5047 seconds, 83.9 MB/s
real 0m12.614s
user 0m0.004s
sys 0m3.705s
可以看出由於RAID 5需要生成校驗位數據,所以寫入數據的速度比RAID 0慢,但比普通磁盤快,寫入1G數據所需總時間為12.614秒
5. 故障模擬(RAID 5)
[root@localhost raid5]# mdadm /dev/md1 -f /dev/sdb2
mdadm: set /dev/sdb2 faulty in /dev/md1
注釋:使用-f選項(failed)模擬磁盤sdb2的損壞
由於上面做性能測試時已經往RAID 5中寫入了1G的數據,所以使用命令模擬磁盤損壞後,快速的查看RAID詳細信息可以看出正在使用/dev/sde2重建數據(還原),而本來的/dev/sdb2成為了損壞的空閒設備
[root@localhost ~]# mdadm --detail /dev/md1
... ... ... ... ... ... ...
... ... ... ... ... ... ...
... ... ... ... ... ... ...
Number Major Minor RaidDevice State
3 8 66 0 spare rebuilding /dev/sde2
1 8 34 1 active sync /dev/sdc2
2 8 50 2 active sync /dev/sdd2
4 8 18 - faulty spare /dev/sdb2
最後:現實生產環境中均使用安全、可靠、高效的硬件磁盤陣列,但通過以上實驗可以讓我們對整體的磁盤陣列的原理有個全面而充分的認知!
O了,洗洗睡吧。
本文出自 “丁丁歷險” 博客,請務必保留此出處http://manual.blog.51cto.com/3300438/866143