大话存储系列6——RAID实现

1、RAID卡结构:

实现了raid功能的板卡(SCSI卡或者IDE扩展卡)就叫做RAID卡。同样,在主板南桥芯片上也可实现RAID功能,由于南桥中的芯片不能靠CPU来完成他们的功能,所以这些芯片完全靠电路逻辑来自己运算,尽管速度很快,但是功能相对插卡式的RAID卡要弱。从某些主板的宣传广告中就可以看到,所谓板载raid芯片就是指南桥中有实现raid功能的芯片。

这样操作系统不需要作任何改动,除了RAID卡驱动程序之外不用安装任何额外的软件,就可以直接识别到已经过raid处理而生产的虚拟磁盘。

对于硬件的raid卡,操作系统无法感知底层物理磁盘,只能通过厂家提供的raid卡的管理软件来查看卡上所连接的物理磁盘。而且,配置raid卡的时候,也不能在操作系统下完成,而必须进入这个硬件来完成(或者在操作系统下通过raid卡配置工具来设置)。一般的raid卡都是在开机自检的时候,进入他的ROM配置程序来配置各种RAID功能。

RAID卡的结构图:


scsi  RAID卡上一定要包含SCSI控制器,因为其后端连接的依然是SCSI物理磁盘。其前端连接到主机的PCI总线上,所以一定要有一个PCI总线控制器来维护PCI总线仲裁、数据发送接收等功能。还需要一个ROM,一般都是用flsh芯片作为ROM,其中存放着初始化RAID卡必须的代码以及实现RAID功能所需的代码。

RAM的作用,首先是作为数据缓存,提高性能;其次作为RAID卡上的CPU执行RAID运算所需要的内存空间。XOR芯片是准们用来做RAID3,5,6,等这类校验型RAID的校验数据计算用的。如果让cpu来做校验运算,需要执行代码,将耗费很多周期。而如果直接使用专用的数字电路,一进一出就立即得到结果。所以为了解脱CPU,增加了这块专门用于XOR运算的电路模块,大大增加了数据校验计算的速度。

RAID卡与 SCSI卡不是同一个东西,RAID卡有raid功能,而SCSI卡上市不会又raid功能的,如果RAID卡上有多个SCSI通道,那么就成为多通道RAID卡。目前scsi RAID 卡最高有4通道,其后端可以接入4条SCSI总线,所以最多连接64个SCSI设备。有了RAID卡之后,SCSI控制器(SCSI卡)就能了RAID程序代码的傀儡,raid让它干啥,他就干啥,SCSI控制器对它下面掌管的磁盘情况完全明了,它和RAID程序代码之间进行通信。RAID程序代码知道SCSI控制器掌管的磁盘情况之后,就按照ROM中所设置的选项,比如RAID类型,条带大小等,对RAID程序代码做相应的调整,操控它的傀儡SCSI控制器向主机报告“虚拟”的逻辑盘,而不是物理磁盘了。

RAID卡会向每个磁盘写入一些RAID信息(这也是做过raid的磁盘与普通磁盘唯一的区别,raid磁盘里不会又条带化的信息,因为条带化信息在raid卡内),这样即使将这些磁盘拿下来,放到同型号的另一块RAID卡上,也能无误地认出以前做好的raid信息。

条带化之后,raid程序代码就操控SCSI控制器向OS层驱动程序代码提交一个虚拟化之后的所谓的“虚拟盘”或者称“逻辑盘” 也有人干脆称为LUN

下图展示RAID卡:


下面展示一下SCSI卡:



下面单独看一下SCSI接口长什么样子:

更多了解请参照转来的博客:http://blog.csdn.net/changyanmanman/article/details/8443722


2、RAID实现组合

