RAID简介
RAID(Redundant Array of Independent Disk)独立冗余磁盘阵列,技术是加州大学伯克利分校1987年提出,最初是为了组合小的廉价磁盘来代替大的昂贵磁盘,同时希望磁盘失效时不会使对数据的访问受损失而开发出一定水平的数据保护技术。RAID就是一种由多块廉价磁盘构成的冗余阵列,在操作系统下是作为一个独立的大型存储设备出现。RAID可以充分发 挥出多块硬盘的优势,可以提升硬盘速度,增大容量,提供容错功能够确保数据安全性,易于管理的优点,在任何一块硬盘出现问题的情况下都可以继续工作,不会 受到损坏硬盘的影响。
影响计算机性能的组件一般包括:CPU、主板总线IO、内存IO、硬盘IO、网卡IO。现代处理性能已经很高了,但是计算机整体IO性能较弱,严重影响了计算机性能;现代计算机总线,内存的速度可以达到5G每秒,甚至更高,但是硬盘IO往往较低(硬盘是绝大多数计算机的性能瓶颈)
RAID的实现方式
外接式磁盘阵列:通过扩展提供适配能力
内接式RAID:主板集成RAID控制器
Software RAID:软件方式实现RAID功能
硬RAID技术:基于硬件raid解决方案比基于软件raid技术在使用性能和服务性能上会更胜一筹,具体表现在检测和修复多位错误的能力,错误磁盘自动检测和阵列重建等方面,从安全性能考虑,基于硬件的raid解决方案也是更安全的,因此,在实际的生产场景工作中,基于硬件的raid解决方案应该是我们的首选,互联网公司常用的生产dell服务器,默认就会支持raid0,1。如果raid5,10就需要买raid卡(或者个别配置自带有,购买前,看参数)
软RAID技术:在Linux下安装系统的过程中或者安装系统后通过自带的软件就能实现raid功能,使用软raid可省去购买硬件raid控制器和附件就能极大地增强磁盘的IO性能和可靠性,由于是用软件实现的raid功能,所以它配置灵活,管理方便,同时使用软件raid,还可以将几个物理磁盘合并成一个更大的虚拟设备,从而达到性能改进和数据冗余的目的
如何操作实现RAID
在安装操作系统之前通过BIOS进行设置,此种方试主要目的在于将操作系统安装在RAID之上
在安装操作系统之后通过BIOS或软件进行设置,此种方式主要目的在于将操作系统和其他专用分区(如数据盘)独立开来
为什么使用RAID
磁盘阵列可以把多个磁盘驱动器通过不同的连接方式连接在一起协同办公,大大提高了读写速度,同时把磁盘系统的可靠性提高到接近无错的境界,使其可靠性极高。
提高数据安全性;提升数据读写性能;提供更大的单一逻辑磁盘数据容量存储
RAID级别
RAID-0(又称为Stripe或Striping 条带)
即Data Stripping数据分条技术。RAID 0可以把多块硬盘连成一个容量更大的硬盘群,可以提高磁盘的性能和吞吐量。RAID 0没有冗余或错误修复能力,成本低,要求至少两个磁盘,一般只是在那些对数据安全性要求不高的情况下才被使用。
RAID 0的工作方式:
如下图所示:系统向三个磁盘组成的逻辑硬盘(RADI 0 磁盘组)发出的I/O数据请求被转化为3项操作,其中的每一项操作都对应于一块物理硬盘。我们从图中可以清楚的看到通过建立RAID 0,原先顺序的数据请求被分散到所有的三块硬盘中同时执行。从理论上讲,三块硬盘的并行操作使同一时间内磁盘读写速度提升了3倍。 但由于总线带宽等多种因素的影响,实际的提升速率肯定会低于理论值,但是大量数据并行传输与串行传输比较,提速效果显著显然毋庸置疑。
RAID 0的特点
在读写的时候可以实现并发,所以相对其读写性能最好,每个磁盘都保存了完整数据的一部分,读取也采用并行方式,磁盘数量越多,读取和写入速度越快。因为没有冗余,一个硬盘坏掉全部数据丢失。至少两块硬盘才能组成Raid0阵列。
读写性能:所有硬盘速度之和
空间利用率:所有硬盘空间之和
容错能力:无
最少磁盘数:2,2+
生产应用场景
RAID 0具有的特点,使其特别适用于对性能要求较高,而对数据安全不太在乎的领域,如图形工作站等。对于个人用户,RAID 0也是提高硬盘存储性能的绝佳选择。
负载均衡集群下面的多个相同RS节点服务器
分布式文件存储下面的主节点或CHUNK server
MySQL主从复制的多个slave服务器
对性能要求很高,对冗余要求很低的相关业务
RAID-1
RAID-1的工作方式:
如图所示:当读取数据时,系统先从RAID1的源盘读取数据,如果读取数据成功,则系统不去管备份盘上的数据;如果读取源盘数据失败,则系统自动转而读取备份盘上的数据,不会造成用户工作任务的中断。当然,我们应当及时地更换损坏的硬盘并利用备份数据重新建立Mirror,避免备份盘在发生损坏时,造成不可挽回 的数据损失。
RAID-1 的特点
由于对存储的数据进行百分之百的备份,在所有RAID级别中,RAID 1提供最高的数据安全保障。同样,由于数据的百分之百备份,备份数据占了总存储空间的一半,因而Mirror(镜像)的磁盘空间利用率低,存储成本高。 Mirror虽不能提高存储性能,但由于其具有的高数据安全性,使其尤其适用于存放重要数据,如服务器和数据库存储等领域。
读写性能:读性能为所有硬盘速度之和,写性能会有所减弱
空间利用率:所有磁盘中最小的那块
容错能力:只要1块硬盘正常,数据就正常
最少磁盘数:2,2+
RAID2、3、4、6都类似于5用到校验技术,很少使用
RAID-5
RAID-5 的工作方式:
RAID 5 是一种存储性能、数据安全和存储成本兼顾的存储解决方案。 以四个硬盘组成的RAID 5为例,其数据存储方式为,图中,p为A1,A2和A3的奇偶校验信息,其它以此类推。由图中可以看出,RAID 5不对存储的数据进行备份,而是把数据和相对应的奇偶校验信息存储到组成RAID5的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘 上。当RAID5的一个磁盘数据发生损坏后,利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。
RAID-5 的特点
读写性能:读性能接近RAID0,写性能较RAID0弱一些
空间利用率:(n-1)/n
容错能力:可接受1块硬盘损坏
最少磁盘数:3,3+
RAID-6
RAID6最少使用4块硬盘,RAID6与RAID5类似,读写数据的时候会将数据分布式的读写在所有硬盘上,并保存奇偶校验信息,但是会比RAID5多保存一份校验信息,所以冗余性较RAID5有所提升
RAID-6的特点
读写性能:读性能接近RAID0,写性能较RAID0弱一些
空间利用率:(n-2)/n
容错能力:可接受2块硬盘损坏
最少磁盘数:4,4+
RAID1+RAID0
如下图所示,把磁盘两两拆成一组,做RAID-1,然后把RAID-1组合成 RAID-0。数据存储时,首先在 RAID-0 级别,将数据拆解成两部分,然后分配到两组 RAID-1的磁盘中,各 RAID-1 再将各自存储的那部分数据,分别存储在下面的两块磁盘中。
性能表现:读、写提升
冗余能力:有
空间利用率:1/2
至少需要4块
RAID0+RAID1
性能表现:读、写提升
冗余能力:有
空间利用率:1/2
至少需要4块
RAID5+ RAID0
性能表现:读、写提升
冗余能力:有
空间利用率:(n-2)/n
至少需要6块
jbod(just a bunch of disks,简单磁盘捆绑或简单驱动捆绑)
RAID系统在多个磁盘上冗余地存储了同样的数据,而这多个磁盘在操作系统看来就像一个磁盘。虽然JBOD也让多个磁盘看来似乎只有一个,但它是通过把多个驱动器合并成一个大的逻辑磁盘来做到这一点的。JBOD使用独立的磁盘并没有带来任何好处,也不能提供任何RAID所能带来的容错或是更好的性能等好处
性能表现:无提升
冗余能力:无
空间利用率:100%
至少需要2块
Linux 下软件RAID的实现
扩展知识:
RAID机制通过使用多硬盘并行工作的方式来提高硬盘的IO性能;RAID共有7级:RAID0-RAID6
每种操作系统都有软件RAID,在Linux系统中软件RAID通过mdadm这个程序实现,mdadm支持的RAID级别有:RAID0、RAID1、RAID4、RAID5、RAID6;mdadm可以给予多块硬盘、分区或逻辑卷等块设备创建为软件RAID
创建好的软件RAID对应/dev/md#,如第一个创建的RAID为/dev/md0,第二个为/dev/md1;RAID的信息保存在/proc/mdstat文件中,或通过mdadm命令查看
创建软件RAID(指定分区类型为Linux raid auto编号为fd)
创建RAID
mdadm -C /dev/md0 -a yes -l 0 -n 2 /dev/sdb /dev/sdc
-C 创建一个新的RAID
-a 在/dev/下自动创建对应的设备文件
-l 指定要创建的RAID级别
-n 指定硬盘的数量
创建好RAID之后,我们需要创建一个配置文件(默认是没有该文件的),要不然重启RAID就没有了
mdadm -Ds > /etc/mdadm.conf
创建文件系统之后挂载使用了
mkfs.ext4 /dev/md0
mount /dev/md0 /mnt
添加自动挂载配置到/etc/fstab文件中
echo "/dev/md0 /mnt ext4 defaults 0 0" >> /etc/fstab
查看RAID信息
直接使用mdadm命令查看RAID相关信息
mdadm -D /dev/md0
通过查看/proc/mdstat文件中RAID相关信息
cat /proc/mdstat
创建其它软件RAID
在创建RAID5和RAID6的时候在创建完后要通过cat /proc/mdstat去确认查看一下是否创建完成,中间会有一个同步的过程
创建RAID1:
mdadm -C /dev/md0 -a yes -l 1 -n 2 /dev/sdb /dev/sdc
创建RAID5:
mdadm -C /dev/md0 -a yes -l 5 -n 3 /dev/sdb /dev/sdc /dev/sdd
创建RAID6:
mdadm -C /dev/md0 -a yes -l 6 -n 4 /dev/sdb /dev/sdc /dev/sdd /dev/sde
我们也可以使用-x参数指定一个备份磁盘,备份磁盘一般不使用,当出现故障磁盘时,指定的备份磁盘可以自动上线工作:
mdadm -C /dev/md0 -a yes -l 5 -n 3 -x 1 /dev/sdb /dev/sdc /dev/sdd /dev/sde
控制RAID
我们可以通过以下命令关闭一个RAID,关闭前先卸载
mdadm -S /dev/md0
在停掉RAID设备后,将该RAID的硬盘去创建其他RAID的时候要对前面RAID设备进行一个彻底的清除,要不然硬盘中还保存了相关的RAID的superblock信息,删除后整个RAID就不能使用的
mdadm --zero-superblock /dev/sdb
mdadm --zero-superblock /dev/sdc
通过以下命令可以启用指定RAID
mdadm -R /dev/md0
故障模拟
实验环境下,我们可以通过以下命令模拟一个磁盘故障
mdadm /dev/md0 -f /dev/sdb
可以将故障磁盘移除
mdadm /dev/md0 -r /dev/sdb
换上新的硬盘,我们可以将新硬盘添加到RAID中
mdadm /dev/md0 -a /dev/sdb
创建RAID出现该错误时
Warning: WARNING: the kernel failed to re-read the partition table on /dev/sda (Device or resource busy). As a result, it may not reflect all of your changes until after reboot.
可以通过以下方法解决,关闭SELinux
setenforce 0
软件RIAD:
需要内核支持md(multi diask)模块
mdadm命令可以将任何块设备做成RAID(分区、逻辑卷LVM)
mdadm是一个模式化的命令
创建模式
-C
创建模式专用选项:
-l 指定RAID级别
-n # 指定设备个数
-a {yes|no} 是否自动为其创建设备文件
-c CHUNK大小 默认为64K,大小只能为2^n(条带时候的大小)
-x # 指定热备空闲盘个数
管理模式
--fail(-f) 模拟磁盘损坏
mdadm /dev/md# --fail /dev/sda7
--remove(-r) 删除损坏磁盘
mdadm /dev/md# --remove /dev/sda7
--add(-a) 注意与创建模式的-a区分,添加新的磁盘到RAID,也可以向正在使用的阵列中加入新的磁盘(添加的磁盘一定要跟之前的大小一样)
mdadm /dev/md# --add /dev/sda7
监控模式
-F
增长模式
-G
装载模式(停用的阵列要启用需要要先装载,然后再用-R启用才能正常使用)
-A
mdadm -A /dev/md# /dev/sda7 /dev/sda8
停止阵列:不用了停止掉RAID阵列,长选项--stop
mdadm -S /dev/md#
启用陈列:装载后再启用
mdadm -R /dev/md#
查看阵列的详细信息,长选项--detail
mdadm -D /dev/md#
将当前RAID信息保存至配置文件,以便以后进行装配
mdamd -Ds > /etc/mdadm.conf
注意:
软RAID每一次生成一个CHUNK的时候都要计算一下相当于多少个磁盘块,所以在格式化RAID的时候可以指定CHUNK的大小为block的多少倍,这样就不用每次都计算了,可以优化RAID的性能(下面的例子CHUNK的大小为64K)
CHUNK除以block等于-E参数指定的stride的值(就是CHUNK是block的多少倍)
mke2fs -j -E stride=16 -b 4096 /dev/md0
-E 指定条带大小是block的多少倍
Stride=16 指定的CHUNK是block的多少倍
-b 指定格式化的block的大小
watch 周期性地执行指定命令,并以全屏方式显示结果
watch -n # 'COMMAND'
-n # 指定周期长度,单位为秒,默认为2s