RAID与其在Linux上的实现
参考资料:
本文所使用的图片来源于互联网,若有侵权,烦请联系,谢谢。
简介
RAID出现的目的是为了数据的冗余,或者性能的提升,或者两者兼顾。早期想实现这样的功能,可能需要购买一些基于大型机(mainframe)的设备,但是价格过于昂贵,后来就有些人发明了RAID技术将多块廉价的磁盘组合在了一起,实现了和大型机设备同等的功能。
RAID,早期的全称是冗余廉价磁盘阵列(Redundant Array of Inexpensive Disks),主要是相比于以往的昂贵的SLED(Single Large Expensive Disk),后改名为冗余独立磁盘阵列(Redundant Array of Independent Disks),毕竟现在的RAID控制卡也已经不便宜了。
基于不同级别的冗余和性能要求,RAID有不同的级别(level)。不同的级别也决定了可靠性(reliability)、可用性(availability)、性能(performance)和容量(capacity)的不同。
许多RAID级别采用了一种错误保护机制,叫做奇偶校验(parity)。大部分情况使用的是异或运算(XOR),不过RAID 6则使用了两种独立的奇偶校验方法。
不同的RAID级别,使用不同的数字来表示,例如RAID 0、RAID 1等等。
RAID级别按照种类划分有标准(standard)级别、嵌套/混合(nested/hybrid)级别和非标准(non-standard)级别。RAID级别是由SINA(Storage Networking Industry Association)组织所定义的。
接下来我们就来一一介绍这几种RAID。
标准级别
RAID 0
基于striping方式(data striping是一种切割逻辑上连续数据的技术,例如切割文件,使得连续的片段可以被存储在不同的物理存储设备上。)来组织数据,不具备镜像(mirror,即数据冗余)和校验的功能。如图所示。
一个文件会被切割成多个block,假设有8个,有A1~A8表示,那么会依次存入阵列中的每个磁盘当中。
优点:
- 读写性能提升,理论上有n块磁盘,就可以带来n倍的性能提升,因为读写是并行的。
- 存储容量提升,阵列总容量为n块磁盘之和。如果磁盘的容量不是相等的,则总容量为n倍的最小磁盘容量。其他RAID级别遇到磁盘容量不同的时候,也是以最小磁盘容量为准。接下来我们假设所有RAID的磁盘容量都是相同的,一般在生产环境中,阵列中的磁盘的容量、型号等也都会是一模一样的。
缺点:
- 没有数据冗余能力,1块硬盘损坏则整个RAID无法使用,数据全部丢失。并且随着阵列中磁盘数量的增加,发生损坏的概率就越大。
- 没有校验能力,无法基于校验码进行数据恢复。
其他:
- 至少需要2块硬盘。
RAID 1
基于镜像(mirroring)的方式,当写入数据的时候,会同时写入每个磁盘设备。
优点:
- 具备数据冗余能力,只要阵列中还有一块硬盘处于工作状态,那么整个阵列就依然可用。
- 读性能提升,如果RAID控制器足够强大,则读性能可接近于RAID 0,不过实际实现中,应该无法达到。
缺点:
- 写性能下降。由于同一个block的数据需要被写入阵列中的每一个磁盘中,因此写性能下降。磁盘数越多,写性能下降越多。最慢的磁盘会限制整个阵列的写性能。
- 没有校验能力,无法基于校验码进行数据恢复。
其他:
- 存储容量保持不变。总容量为单块磁盘容量。
- 至少需要2块磁盘。
RAID 2
数据的组织方式类似RAID 0,通过striping技术以位(bit)为单位将数据切割至多块磁盘上。使用汉明码(hamming-code)作为校验码,具备数据恢复能力,但是需要多块磁盘作为校验盘。所有磁盘的主轴旋转是同步的。
目前已被弃用!!!
RAID 3
类似RAID 2。区别在于RAID 3是基于字节(byte)级别,使用非汉明码的校验码,所以校验码只需存储在一块磁盘中。
目前已被弃用!!!
RAID 4
类似于RAID 2和3。区别在于RAID 4是基于块(block)级别,校验码存储在一块磁盘上。RAID 4相对于2和3的最大优点在于I/O并行性(parallelism):在2和3中,一次简单的读操作会从阵列中的所有磁盘读取数据,而4则不需要。
由于只有一块校验盘,每次写入数据的时候需要计算校验码,随着磁盘数的增加,校验盘的性能会成为整个阵列的瓶颈。
目前RAID 4的实现大部分已被私有技术RAID DP所取代,RAID DP使用了两块校验盘。
注意:图片可能有点错误,DISK 2中存储的应该是BLOCK A3、B3、C3和D3的数据。
优点:
- 读写性能提升,读性能理论为n倍的数据盘,写性能理论小于n倍的数据盘且随着数据盘的增加,写性能越来越受制于校验盘。
- 具有数据恢复能力。
- 存储容量提升,为磁盘总容量减去校验盘容量(n-1)。
缺点:
- 无镜像能力,虽然存在数据恢复能力,但是数据盘损坏后,基于校验码恢复数据会有额外的计算开销。
- 校验盘瓶颈问题。
其他:
- 至少需要3块磁盘。
RAID 5
类似于RAID 4,RAID 5基于块(block)级别切割数据至多个磁盘,同样具备校验码。但是,最大的区别在于RAID 5的校验码不是存放在专门的磁盘上,而是分布式地存储在阵列中的每个磁盘中,这就解决了RAID 4的写性能受制于校验盘的问题了。截止目前,涉及校验的RAID,它们的校验码都是只计算一次并保留一份,这也叫做“单校验概念”(single-parity concept)。像这类单校验的设计,当阵列越来越庞大的时候,容易受到系统故障的影响,这里的系统故障指的是磁盘损坏阵列重建(rebuild)时间以及重建期二次磁盘损坏几率。详见:Increasing rebuild time and failure probability
优点:
- 读写性能提升,理论为n倍的磁盘,解决了RAID 4中的校验盘瓶颈问题。
- 具有数据恢复能力。
- 存储容量提升,为磁盘总容量减去校验码占用容量(n-1),校验码占用的容量约为一个磁盘容量。
缺点:
- 无镜像能力,虽然存在数据恢复能力,但是数据盘损坏后,基于校验码恢复数据会有额外的计算开销。
- 单校验问题,此前的所有具备校验能力的RAID亦均有此问题。
其他:
- 至少需要3块磁盘。
RAID 6
类似于RAID 5,RAID 6基于块(block)级别切割数据至多个磁盘,具备分布式校验码。只不过是使用了双校验码(double-parity)机制。双校验支持损坏至多2块磁盘。这使得更大的RAID阵列更加实用,尤其对于高可用系统,因为大容量的阵列需要更长的时间重建。至少需要4块磁盘。和RAID 5一样,单块磁盘故障会降低整体阵列性能,直到故障盘被替换。如果磁盘的容量和阵列的容量越大的话,那么越应该考虑使用RAID 6来替代RAID 5。RAID 10同样也最小化了这些问题。
优点:
- 读写性能提升,写性能可能稍微逊色于RAID 5,因为要计算2种校验码。
- 具备数据恢复能力,允许损坏至多2块磁盘。
- 存储容量提升,n-1。
- 新增双校验机制,解决单校验的问题,此类设计更适合支持大容量阵列并提高其可用性。
缺点:
- 必须牺牲2块磁盘的容量存放校验码。
- 无镜像能力,虽然存在数据恢复能力,但是数据盘损坏后,基于校验码恢复数据会有额外的计算开销。不过双校验应该可以加快数据恢复的时间。
其他:
- 至少需要4块磁盘。
嵌套级别
RAID中的每个元素(组成成分),可以是独立磁盘,也可以是一个RAID阵列。对于后者,我们称之为RAID嵌套。
RAID 01
也叫作RAID 0+1或者RAID 0&1,先将磁盘制作成RAID 0,再将每个RAID 0组合成RAID 1。如图所示。
任何一块磁盘损坏都会导致其中一个stripe(基于striping技术的RAID 0,也可叫stripe)不可用,此时整个RAID 01阵列实际上就降级为RAID 0阵列了。该阵列相比RAID 10在重建期会遭遇更高的风险,因为它需要读取剩下的stripe中的所有磁盘的所有数据而不是其中一块盘上的所有数据,增加了URE(Unrecoverable Rear Error)的概率并且明显扩大了重建窗口。
至少需要4块磁盘。可以采用更多的磁盘,但是这意味着磁盘故障率也会随之增加,如果阵列只有2个stripe,并且刚好每个stripe各损坏1块磁盘,那么整个阵列就完了。
按照此图示的存储容量为n/2。
因此,RAID 01是不好的,不建议使用。建议使用RAID 10来替代它!!!
RAID 10
也叫作RAID 1+0或者RAID 1&0,先将磁盘制作成RAID 1,再将每个RAID 1组合成RAID 0。如图所示。
这种阵列相对RAID 01可以承受更多的设备损坏,特别是在单个镜像卷中的磁盘数量较多的情况下。
按照此图示的存储容量为n/2。
非RAID架构
关于RAID的常用级别基本已经说明完毕,除了以上几个RAID级别,还有一些并不是基于RAID技术但是也可以将磁盘数据集合起来的技术,这些技术通常只是简单地将磁盘堆叠起来使用而已,并不一定具备像RAID一样的数据冗余和性能提升的功能。
- JBOD:Just a Bunch Of Disks。
- SPAN or BIG:字面意义,非缩略词。
- MAID:Massive Array of Idle Drives。
详见:Non-RAID drive architectures
实现
RAID的实现主要有两种,一种是基于硬件俗称硬RAID,另一种是基于软件俗称软RAID。
硬RAID需要硬件(RAID卡,即RAID控制器)支持,一般是在OS启动之前,在BIOS中进行RAID的相关配置,并且在OS启动之后,会有对应RAID卡厂商的私有软件工具可以进行配置。因为本人没有相关硬RAID配置经验以及这只是实验环境,因此没有硬RAID相关实现的介绍。
软RAID的实现方式也有很多种,一般是基于操作系统的某些特性,例如基于Linux内核的md(Multiple Device)或者OpenBSD的softraid。
本文主要阐述如何基于Linux操作系统实现软RAID。
mdadm
基于Linux的md实现的命令是mdadm,它所支持的RAID级别:LINEAR(类似JBOD)、RAID 0、RAID 1、RAID 4、RAID 5、RAID 6和RAID 10。
OS:CentOS 7.5
mdadm:v4.0
我们的目标是,使用4块1GB的磁盘,创建RAID 5阵列,其中3块作为有效(active)盘,1块作为备用(spare)盘。
创建4块磁盘,分区,文件系统类型为Linux的RAID(ID:fd)。
[root@C7 ~]# fdisk -l | grep -i "raid"
/dev/sdb1 fd Linux raid autodetect
/dev/sdc1 fd Linux raid autodetect
/dev/sde1 fd Linux raid autodetect
/dev/sdd1 fd Linux raid autodetect
查看内核识别到的分区信息,确保我们刚才所创建的四个磁盘的分区已经被内核识别。
[root@C7 ~]# cat /proc/partitions
major minor #blocks name sda
sda1
sda2
sdb
sdb1
sdc
sdc1
sr0
sde
sde1
sdd
sdd1
dm-
dm-
如果未识别到,则使用partprobe告知内核。警告信息可以忽略。
[root@C7 ~]# partprobe
Warning: Unable to open /dev/sr0 read-write (Read-only file system). /dev/sr0 has been opened read-only.
创建磁盘阵列。
[root@C7 ~]# mdadm -C /dev/md0 -l -n -x /dev/sd{b,c,d,e}
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
查看阵列状态信息
方法一
[root@C7 ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdd1[] sde1[](S) sdc1[] sdb1[]
blocks super 1.2 level , 512k chunk, algorithm [/] [UUU]
阵列创建的过程需要时间,例如写入RAID元数据之类的,想动态查看的话,可以通过watch命令
[root@C7 ~]# watch -n cat /proc/mdstat
方法二
[root@C7 ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Wed Apr ::
Raid Level : raid5 # RAID级别
Array Size : (2042.00 MiB 2141.19 MB) # 4块磁盘,各1GB,1块备用盘,还有1块盘的容量为校验码,因此阵列可用容量为2GB。
Used Dev Size : (1021.00 MiB 1070.60 MB)
Raid Devices :
Total Devices :
Persistence : Superblock is persistent Update Time : Wed Apr ::
State : clean # 阵列的状态,clean表示干净状态,即阵列处于健康工作状态
Active Devices :
Working Devices :
Failed Devices :
Spare Devices : Layout : left-symmetric
Chunk Size : 512K Consistency Policy : resync Name : C7: (local to host C7)
UUID : ebf794e8:8f01958a:f004744b:7be7a8cf # 系统重启后,阵列的设备名称可能不再是/dev/md0,因此可使用UUID来代替设备名称写入/etc/fstab。
Events : Number Major Minor RaidDevice State
active sync /dev/sdb1
active sync /dev/sdc1
active sync /dev/sdd1 - spare /dev/sde1
格式化RAID设备并挂载使用
[root@C7 ~]# mkfs -t xfs /dev/md0
meta-data=/dev/md0 isize= agcount=, agsize= blks
= sectsz= attr=, projid32bit=
= crc= finobt=, sparse=
data = bsize= blocks=, imaxpct=
= sunit= swidth= blks
naming =version bsize= ascii-ci= ftype=
log =internal log bsize= blocks=, version=
= sectsz= sunit= blks, lazy-count=
realtime =none extsz= blocks=, rtextents=
[root@C7 ~]# mkdir /raid_data
[root@C7 ~]# mount /dev/md0 /raid_data
创建一个测试的文本文件,输入一些信息。在下文标记阵列中磁盘为faulty状态时,我们可以通过测试此文件是否内容可读取来判断RAID是否可用。
[root@C7 ~]# cat /raid_data/raid.txt
this is a test file for RAID !!!
手动标记阵列中的一块有效磁盘为faulty状态,并观察备用盘是否自动顶替。
[root@C7 ~]# mdadm /dev/md0 -f /dev/sdd1
mdadm: set /dev/sdd1 faulty in /dev/md0
再次查看状态会发现一些变化。
[root@C7 ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Wed Apr ::
Raid Level : raid5
Array Size : (2042.00 MiB 2141.19 MB)
Used Dev Size : (1021.00 MiB 1070.60 MB)
Raid Devices :
Total Devices :
Persistence : Superblock is persistent Update Time : Wed Apr ::
State : clean, degraded, recovering # 由于磁盘损坏了1块,且存在备用盘。备用盘自动顶替,阵列进入重建期,在重建完成前,阵列处于降级模式工作。重建完毕后,状态又会变回clean了。
Active Devices :
Working Devices :
Failed Devices :
Spare Devices : Layout : left-symmetric
Chunk Size : 512K Consistency Policy : resync Rebuild Status : % complete # 数据重建进度。 Name : C7: (local to host C7)
UUID : ebf794e8:8f01958a:f004744b:7be7a8cf
Events : Number Major Minor RaidDevice State
active sync /dev/sdb1
active sync /dev/sdc1
spare rebuilding /dev/sde1 - faulty /dev/sdd1
待阵列重建完毕,再标记一块磁盘为faulty状态。
[root@C7 ~]# mdadm /dev/md0 -f /dev/sdc1
mdadm: set /dev/sdc1 faulty in /dev/md0
此时我们的阵列,就只能工作于降级模式而无法恢复clean了。
[root@C7 ~]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Wed Apr ::
Raid Level : raid5
Array Size : (2042.00 MiB 2141.19 MB)
Used Dev Size : (1021.00 MiB 1070.60 MB)
Raid Devices :
Total Devices :
Persistence : Superblock is persistent Update Time : Wed Apr ::
State : clean, degraded
Active Devices :
Working Devices :
Failed Devices :
Spare Devices : Layout : left-symmetric
Chunk Size : 512K Consistency Policy : resync Name : C7: (local to host C7)
UUID : ebf794e8:8f01958a:f004744b:7be7a8cf
Events : Number Major Minor RaidDevice State
active sync /dev/sdb1
- removed
active sync /dev/sde1 - faulty /dev/sdc1
- faulty /dev/sdd1
无论阵列处于重建期或者降级模式,测试文件都是可读的。
如果该阵列不使用了,那么我们应该先卸载阵列,再关闭它。
[root@C7 ~]# umount /dev/md0
[root@C7 ~]# mdadm -S /dev/md0
mdadm: stopped /dev/md0
[root@C7 ~]# mdadm -D /dev/md0
mdadm: cannot open /dev/md0: No such file or directory
关闭后,阵列设备文件消失。
总结
- 实际生产环境中,数据的完整性和性能是重要的,因此不应该使用软RAID,而应该采用硬RAID。
- 不同的RAID卡厂商的配置方式不同,万变不离其宗,了解RAID原理各级别特性比RAID实现更重要。
- 本文关于Linux上的软RAID实现只是简单阐述,切勿直接拿来在生产环境使用。
RAID与其在Linux上的实现的更多相关文章
- 第7章 Linux上配置RAID
7.1 RAID概念 RAID独立磁盘冗余阵列(Redundant Array of Independent Disks),RAID技术是将许多块硬盘设备组合成一个容量更大.更安全的硬盘组,可以将数据 ...
- Linux 上使用 Gmail SMTP 服务器发送邮件通知
导读 假定你想配置一个 Linux 应用,用于从你的服务器或桌面客户端发送邮件信息.邮件信息可能是邮件简报.状态更新(如 Cachet).监控警报(如 Monit).磁盘时间(如 RAID mdadm ...
- 【转载】LINUX上MYSQL优化三板斧
现在MySQL运行的大部分环境都是在Linux上的,如何在Linux操作系统上根据MySQL进行优化,我们这里给出一些通用简单的策略.这些方法都有助于改进MySQL的性能. 闲话少说,进入正题. 一. ...
- Linux上配置使用iSCSI详细说明
本文详细介绍iSCSI相关的内容,以及在Linux上如何实现iSCSI. 第1章 iSCSI简介 1.1 scsi和iscsi 传统的SCSI技术是存储设备最基本的标准协议,但通常需要设备互相靠近并用 ...
- 如何利用mono把.net windows service程序迁移到linux上
How to migrate a .NET Windows Service application to Linux using mono? 写在最前:之所以用要把windows程序迁移到Linux上 ...
- Linux上运行NET
今天尝试了下Ubuntu上运行NET程序,按照 https://github.com/aspnet/Home 的指引,一步一步来: 1.安装DNVM(原名KVM) Linux控制台下输入 curl - ...
- .NET跨平台之旅:在生产环境中上线第一个运行于Linux上的ASP.NET Core站点
2016年7月10日,我们在生产环境中上线了第一个运行于Linux上的ASP.NET Core站点,这是一个简单的提供后端服务的ASP.NET Core Web API站点. 项目是在Windows上 ...
- 【Oracle 集群】11G RAC 知识图文详细教程之RAC在LINUX上使用NFS安装前准备(六)
RAC在LINUX上使用NFS安装前准备(六) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇 ...
- 【无私分享:ASP.NET CORE 项目实战(第十章)】发布项目到 Linux 上运行 Core 项目
目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 ASP.Net Core 给我们带来的最大的亮点就是跨平台,我在我电脑(win7)上用虚拟机建了个 CentOS7 ,来演示下 ...
随机推荐
- C - Portals Gym - 102006C (网络流最小割)
题目链接:https://cn.vjudge.net/contest/283918#problem/C 题目大意:T个测试数据,然后给你一个字符串,每一个字符串包括‘s’,‘t’,‘o’,‘#’,‘. ...
- 函数前加static与不加static的区别
1:加了static后表示该函数失去了全局可见性,只在该函数所在的文件作用域内可见 2:当函数声明为static以后,编译器在该目标编译单元内只含有该函数的入口地址,没有函数名,其它编译单元便不能通过 ...
- AD域相关的属性和C#操作AD域
“常规”标签 姓 Sn 名 Givename 英文缩写 Initials 显示名称 displayName 描述 Description 办公室 physicalDeliveryOfficeNam ...
- linux kernel的cmdline参数解析原理分析【转】
转自:https://blog.csdn.net/skyflying2012/article/details/41142801 版权声明:本文为博主kerneler辛苦原创,未经允许不得转载. htt ...
- SVN设置必须锁定
SVN是一个开放源代码的版本控制系统,相信做开发的基本上都用过,这里就不多介绍了.团队协作开发时常常会出现提交的文档互相冲突的问题,这里给大家介绍一下给SVN文件设置必须锁定的方法,当然你也可以对冲突 ...
- 【转】SourceInsight4破解笔记
时隔好多年,sourceinsight4以迅雷不及掩耳之势的来了.与3.5相比,sourceinsight4多了代码折叠以及文件标签功能,可谓是让sourceinsight迷兴奋了好几晚上.废话不多说 ...
- zabbix3.0.4使用shell脚本和zabbix自带模板两种方法添加对指定进程和端口的监控
zabbix3.0.4添加对进程的监控: 方法一:通过自定义命令进行监控 主要思路: 通过 ps -ef|grep sdk-push-1.0.0.jar |grep -v grep|wc -l 这个命 ...
- openvpn用户管理、linux客户端配置及企业常用真实案例解析
1.给企业用户分配VPN账户的流程: 添加拨号需要密码的用户 # source vars NOTE: If you run ./clean-all, I will be doing a rm -rf ...
- 从LeNet-5到DenseNet
一篇不错的总结:https://zhuanlan.zhihu.com/p/31006686
- google 与服务器搭建
一.申请账号 二.创建实例 VPN设置 :https://juejin.im/post/5b665a51f265da0f7d4f1ab3