RAID50:

           RAID50是RAID5与RAID0的结合。此配置在RAID5的子磁盘组的每个磁盘上进行包括奇偶信息在内的数据的剥离。每个RAID5子磁盘组要求三个硬盘。RAID50具备更高的容错能力,因为它允许某个组内有一个磁盘出现故障,而不会造成数据丢失。而且因为奇偶位分部于RAID5子磁盘组上,故重建速度有很大提高。优势:更高的容错能力,具备更快数据读取速率的潜力。需要注意的是:磁盘故障会影响吞吐量。故障后重建信息的时间比镜像配置情况下要长。


    RAID50也被称为镜象阵列条带,由至少六块硬盘组成,象RAID0一样,数据被分割成条带,在同一时间内向多块磁盘写入;象RAID5一样,也是以数据的校验位来保证数据的安全,且校验条带均匀分布在各个磁盘上。其目的在于提高RAID5的读写性能。

RAID10和 RAID01:

     根据组合分为RAID 10和RAID 01,实际是将RAID 0和RAID 1标准结合的产物,在连续地以位或字节为单位分割数据并且并行读/写多个磁盘的同时,为每一块磁盘作磁盘镜像,余。


它的优点是同时拥有RAID 0的超凡速度和RAID 1的数据高可靠性,但是CPU占用率同样也更高,而且磁盘的利用率比较低。
RAID 1+0:是先镜射再分区数据,再将所有硬盘分为两组,视为是RAID 0的最低组合,然后将这两组各自视为RAID 1运作。假如此时左侧组内一块硬盘Disk0损坏,则左侧不能再有损坏的盘,但是允许右侧disk2或者disk3损坏一块。
RAID 0+1:则是跟RAID 1+0的程序相反,是先分区再将数据镜射到两组硬盘。它将所有的硬盘分为两组,变成RAID 1的最低组合,而将两组硬盘各自视为RAID 0运作。假如此时左侧disk0损坏,现在之后唯一disk1损坏方可,别的一旦损坏,数据将完全作废。
能上,RAID 0+1比RAID 1+0有着更快的读写速度。可靠性上,当RAID 1+0有一个硬盘受损,其余三个硬盘会继续运作。RAID 0+1 只要有一个硬盘受损,同组RAID 0的另一只硬盘亦会停止运作,只剩下两个硬盘运作,可靠性较低。因此,RAID 10远较RAID 01常用,零售主板绝大部份支持RAID 0/1/5/10,但不支持RAID 01。

3、虚拟磁盘

目前各种RAID卡都可以划分逻辑盘,逻辑盘大小任意设置。每个逻辑盘对于OS来说都认成一块单独的物理磁盘。这里不要和分区搞混了,分区时OS在一块物理磁盘上做的再次划分。而RAID卡提供给OS的,任何时候,都是一块或者几块逻辑盘,也就是OS认成的物理磁盘。而OS在这个磁盘上,还可以进行分区、格式化等操作。

RAID卡对逻辑磁盘再次划分的具体细节:既然要划分,就要心中有数,比如某块磁盘的某个区域,划分给那个逻辑盘使用,对应逻辑盘的LBA地址是多少,这块磁盘的RAID类型是什么等。而这些东西不像RAID映射那样根据几个简单的参数就能确定,而起对应关系是可以随时变化的,比如扩大和缩小,移动等。所以有必要再每块磁盘上保留一个区域,专门记录这宗逻辑盘划分信息,RAID类型以及组内的其他磁盘信息等,这些信息通称为RAID信息。SNIA委员会为了统一RAID信息的格式,专门定义了一种叫做DDF的标准,


RAID卡可以针对总线上的某几块盘做一种RAID类型,然后针对另外的几块盘做另外一种RAID类型。一种RAID类型中包含的磁盘共同组成一个RAID Group,简称RG。逻辑盘就是从这个RG中划分出来的,原则上逻辑盘不能跨RG来划分,就是说不能让一个逻辑盘的一部分处于一个RG,另一部分处于另一个RG。因为RG的RAID类型不一样,其性能也不一样,如果同一块逻辑盘中出现两种性能,对上层来说不是一件好事,速度可能会忽快忽慢。


4、逻辑卷管理

逻辑卷一旦创建,之后就无法改变,如果开始的时候划分了100G的逻辑盘,但是两年之后,空间使用快满了,但是又不能放到别的磁盘(逻辑盘),因为受上层文件系统的限制,一个文件不可能跨越多个分区来存放。更别提多个磁盘了。如果一个文件超过了这100G,那就死路一条了。。

