raid简介
RAID全称为 Redundent Array of Idependent Disk(独立硬盘冗余阵列)。RAID是通过专门的RAID控制器或适配器把多块硬盘封装起来,在操作系统看来,一个RAID就相当于一个硬盘。raid可以提升硬盘的读写性能,或者提升数据安全性,或者二者兼有之。
raid基本概念
条带:raid 0 主要用到的原理。把2个硬盘完全对称的划分为固定大小的条带(chunck),当内核需要对硬盘进行写操作时,raid控制器会先把这些数据切分为和条带同样大小的数据块,然后同时写入2块硬盘。raid 0 会大幅度提高数据的读写性能,尤其对于写性能提升近2倍。然而2块硬盘作为一个整体,任意一个硬盘坏了整个RAID就都不能用了。数据的安全性风险就增大了。
镜像:raid 1 主要用到的原理。2个硬盘完全对等的写入同样的数据,数据的存储位置都是一模一样,就像镜像一样。raid 1 由于同样的数据要写2次,因此写性能相比单个硬盘会有些下降,而读性能提升2倍。raid 1 中,任何一个硬盘坏了,raid都可以继续使用,对操作系统没有影响。数据安全性提升,但对硬盘使用效率比较低。
raid分类
目前应用较多的raid包括raid 0、raid 1、raid 4、raid 5、raid 6、raid 0+1、raid 1+0。
raid 0 :前面已经提到过,主要使用条带化技术,将n块硬盘并联起来,从而读写性能都大大提升。
raid 1 :利用镜像技术,使2快硬盘互为备份。其中任意一块坏了,都不影响系统正常运行。系统可用性,数据安全性都大大提升。
raid 4 :使用校验码技术。n块硬盘,前面n-1块作为条带,最为一块盘作为校验码盘。其中任何一块盘损坏,都可以使用算法将数据恢复出来。但如果坏掉两块盘,那么数据就丢失无法恢复了。条带的性能提升较大,校验码盘还要对数据进行计算并存储,成为性能瓶颈。
raid 5 :对raid 4 进行改进,每个硬盘都轮流作为校验码盘。
raid 6 :对raid 5 进行改进,使用2种校验算法,2块校验码盘,即使坏掉2块盘,也可以将数据恢复。
raid 0+1 :先条带后镜像,至少需要4块硬盘。同组内的2个硬盘坏了都可以继续运行,但如果坏的2块硬盘是不同组,数据就无法恢复了。性能、安全性都有很大提升。
raid 1+0 : 先镜像后条带,至少需要4块硬盘。不同组的硬盘各坏掉一个都没事,但是同组互为镜像的2个硬盘都坏了,数据就丢失了。性能、安全性都有很大提升。raid 0+1 和raid 1+0 性能提升上差不多。安全性两个各有千秋,在伯仲之间。如果有一个硬盘损坏,raid 1+0 只需要修复一个硬盘的数据,而raid 0+1 需要修复这一组N个硬盘的数据,因为无法确定是数据在哪一块有损坏,raid 1+0 的修复速度是优于raid 0+1的。从这一点来讲,raid 1+0 更加优越,使用更加广泛。
在LINUX下实现软raid
软raid相对于硬raid来说的。硬raid就是通过硬件的方式来实现raid,就是我们前面说的需要相应的适配器或控制器,来操控数据的分组、读写、校验等。那么软raid就是以软件模拟的方式来实现。linux对设备都是以文件的方式来体现,一个分区在linux中就是一个设备文件,这是linux实现软raid的基础。在内核中有raid的模拟控制算法,通过CPU来模拟计算。软raid实际用途很小,软raid基本都是在一块物理硬盘上实现的,一块盘坏了数据就都用不了了,并不因为做了软raid 1而又所改变。而且软raid并不会提升读写性能,因为硬盘和系统之间的接口还是只有一个,并没有改变。相反,raid因为还要占用CPU,而使得性能有所下降。
通过软raid来模拟raid的实现,以便我们更好的理解raid。
1、使用fdisk命令来建立多个分区
[root@localhost ~]# 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
Partition number (1-4): 1
First cylinder (1-3916, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-3916, default 3916): +500M
如此建立5个分区后,将1、2、3、5、6分区类型改为Linux raid autodetect。w保存退出。
Device Boot Start End Blocks Id System
/dev/sda1 1 65 522081 fd Linux raid autodetect
/dev/sda2 66 130 522112+ fd Linux raid autodetect
/dev/sda3 131 195 522112+ fd Linux raid autodetect
/dev/sda4 196 1305 8916075 5 Extended
/dev/sda5 196 260 522081 fd Linux raid autodetect
/dev/sda6 261 325 522081 fd Linux raid autodetect
partprobe通知内核重读分区表。cat /proc/partition看看内核是否已经读到分区。
2、使用mdadm命令建立raid 1+0
[root@localhost ~]# mdadm -C /dev/md0 -a yes -l 10 -n 4 -x 1 /dev/sda{1,2,3,5,6}
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
mdadm -D /dev/md0 查看raid建立信息。
/dev/md0:
Version : 1.2
Creation Time : Tue Sep 13 06:29:57 2016
Raid Level : raid10
Array Size : 1043456 (1019.17 MiB 1068.50 MB)
Used Dev Size : 521728 (509.59 MiB 534.25 MB)
Raid Devices : 4
Total Devices : 5
Persistence : Superblock is persistent
Update Time : Tue Sep 13 06:30:06 2016
State : clean
Active Devices : 4
Working Devices : 5
Failed Devices : 0
Spare Devices : 1
Layout : near=2
Chunk Size : 512K
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 4a7990f6:00fe2a66:f979de7d:86bc6375
Events : 17
Number Major Minor RaidDevice State
0 8 1 0 active sync /dev/sda1
1 8 2 1 active sync /dev/sda2
2 8 3 2 active sync /dev/sda3
3 8 5 3 active sync /dev/sda5
4 8 6 - spare /dev/sda6
可以看出磁盘sda1,2,3,5组成raid 1+0,linux识别为md0。有一个空闲磁盘sda6,作为替补。cat /proc/mdstat检查内核是否读取到raid信息。
3、格式化raid,挂载(raid作为一个整体,被系统识别为一个设备,相当于一个硬盘)
[root@localhost ~]# mke2fs -j /dev/md0
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
65280 inodes, 260864 blocks
13043 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8160 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 30 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
You have new mail in /var/spool/mail/root
继续挂载,挂载成功
[root@localhost ~]# mount /dev/md0 /mnt/
[root@localhost ~]# ls /mnt/
lost+found
4、模拟一个磁盘坏掉,空闲磁盘可以自动顶上,形成一个完整的raid。
[root@localhost ~]# mdadm /dev/md0 -f /dev/sda5
mdadm: set /dev/sda5 faulty in /dev/md0
[root@localhost ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Tue Sep 13 06:29:57 2016
Raid Level : raid10
Array Size : 1043456 (1019.17 MiB 1068.50 MB)
Used Dev Size : 521728 (509.59 MiB 534.25 MB)
Raid Devices : 4
Total Devices : 5
Persistence : Superblock is persistent
Update Time : Tue Sep 13 06:45:11 2016
State : clean
Active Devices : 4
Working Devices : 4
Failed Devices : 1
Spare Devices : 0
Layout : near=2
Chunk Size : 512K
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 4a7990f6:00fe2a66:f979de7d:86bc6375
Events : 36
Number Major Minor RaidDevice State
0 8 1 0 active sync /dev/sda1
1 8 2 1 active sync /dev/sda2
2 8 3 2 active sync /dev/sda3
4 8 6 3 active sync /dev/sda6
3 8 5 - faulty spare /dev/sda5
5、将坏掉的磁盘sda5移除,新增一个sda,作为空闲磁盘,进行热备。
[root@HF ~]# mdadm /dev/md0 -r /dev/sda5
mdadm: hot removed /dev/sda5 from /dev/md0
[root@HF ~]# mdadm /dev/md0 -a /dev/sda7
mdadm: added /dev/sda7
[root@HF ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Wed Sep 14 02:02:26 2016
Raid Level : raid10
Array Size : 1043456 (1019.17 MiB 1068.50 MB)
Used Dev Size : 521728 (509.59 MiB 534.25 MB)
Raid Devices : 4
Total Devices : 5
Persistence : Superblock is persistent
Update Time : Wed Sep 14 02:06:21 2016
State : clean
Active Devices : 4
Working Devices : 5
Failed Devices : 0
Spare Devices : 1
Layout : near=2
Chunk Size : 512K
Name : HF:0 (local to host HF)
UUID : 44370f88:855b7e5e:9e2d49d9:2d7c76b2
Events : 38
Number Major Minor RaidDevice State
0 8 1 0 active sync /dev/sda1
1 8 2 1 active sync /dev/sda2
2 8 3 2 active sync /dev/sda3
4 8 6 3 active sync /dev/sda6
5 8 7 - spare /dev/sda7