开发者学堂课程【Linux 磁盘与文件系统管理:RAID 工作原理与实现】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/589/detail/8332
RAID 工作原理与实现
内容简介:
一、什么是 RAID
二、RAID 级别
三、操作实例
一、什么是 RAID
RAID :Redundant Arrays of Inexpensive(Independent) Disks 1988年由加利福尼亚大学伯克利分校 (UniversityofCalifornia-
Berkeley) ACase for Redundant Arrays of Inexpensive Disks" 多个磁盘合成一个“阵列”来提供更好的性能、冗余,或者两者都提供
//两个在组织磁盘空间的两种常见技术,那第一种是 read,那第二是逻辑卷,
Redundant Arrays of Inexpensive(Independent) Disks
//这是它的含义。
//早期的时候,raid 的含义是较廉价的磁盘冗余阵列。
//inexpensive,便宜的,廉价的。
inexpensive 的目的是早期生产中用的那个服务器上的磁盘价格昂贵,所以,有个加利福尼亚伯克利分校的学院的老师,然后研究了一个技术来降低这种成本,不仅解决了价格昂贵的问题,用那种便宜的硬盘组合起来实现了性能提升,并且还实现了容错技术。
当然后期随着发展,这种技术成为一个普及技术。即使是昂贵的服务器上也用到了raid,所以后期 raid 的成本并没有真的实现一个所谓的廉价的效果。
但是从另外一个角度来讲,raid 确实对我们的服务器有一些好的变化,比方说性能提升了,使此外还实现了冗余容错功能,所以后期就改成了独立的磁盘冗余阵列。raid、提供了两个功能,一个是性能的提升,一个是荣誉性。raid 实际上是通过多块硬盘,利用某种方式把它组合起来,形成了一个集合,叫阵列,把多块硬盘给他组在一起来使用,它形成的一个概念叫阵列。
阵列有多种组合方式,每一种组合方式,都有对应的 raid 的相应的级别,按照01234编号,不同的级别对应的方式提供的特性是有差别的。
RAID
提高 io 能力:磁盘并行读写
提高耐用性:磁盘冗余来实现
级别:多块磁盘组织在一起的工作方式有所不同
RAID 实现的方式
外接式磁盘阵列:通过扩展卡提供适配能力
内接式 RAID :主板集成 RAID 控制器,安装 OS 前在 BIOS 里配置
软件 RAID:通过 OS 实现
//常见的一些 raid 对应的不同的实现方式的级别。
那 raid 在在实现的时候可以通过硬件来实现,也可以通过外置的硬件卡,或者是软件来实现都可以。
raid 可以通过外接硬件卡,比方说买一些专门的锐利的磁盘阵列卡来实现,当然现在很多主板上,电脑的主板上也内置了 raid 硬件卡,就是内接 raid 控制器。
在虚拟机环境中,也可以拿软件的方式来实现。
一般来讲 Windows 和 raid 都已经有了这个 raid 的功能,可以在软件级别加以配置也能实现,在生产中还是用硬件来实现,要应对的软 raid,通过 raid 对应的软件命令,来演示一下具体的效果。但是工作中我们一般都是硬 raid。
二、RAID 级别
RAID-0 :条带卷,strip
RAID-1 :镜像卷,mirror
RAID-2
RAID-5
RAID-6
RAID-10
RAID-01
//raid 级别有很多种,raid 的有01234,实际上有很多种的,虽然级别很多,经过验证,经过长期的这样的一个使用,有的级别逐渐已经慢慢淘汰,只是用到了一些常见的 raid 的级别。
RAID-0:
读、写性能提升
可用空间: N*min(S1.,S2...)无容错能力
最少磁盘数: 2, 2+
//第一种 raid 的级别叫 raid-0,称为条带卷,或者叫条带集,对应的单词 strip,叫条带集,raid-0 组织磁盘,并且能够实现我们前面提到的性能。
raid-0 要求是多块硬盘,实际上所有的raid都是多块硬盘,单块硬盘,就是传统的分区方式了,利用 read,可以把多块硬盘组合在一起,例如图上画的是两个硬盘,事实上还可以再来三块、四块,将来在存放数据的时候,存放方式是把多块硬盘组合在一起,形成一个整体来用,也就是说如果有好几块硬盘,我们组合成 raid-0 以后,并 不是单块硬盘独立使用的,而是作为一个集合,一个整体来用的。
假设有两块硬盘,把这两块硬盘组合在一起,就形成了一个 raid 设备,在 Linux里,如果用软件来实现的话,会发现系统中会形成一个 raid 的对应的一个新的设备。
/dev/sda,b,c
/ dev/sdd(raid,n)
/dev/ md0ext4/ mnt/raid
filell 10Mchunk16M
1
00G
//第一种 raid 的级别叫 raid-0,称为条带卷,或者叫条带集,对应的单词 strip,叫条带集,raid-0 组织磁盘,并且能够实现我们前面例如在 Linux 里,设备名叫 /dev/md,后面跟个数字,这个数字对应的数字可以人为分配的,比方说第一个raid 可以叫 raid-0,第二个 raid 可以叫 raid-1,编号可以自己指定的,并不确定。
当然,在生产中,如果用硬件 raid 来实现,那就不一样了,如果是硬件,要是把多块硬盘组合在一起,在 Linux 启动以后,就是普通硬盘,例如原来有三块硬盘,对应的就是 ABC,现在把别的其他的硬盘组合一起形成了 read,会发现又多了一个新的 D,但是这个 D,并不是单块硬盘,是由好几个 raid 磁盘组合在一起的,但在系统中看到的就是一个地的完整硬盘,但实际上是一个 raid 集合,它是由 raid,有可能会里面包括 N 块磁盘,以软件 raid 为例,有两块儿硬盘,实现 raid 之后,那将来会生成一个 raid 设备,叫 /dev/md+ 数字,一般可能从第一个就是 /dev/md0,设备生成之后,可以把它想象成一个孤立的分区,可以对这个分区创建文件,把它格式化成某一个系统,例如格式化成 MP4 格式,格式化之后,就可以下载了,例如把它下载到 raid 这个目录下,这块空间就可以通过目录来进行访问,空间以及它的组织方式设置:假设两块硬盘组合成一个叫 raid-0,条带,其中每块硬盘假设是100G,每块硬盘都是100G,两块硬盘总和是200G,但是,在组织空间的时,把两块硬盘组合成一个整体之后,要求每个硬盘的成员大小一样,也就是说两块硬盘大小应该是一致的,这块100G 这块100也是 100G,如果不一样时只能选出其中的一部分空间是一致的。
例如这块硬盘是 100G 这块硬盘是 200G,那就只能选其中的都是 100G,要求组合成raid 以后成员大小是一致的,假设把硬盘都取出来,100G组合成 raid-0,做完raid-0 之后,把它下在到这个目录里了,之后,现在假设有一个大文件 file,是100兆的文件,存到 mnt/raid 的目录下。不能直接存,因为有两个成员会把这个 file1 文件按照 chunk 单位,把它切割成多个 chunk,假设指定一个值512K,或者可以指定一个单位,比方说指定16兆,指指定完大小之后就可以按照这个大小,把整个空间切割成整个文件切割成16兆大小,然后切割成16兆大小以后,假设认为第一个16兆,100兆的文件不是切割成好多16兆,第一个16兆就是A1,第二个16兆,第三个16兆,就是把 file1文件切割成了很多小块,而且是均匀的分布在两块硬盘。
如果是三块硬盘,应该就是 A1A2A3,总之先把上面一排先写完,下一排就是A4A5A6,按照顺序排。
这样写带来的好处:每块硬盘都均匀地写了数据,意味着三块硬盘相当于同时操作,相当于把这个数据是不是切成了三份,每个硬盘上都是均匀的,三块硬盘可以利用 raid 设置可以同时写磁盘。
三块硬盘运行比一块硬盘快,理论上可以达到三倍的效果,但是是达不到的,只能说肯定是有提升,读也是三块一起同时往外读,比一块硬盘运行快,这就是性能的提升,读写性能得到很大的提升,这是raid0的突出优势。
当然 raid0 至少两块硬盘或两块以上,三块硬盘也好,四块硬盘也好,组合出 raid 以后性能提升了,但是,硬盘多就有可能坏掉其中一块,服务器上坏硬盘是正常的,尤其机房里面机器多,经常换硬盘也是正常的。家用电脑读写实在太不频繁了,使用率很低很低,家用电脑放个10年,20年的电脑可能也坏不了。
服务器24小时在运行,所以硬盘损坏率比较高,一块硬盘坏掉了,1/2的数据没了,只剩下1/2,数据不全,不能使用,实际上只要坏到一块,整个 raid 上面的所有数据就全失效了,不能用了。
Raid,虽然性能好,但是增大了数据丢失损坏的几率,因为一块硬盘还好,硬盘越多,出现故障的几率越大。用户不好接受,因为生产中重要的,不仅是性能,更重要的是稳定性,运行慢可以接受,损坏数据用户是接受不了的。
所以用 Raid-0 相对来讲,用的并不是特别多了。Raid-0 工作过程,实际上是把这个数据,分成了一小块,然后,从横着来看的话,就是一条一条的,所以把它称为条带化,条带集。
RAID-1 :镜像卷,mirror
读性能提升、写性能略有下降
可用空间: 1*min(S1,S2..
有冗余能力
最少磁盘数: 2, 2N
//学了 RAID-0,RAID-4 ,RAID-5,RAID-6,反过来看 RAID-1。RAID-1 叫镜像。
两边就两块硬盘,两个成员,两边写一模一样的数据。显而易见,这块硬盘坏了,还有另一块硬盘,有容错性,防止一块硬盘损坏,当然利用率比较低,利用率只能达到50%。两块硬盘来实现 raid-1,当然读性能,写性能还可以,这就是 raid-1的一个逻辑。
//Raid-1,A1A2 里边放的一模一样的数据,假设一个用户的数据有一个文件,如果不小心把这文件给删了,不能恢复。
注意,系统删除是同时操作,文件两边是一模一样的数据,一边删除另一边也会被删除。
Raid-1 不能避免删库操作,只能防止硬件损坏。人为操作的破坏性,没有办法避免。Raid 是解决物理性的磁盘损坏。
RAID-4:
多块数据盘异或运算值存于专用校验盘
RAID-5:
读、写性能提升
可用空间: (N-1)*min(51.,2..)
有容错能力:允许最多1块磁盘损坏
最少磁盘数: 3, 3+
//Raid-0 由于没有任何容错性,所以这种技术目前来讲,用的不是特别多,解决失效问题,要使用 raid-4 来实现,raid-4。
当然中间肯定 raid-01234 是有很多的,有些被淘汰了,raid-4 和 raid-0有些相似之处,假设用四块硬盘组合成一个完整的raid,把这个raid组合起来以后,每块硬盘取一样的空间,比如,100G的容量。
每个硬盘都是100G,raid-0如果两块硬盘,每个硬盘都是 100G, 那么组合成对的raid-0 以后,总容量是它全都,无容错性,raid 组织也是类似的,假设用软raid来实现,它也是分配一个/dev/ md0/ mnt/raid 编号,然后也挂载到目录下,假设往里补写一个100兆的文件,按照chunk单位往里写数据,一个 chunk 是16兆,分成了很多小块其中写 chunk 先把上面一排先写完,第一个小块是1,第二个小块是2,第三个小块是3,注意第四小块是123,第四小块是校验位,写P上字母,表示校验位的位置,123这三个创客通过异或校验,对位的交换位置,同样道理456也是分别放在各自的硬盘上,最后456异或校验算出校验位,放在后续的这块硬盘上,后续都是这么放的,就意味着专门找一块硬盘来放校验位,好处是4块硬盘,但是至少3块硬盘是同时可以操作数据的,读写速度是提升的,效率也很高。
假设随便一块硬盘坏了,2与5硬盘坏了,数据肯定直接读不出来,可以简单的数学公式来理解,123通过易或校验算出 p,丢了一个数据可以通过 P、1、3反算回来,在坏掉一块硬盘的情况下继续访问,所以数据并不会不能访问,已具有一定的容错功能,这就是 raid-4。所以 raid-4 解决了 raid-0 不能容错的功能,性能也不错,当然它有一定的代价的,代价就是占用了其中一块硬盘的空间。如果是N块硬盘实现 raid-4的,磁盘利用率等于N分之N减一。
这代价还是值得的,因为得到了容错性,当然,raid-4 在生产中并没有规模大规模使用,因为经过多年使用,发现 raid-4 有很大的问题,发现 raid-4放校验位的硬盘,非常容易损坏,校验位的硬盘压力比较大,造成数据损坏机率比较大。
//raid-5 和 raid-4 非常相似,raid-5 实际上也是好几块硬盘,
第一排都是数据,带小P字母的就是校验位,校验位算法和 raid-4 一样,但是 raid-5 并不是孤立的,就写在单独一块硬盘上的,每一条不是独立的,都有自己的校验位。
基本上每块硬盘的地位是均衡的,平等的,每块硬盘寄放数据,又放校验位,损坏的几率,是一样的,不至于一块硬盘老坏,raid-5 具有 raid-4 特性,只不过是把这个校验位均匀地放在每块硬盘上了,所以和 raid-4特性是一样的,就解决了单独换一块硬盘的问题。
生产中 raid-5,用的还是比较多的,但是 raid-5 防止一块硬盘损坏只能防一次,它的磁盘率是N分之N减一。
必须大于等于三才能实现 raid-5,raid-5 在中小型应用中用的非常普遍,基本上成服务器的常见的标配,好多人都喜欢用,但是 raid-5 由于容错性终究还是有限的,因为对于一些关键业务换一块时担心坏两块,用户希望能够解决。
坏两块几率确实少,但是要尽可能的减少数据丢失,所以 raid-5 在有些场景下还是不能满足要求。
当然 raid-5 坏掉一块硬盘,虽然系统仍然可以访问,但是这时候坏一块,虽然可以通过结合别的硬盘算出来,算需要花时间,新机性能就会受到很大的影响,尤其服务器压力比较大的时候,坏掉一块硬盘了,这个服务器压力就更严重了,有可能就因为这个性能太差,导致服务器崩溃,应该及时解决,手工换硬盘太原始了,也来不及。事实上,服务器都一般有相应的解决方案,就是用空闲硬盘技术,叫spare dix 硬盘。空闲硬盘就是在旁边再放,一块空硬盘,一旦发现其中一块硬盘坏了,系统自动拿这个备用硬盘代替,这个坏的硬盘在短期之内就可以修复,从而正常的使用 raid,不至于造成性能下降,降级使用,这就是 raid-5优势。
RAID-6:
读、写性能提升
可用空间: (N-2)*min(S1.,S2...)
有容错能力:允许最多2块磁盘损坏
最少磁盘数: 4, 4+
//Raid-6 也是数据和校验位组成的,Raid-6 有两个校验位,两个校验位,坏一块不怕,两块不怕,换两块也能算出来,因为两个校验位是两个公式,两个公式就两个数学公式可以算两个未知数,Raid-6 他可以允许最多两块硬盘损坏,所以有些企业会用 Raid-6,至少4块硬盘才能做 Raid-6,磁盘利用率是 N 乘 N 分之 N 减一或 N 分之N减二,这就是 Raid-6。
RAID7:
可以理解为一个独立存储计算机,自身带有操作系统和管理工具,可以独立运行,理论. 上性能最高的 RAID 模式
常用级别: RAID-0, RAID-1, RAID-5, RAID-10,RAID-50, JBOD
Raid7 的话,用的少,Raid7是一个专门的硬件,是一个独立的电脑,它上面自带系统,自带管理工具,性能最优,但是成本太高,所以一般很少用。
常见的级别,一般来讲,我们看到RAID-1,RAID-5, RAID-10,这是比较常见的,其他的相对就用得少一些了。
在企业中都是用 raid 卡,就是硬件卡, raid 卡怎么配,在开机的时候,进到那个字符界面的蓝色 bios 界面,然后在界面里去配置。配置的时候先把 raid 配好,配好raid 以后才能装系统,就不是装系统之后配 raid,raid 是底层的,先配好,相当于把硬盘先组织好,组织好以后再来上面装操作系统,装完操作系统以后,假设有三块硬盘,组合成 raid5,这时候,如果用 read 这种硬件的方式来实现,但实际上开机,装完系统之后,看到的就是一个孤立的一块硬盘 sba,实际上里面实现 raid。
RAID-01:
多块磁盘先实现 RAID0 ,再组合成 RAID1
RAID-10:
读、写性能提升
可用空间: N*min(1.2..)/2
有容错能力:每组镜像最多只能坏一块
最少磁盘数: 4, 4+
//常用到的raid-10或者raid-01。
raid10实际上是数字一加零的意思,说的是假设有四块硬盘,把它两两组合成raid10,使用这种组合,显而易见,坏一块硬盘,这块硬盘坏了,能继续访问,因为有镜像,一样的数据,坏了一块没事,
容错性非常强。
Raid-0成员中每个成员都必须能访问才行,所以这个容错性还是有一定的概率的。最多能防止一块硬盘损坏,但是有些情况下可以换多块硬盘都可以,得看坏的是哪块硬盘。
事实上raid-01就是先做零再做一,先两块硬盘做raid-0,两块硬盘做个raid-0,然后两个组成raid1。虽然其中raid整个已经失败了,但是这一半还能访问,当然这块硬盘坏了,如果再换一块,那这边还可以访问,所以raid-01,raid-10,大体上很像,就是先做谁的问题,raid-10比raid-01好。
JBOD: Just a Bunch Of Disks
功能:将多块磁盘的空间合并一个大的连续空间使用
可用空间: sum(S1,2....)
//just a bunch of disc,实际上是就是简单的把好几块硬盘合在一块,没有性能的提升,就是每块硬盘大小不一样,把每块硬盘给简单组合在一起,组合在一起以后,数据写的时候,就是先把第一排硬盘写满了,再写第二排,再写第三排,按顺序写,将好几块硬盘组合在一起,对外感觉就像一块独立硬盘一样,用起来有较大的空间,性能没提升,就是空间大。
JBOG,有些服务器上可以这么做几个硬盘,用设备把它组合起来,用这种的方式组合,对外感觉就像一块硬盘一样,但是它实际上是好几块硬盘组合在一起。
服务器上一般不太用这个,因为容错性也没有,也不在乎这点容量的增长。
软 RAID
mindadm: 为软 RAID 提供管理界面
为空余磁盘添加冗余
结合内核中的 md(multi devices)
RAID 设备可命名为 /dev/md0、/dev/md1、/dev/md2、/dev/md3
等。
软 RAID 配置示例
使用 mdadm 创建并定义 RAID 设备
mdadm-C/dev/md0-ayes-15-n3-x1 /dev/sd{bcde
用文件系统对每个 RAID 设备进行格式化 mkfs.xfs/dev/md0
测试 RAID 设备
使用 mdadm 检查 RAID 设备的状况 mdadm--detaillD/dev/md0 增加新的成员
mdadm-G/dev/md0-n4-a/dev/sdf1
生成配置文件: mdadm-D-s>>/etc/mdadmconf
停止设备: mdadm-S/dev/md0
激活设备: mdadm-A-s/dev/md0
激活强制启动: mdadm-R/dev/md0
删除 raid 信息: mdadm--zero-superblock/dev/sdb1
三、操作实例
/dev/sda5: UUID= "9da51led- e024-4c86- 811c - 90b0d2fba836 TYPE=" swap
/dev/sdb1: UUID="5fffaeb1- 388d- 44e5-b753-7652bcec6941" TYPE=" ext4"
/data/ext4file: UUID="c22e3ad4- fc19- 44ec-91f7 - 6e618c3d1be1" TYPE="ext4"
[root@centos6 ~]#rm -f /data/ext4file
[root@centos6 ~]#dd if=/dev/zero of=/dev/sdb bs=1 count=512
512+0 records in
512+0 records out
512 bytes (512 B) copied, 0.0234082 s, 21.9 kB/s
[ root@centos6 ~] #blkid
/dev/sda1: UUID="af2a7293-725f-4353- a36c- c3daff96403a" TYPE=" ext4" LABEL=" /boot"dev/sda2: UUID=" aab8912b-7c2c-419a-819f-35d514fe55c8" TYPE="ext4"
/dev/sda3: UUID-"b5d3110d-425f-4851- 9265-d0eb666522c9" TYPE="ext4"
/dev/sda5: UUID="9da511ed- e024-4c86- 811c- 90b0d2fba836" TYPE=" swap"
/dev/sdb1: UUID="5fffaeb1-388d-44e5- b753- 7652bcec6941" TYPE-"ext4
[ root@centos6 ~]#1sb1k
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4) :
value out of range
Partition number (1-4): 1
First cylinder (1-2610, default 1) :
Using default value 1
Last cylinder, +cylinders or +size[K,M,G] (1-2610, default 2610): +2G
Command (m for help) :
#Created by anaconda on wed sep 19 11:31:512018
#Accessible filesystems, by reference, are maintaine d under '/dev/disk'
#See man pages fstab(5),findfs(8),mount(8)and/orblkid(8) for more info
#UUID=aab8912b-7c2c-419a-819f-35d514fe55c8/
ext4
defaults
11
UUID=af2a7293-725f-4353-a36c-c3daff96403a/boot
ext4defaults
1
2
UUID=b5d3110d-425f-4851-9265-d0eb666522c9/data
ext4
defaults
2
UUID=9da51led-e024-4c86-811c-90b0d2fba836 swap
swap
defaults
0
tmpfs
/dev/pts
/dev/shm
devpt
tmpfs
defaults
0
sysfs
devpts
gid=5,mode=620
0
0
proc
/sys
proc
sysfs
defaults
0
proc
defaults
0
UUID=6c51566b-357e-4360-b4a7-5767e338444a
/mnt
raid
ext4
defaults 00
[root@centos6 raid]#pwd
/mnt/raid
[root@centos6 raid]#cd /mnt/raid2
[root@centos6 raid2]#1s
F1 lost+found
[root@centos6 raid]#hexdump f1
0000 0000 0000 0000 0000 0000
[root@centos6 raid2]#11 f1
-rw-r--r- 1 root root 1073741824 0ct 19 15:08 f1
[root@centos6 raid2]#mdadm /dev/md1-r /dev/sdd1 mdadm:hot removed /dev/sdd1 from/dev/sdd1
[root@centos6 raid2]#mdadm -D/dev/md1
//实际操作 Linux 的命令,在 Linux 里面有一个叫 mdadm 的小工具,是一个字符工具,可以用来配置 raid。当然实现的是基于 Linux 系统,系统级别为软 raid。
准备好硬盘,要实现 raid,需要好几块硬盘,大小要求一样,但是 raid 实际上可以不一样,但是组合的话,空间必须取出来是一样的,硬盘可以不一样,但是组合成raid 成员,每个必须一样,取出一个空间来。a硬盘,已经有了五个分区,当然这个分区是原来系统的。bcde,假设把B硬盘和C硬盘拿出来,创建一个 raid-0,再创建一个 raid-5,这两个都是比较典型意义的,当然这两块硬盘都拿出来做 raid0是可以的,也可以单独取出一块空间,比方说一个分区做 raid-0 也是行的,
例如拿一块分区,拿一个空间来做,SDB1 分区上面已经有一个 G了,在 SDC 上再取出一个 G,两个只要大小一样就可以。当然在取的时候要确保 sdb1 分区是没有在别的地方使用的。
Sdb1 分区应该是没有人用的,IDV1 是 MP4 的文件系统。
注意,做 raid 的时候,每个成员,不需要独立的去创建文件系统。
//实际操作 Linux 的命令,在 Linux 里面有一个叫 mdadm 的小工具,是一个字符工具,可以用来配置 raid。
当然实现的是基于 Linux 系统,系统级别为软 raid。准备好硬盘,要实现 raid,需要好几块硬盘,大小要求一样,但是 raid 实际上可以不一样,但是组合的话,空间必须取出来是一样的,硬盘可以不一样,但是组合成 raid 成员,每个必须一样,取出一个空间来。
a 硬盘,已经有了五个分区,当然这个分区是原来系统的。
bcde,假设把 B 硬盘和 C 硬盘拿出来,创建一个 raid-0,再创建一个 raid-5,这两个都是比较典型意义的,当然这两块硬盘都拿出来做 raid0 是可以的,也可以单独取出一块空间,比方说一个分区做 raid-0 也是行的,
例如拿一块分区,拿一个空间来做,SDB1 分区上面已经有一个 G 了,在 SDC 上再取出一个 G,两个只要大小一样就可以。当然在取的时候要确保 sdb1分区是没有在别的地方使用的。
Sdb1 分区应该是没有人用的,IDV1 是 MP4 的文件系统。
注意,做 raid 的时候,每个成员,不需要独立的去