所以必须有一种机制,在一个逻辑磁盘空间满了的时候,可以轻易的添加空间,而不让原来的数据受到损害,如果在RAID控制器那一层去划分,对于实现来说,不容易。所以,我们考虑把RAID控制器提交给OS的逻辑磁盘(OS会认为是物理磁盘),重现加以组织,再分配。这就是VM(Volume Manger)卷管理。

通过使用Linux的逻辑卷管理器(Logical Volume Manager, LVM),用户可以在系统运行时动态调整文件系统的大小,把数据从一块硬盘重定位到另一块硬盘,也可以提高I/O操作的性能,以及提供冗余保护,它的快照功能允许用户对逻辑卷进行实时的备份。

对一般用户来讲,使用最多的是动态调整文件系统大小的功能。这样,你在分区时就不必为如何设置分区的大小而烦恼,只要在硬盘中预留出部分空闲空间,然后根据系统的使用情况,动态调整分区大小。

再深入介绍逻辑卷管理之前,我们先了解如下概念:

  • 物理卷(Physical Volume, PV):LVM操作系统识别到的物理磁盘(或者RAID提交的逻辑磁盘)改了个叫法,叫物理卷, 物理卷可以是一个磁盘,也可以是磁盘中的一个分区。它为LVM提供了存储介质。
  • 逻辑卷组(Logical Volume Group, LVG):多个PV可以被逻辑的放到一个VG中,逻辑卷组是一个虚拟的打存储空间,逻辑上是连续的,它可以由多块PV组成,此时VG会将所有PV首尾相连,组成一个逻辑上连续编址的大存储池,这就是VG。在一个VG上可以创建多个逻辑卷(LV)。
  • 物理区块(Physical Partion):它是在逻辑上再将一个VG分割成连续的小块(注意,是逻辑上的分割,而不是物理上) ,也就是说LVM会记录每个PP的大小(具体有几个扇区组成啊),还会记录PP的序号偏移。这样就相当于在VG这个大池中顺序切割,比如我们假设一个PP的大小是4MB,那么由之前的知识知道一个扇区是512B,所以4MB/512B =8192 个扇区。  如果PV是实际的一块物理磁盘,那么这些扇区就是连续的。如果PV本身是经过RAID控制器虚拟化形成的虚拟盘(LUN),那么这些扇区可能位于若干条带中:也就是说这8192个扇区物理上不一定连续。
  • 逻辑区块(logical Partition):PP可以再次组成LP,逻辑区块是比较难理解的,一个LP可以对应一个PP,也可以对应多个PP。前者对应前后没有什么区别,而后者,又分为两种情况:一种为多个PP,组成一个大的LP,像是RAID0一样;另一种是一个LP对应几份PP,这几份PP没一份内容都一样,类似于RAID1,对个PP内容互为镜像,然后用一个LP来代表它们,往这个LP写数据,也就同时写入了这个LP对应的几份PP中。
  • 逻辑卷(Logical Volume, LV): 若干LP再经过连续组合成LV,也就是LVM所提供的最终可用来存储数据的单位。生产逻辑卷,在主机看来还是和普通磁盘一样,对其进行分区,格式化等。每个逻辑分区上都可以创建具体的文件系统。
LVM看起来很复杂,其实操作起来很简单,我们理一下思路,首先创建PV(真实或者RAID提供)——> 将PV加入VG ——> 在VG中创建LV  ——> 然后格式化这个LV,当成普通硬盘来使用。 

新插入一个逻辑层,对单个硬盘的读写会有一定的性能损失,但其带来的好处是巨大的。首先,逻辑分区大小不再受硬盘实际大小的限制,它可以扩展到几块硬盘上;其次,逻辑分区可以很方便的做调整大小、备份等维护操作;而且,如果系统中存在多块硬盘,通过设置逻辑卷到物理卷的映射关系(采用LVM striped mapping),可以提高I/O的读写性能,因为此时的读写是在多块硬盘上并发进行的,比对单个硬盘的读写显然要快很多。

