歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> Linux下RAID磁盤陣列知識

Linux下RAID磁盤陣列知識

日期:2017/3/3 16:37:03   编辑:關於Linux

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

Copyright © Linux教程網 All Rights Reserved