RAID概述

RAID是冗余磁盘阵列的简称,随着技术发展,它已广泛应用。主板上常见的RAID0、RAID1等功能表明RAID变得普遍,了解RAID知识对技术人员有益。虽然Linux软件RAID与主板RAID的关系不明确,但学习RAID技术对于日常工作是有帮助的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这些文章已经写了好几年了,可能已经过时了。在MSN space和QQzone几经辗转之后,我想也许这些技术文章还是放在搞技术的博客中更能帮助人。于是做了一个艰难的决定,把这些文章一篇篇搬过来!绝对是原创的。

 

 

RAID 就是冗余磁盘阵列。目前市面上的电脑主板上,一般都不难看到产品参数中看到支持磁盘阵列Raid0,Raid1等等,这在一定程度上说明RAID已经越来越普遍,用句古文说就是“旧时王榭堂前燕,飞入寻常百姓家”。虽然我自己目前还不知道这些主板上说明的RAID跟linux的软件RAID有些什么关系, 或者说我从来没机会使用这些RAID功能,但是这确实是说明了RAID技术的广泛应用,了解一些RAID知识不会错的。


在linux内核中,软件RAID是一个不可缺少的一部分,通常它会和LVM共同出现。现在google一下能找到不少这方面的资料。但介绍点基本知识似乎还是必要的。拙嘴笨舌,姑且简而言之。
 
假设我们有两块硬盘,我们要将这两块硬盘统一管理,那么最简单的办法就是将两个硬盘地址首尾相连,也就是说两块硬盘的地址是连续的,如果第一块硬盘的地址空 间是0~0ffff那么第二块硬盘的编址就应该从10000开始,例如10000~1ffff。这样做很简单,第一块硬盘写满后,就写到第二块硬盘上。但 这样做问题是性能上并不高效,因为应用程序很可能因为集中读写某个文件而集中读写某个盘,而另一块盘闲置。
 
于是有了另外一种更高性能组织模式RAID-0。RAID-0就是将两块硬盘并行管理,简单的说,可能并不准确,就是将总的磁盘编址空间均匀的分布在两个盘上(也就是所谓的条纹化striping),那么如果应用程序要集中读写某个文件,由于这个文件散布在两个盘上,那么两个能同时工作以提高整体的吞吐率。
 
然而,RAID-0不能保证数据的可靠性,因为不管哪一块盘坏了,数据就永久丢失了。提高可靠性的最简单的方法就是将一块盘做为另一块盘的备份来组织,这就 是RAID-1。RAID-1大大提高了可靠性,因为两块盘同时出问题的可能性很低,任何一块盘出了问题都可以由另一块盘补上,而且两块盘可以并行工作通 过平衡负载来获得更高的吞吐率。但是用整块盘来做备份,牺牲了磁盘空间,数据空间只占整个磁盘空间的50%。
 
于是经过一系列的发展到了RAID-3456。RAID-3和RAID-4简单的说就是在一个RAID-0阵列的基础上又加了一个盘存储校验信息。这样做提 高了RAID-0的可靠性,同时提高了磁盘空间利用率,假设3块盘的RAID-4只有一块盘用来存储冗余数据,因此磁盘空间利用率上升到66.6%。可靠 性的提高通过校验盘来获得,如果有一块数据盘坏了,就可以利用校验盘和另一块数据盘上的数据计算出缺失的数据。但是把校验数据都集中放在一个盘上,使得这 个盘的负载很重,成为整个阵列的性能的瓶颈。RAID-5的出现就是为了解决这个问题。RAID-5的基本思想就是将校验数据均匀的分布在各个盘上以解除 瓶颈。RAID-345虽然提高了可靠性,但是只能容忍一块磁盘出问题,如果阵列中有两块磁盘坏了,那么整个整列数据可靠性都无法保证了。RAID-6就 是在RAID-345的基础上再加入一个校验盘,利用两个冗余校验数据就能容忍阵列中两个磁盘出问题。
 
在这些RAID还可以嵌套使用,其中用的最广的就是RAID-10也就是将两的RAID-1设备再按RAID-0的方式组织到一起。不过在2.6的代码中,已经将RAID-10独立作为一种RAID形式对待。
 
RAID在linux内核中的位置  
RAID 的代码在linux内核代码中的driver/md目录下,这个目录下除了RAID的代码外还可以看到LVM的代码,devicemapper相关的代码 都以dm-打头。估计这里MD表示multiple disk,或者multiple device,我没有考证过,以后直接称为MD设备就行。MD设备 是linux内核提供的一种块设备驱动程序,但是这个设备驱动程序具体是怎样工作的则由其内部使用哪种磁盘组织形式,如RAID-0156。在 driver/md目录下,我们可以除了可以看到RAID-0156的代码以外还可以看到linear,multipath, 这些都是MD提供的内部组 织形式。我们可以将MD设备看作是介于块设备驱动程序与RAID层之间的一层,但我常常将其视为包装了RAID的一个统一的管理器,他提供了通用的管理接口,而且并没有直接干预数据处理,一旦创建了MD设备以后,所有的数据都会直接送入RAID。实际上用面向对象的观点来看MD设备层可能更好:MD实际上是对各种RAID的抽象,也就是他们的抽象父类,提供了一些共性的属性方法,而各RAID子类,则拥有自己的属性方法,如果没有具体化为某个RAID对 象,某个MD设备就不能直接使用。所以实际当中我们通常还是将MD和RAID统称为RAID层。
 
一言以蔽之,MD设备包装了某种RAID以后,以块设备驱动程序的形式为内核提供服务。至于内核中是怎样实现MD的,将放在以后讨论。
 
mdadm  
如果将RAID编译到内核中,就可以使用各种RAID了,一般而言,通过"cat /proc/mdstat"就能看到MD设备的状态。而且用户可以通过 sysfs中提供的方式来访问RAID属性,具体如何使用这里就不多讲了,在以后的讨论中也许也会提到一些。但是,如何在应用层创建RAID并使用它的功能呢?linux软件RAID的作者Neil Brown也实现了一个应用层的工具mdadm。mdadm工具很方便也很强大,它几乎涵盖了RAID的方方面面。关于这个工具并不是我想讨论的重点,internet上应该可以获得更详尽的信息。
 
参考文献  
我在这一年里对linux内核的整体认识来源于两本书:《Linux Device Drivers 3e》(LDD3) Understanding Linux Kernel 3e》(ULK3)。其他linux的知识则主要是从互联网上获得,当然LDD3和ULK3在 网上都能找到电子版。在正式介绍RAID的过程中我会尽可能提供某些内容的出处,当然,能找到出处的内我就没有必要细说了,学习linux是离不开 internet的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值