下面是一个LVM使用的例子: 



更多逻辑卷管理的资料参照博客:http://www.ibm.com/developerworks/cn/linux/l-lvm2/index.html


5、VGDA

VGDA(Volume Group Descriptor Area),VG中包含了哪些PV都写在了VG中的一个区域,这个区域就是VGDA,VGDA记录了VG的很多重要相关信息,包括VG中包含的PV的PV ID。


VGDA非常重要,所以被保存了多份。如果VG中只有一块磁盘,则该磁盘上保存2份VGDA;VG包含2块磁盘,则第1块磁盘包含2份VGDA,第2块只包含1份;VG中包含3块磁盘,则每个磁盘都保存有1份VGDA。

完好的VGDA与VG中总磁盘总数之比为Quorum,如果Quorum小于50%,此VG不能被继续访问,如果已经被激活,则自动关闭。
由于每一块磁盘上至少有一份VGDA,所以在一个新小型机上,只要给出未知VG中一块磁盘,就可以正确识别全部VG的信息,并注册到新小型机上,这个过程叫Import
命令是improtvg -y vg_name hdiskx

vg_name是希望的VG名,在执行improtvg时可以自定义VG名,因此系统中并没有更改VG名称的命令,如果想更改VG的名称,需要先执行exporrtvg命令,此命令没有对磁盘进行任何操作,磁盘上数据依然存在,只是将此VG在小型机系统中的定义删除了,任何时候可以重新Import回来.

在执行improtvg时候,系统可以从指定磁盘上读到VG中所有磁盘的定义,但如果VG中一些磁盘没有被系统识别到,(通过PV ID找寻到,VGDA中包含某个PVID在操作系统中所有磁盘设备上都找不到,可能的原因既包括该磁盘不存在,也可能是PVID没有正确读出来).那么系统将计算Quorum,大于50%,可以执行,但会有警告,小于50%,不允许improt此VG.
系统管理PV完全是靠PVID,尽管HDISKX设备号可变,但PVID不会变.拿到另一台机器也是如此,如果用命令改变了PVID,系统将认为原来的磁盘消失了,不能再找回来.更不巧的是,如果原有的PV还属于某个VG,那么这个VG再也发现不了他原来的成员盘,这个盘上的数据就无法找回,虽然磁盘和数据都存在.
1台主机hdisk2的VGDA信息丢失,恢复的步骤:
datavg包含hdisk1 hdisk4 hdisk2,
hdisk2的VGDA信息丢失,(判断方法:lqueryvg -Atp hdisk2,无法得到结果)
导致hdisk2中的LV全部不能MOUNT。
#lsvg -p datavg
hdisk1 active datavg
hdisk2 missing datavg
hdisk4 active datavg
exportvg 以后,rmdev -dl hdisk2,此时hdisk2的PVID也没有了
#lspv
hdisk2 none None
要恢复hdisk2中的LV信息,首先要把hdisk2想办法加入到datavg中。
# chdev -l hdisk2 -a pv=yes
此时,hdisk2又恢复了以前的PVID了。
# synclvodm datavg
将把hdisk2加入到datavg中,(因为系统的ODM库中,知道PVID=hdisk2是DATAVG的PV)
# lspv
hdisk2 0002039490ef datavg
# exportvg datavg (从ODM库中删除VGDA的信息)
# importvg -y datavg hdisk4 (不要HDISK2,因为此时HDISK2的VGDA是坏的)
importvg 的时候,系统会再次做synclvodm,这次将会把系统ODM中VGDA的信息同步到hdisk2上。
# lsvg -p datavg
hdisk1 active datavg
hdisk2 active datavg
hdisk4 active datavg
此时,HDISK2上的VGDA信息又恢复了。里面的LV可以读写了。不过对于HDISK2上的文件系统,需要做个fsck。


posted @ 2013-03-10 15:18  长烟慢慢  阅读(453)  评论(0编辑  收藏  举报