在Linux中组建软Raid

Linux ginotang 1130℃ 0评论

Raid简介

关于Raid的定义,《维基百科》有很好的解释

独立硬盘冗余阵列(RAID, Redundant Array of Independent Disks),旧称廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks),简称磁盘阵列。其基本思想就是把多个相对便宜的硬碟组合起来,成为一个硬碟阵列组,使性能达到甚至超过一个价格昂贵、容量巨大的硬碟。根据选择的版本不同,RAID比单颗硬碟有以下一个或多个方面的好处:增强资料整合度,增强容错功能,增加处理量或容量。另外,磁碟阵列对于电脑来说,看起来就像一个单独的硬碟或逻辑存储单元。分为RAID-0,RAID-1,RAID-1E,RAID-5,RAID-6,RAID-7,RAID-10,RAID-50,RAID-60。

Raid的作用主要见于服务器当中,它可使数据储存更加可靠,也有的单纯利用Raid提高硬盘的传输速度,不过比较少见。我们常用的Raid类型主要有Raid0、Raid1、Raid5、Raid6和Raid10(1+0)。本文不对各种Raid作详细的介绍,具体可参看《维基百科》:

https://zh.wikipedia.org/wiki/RAID

其他相关概念

硬盘条带化(stripe):通过将一个完整的数据拆分成多个小数据块,把这些小数据块分别储存到不同的硬盘中。这样做的目的在于可以提高硬盘的传输速度和储存容量(各个硬盘容量的总和),Raid0中使用的就是条带化技术(striping)。

Raid0 striping (图片来源于网络)Raid0

在条带化技术中,影响硬盘性能的还有其他因素,例如下面的两个

  • stripe size            条带大小(数据可被划分的最小单元)
  • stripe width          条带宽度(同时可以写入或读取的硬盘数量,Raid0为所有成员的数量)

stripe size有时候被称为stripe length、stripe unit或chunk size。以两个硬盘组成的Raid0为例,要写入一个4K的数据,那么每一个硬盘每次写入的数据就是2K,这个2K就是stripe size,而stripe width就是2(2个硬盘)。当然stripe size并不是固定不变的,我们可以自由调节它的大小,但是必须有依据,这个依据就是硬盘的平均寻道时间

  • stripe size越小,数据被切分的数量就越多,结果就是平均寻道时间越长,即数据读取时间会越久,但它的优点是写入速度快。
  • stripe size越大,数据切分的数量就越小,平均寻道时间就越短,即读取时间更快,不过其缺点是写入速度慢。
  • stripe width越多,数据可切分的数量越大,数据粒度更小,因此写入速度更快,同样,由于数据碎片化程度变大,因此数据读取时间变得更长

至于如何选取合适的stripe size,就需要根据服务器的用途来设定。一般也可以根据下面的原则来定:储存大文件(例如视频,图片)使用小的stripe size,相反,储存小文件(例如一般的文档)就用大一点的stripe size。stripe size一般都是2的N次方倍。

另外stripe width是实际可以写入数据的硬盘个数,在Raid5、Raid6这些磁盘阵列中,它们并不是所有的硬盘都用于写入数据,其中一些用于保存parity信息。组建Raid5最小的硬盘数量是3,Raid6是4,也就是说,Raid5最小需要1个硬盘保存parity,而Raid6是2个,因此,它们的stripe width分别是

  • Raid5: stripe width = 3-1=2
  • Raid6:stripe width = 4-2=2

创建软件Raid

在Linux系统中,软Raid的创建和管理都是使用命令mdadm。mdadm命令参数众多,但是一般常用的就是那几个。

准备工作

由于是在虚拟机中做的实验,因此我们另外添加3个虚拟硬盘组建Raid1,2个硬盘作为Raid的成员,一个作为Spare。

Raid Disk

开启虚拟机,使用lsblk命令查看当前的设备:

其中sdb、sdc和sdd硬盘就是我们使用的3个硬盘。

正式开始创建Raid1

raid的创建是非常简单的,使用下面的命令即可

如果没有错误信息,最后一行array /dev/md0 started表示Raid已经被创建成功。

不过值得注意的是:–chunk参数在raid1中是没有意义的,因为raid1是镜像型的Raid,数据被完整复制到另一个硬盘中,raid1并没有使用striping技术。上面使用了这个参数,只作为练习的目的。

查看Raid状态

通过命令mdadm --detail 查看Raid的状态

除了上面的命令外,还可以使用下面的命令查看Raid的状态

UU表示两个两个硬盘都正常使用,如果有硬盘失效,U所表示的硬盘位置会变成一个下划线”_“。

格式化和挂载Raid磁盘

虽然Raid1创建好了,但是目前它还是不能使用的,因为当前它还没有文件系统,而且也没有挂载点。

格式化Raid设备

挂载Raid设备

至此,一个可用的Raid阵列已经创建完毕。

开机自动挂载Raid

只需要在/etc/fstab中添加对应的行,就可以实现Raid的开机自动挂载,因此我们需要/dev/md0的UUID,通过blkid命令可以获得:

下一步就是写入/etc/fstab文件

完成后重启虚拟机,系统就会自动把/dev/md0挂载到/mnt/raid1目录下。

Raid管理

由于服务器长时间运作,硬盘出现损坏是必然,这个时候,就需要更换掉出错的硬盘,使Raid阵列能够如常提供服务。Raid管理的命令为mdadm --manage

模拟硬盘损坏

因为我们组建的是软Raid,因此Raid的一系列状态都可以自由控制,下面是模拟Raid硬盘损坏(掉线)的情况:

raid failed

上面的命令中,我们使sdc硬盘状态为fail,由于创建Raid的过程中,设置了sdd为Spare硬盘,所以,Raid自动使用该硬盘来重建阵列,Raid当前依然正常运作,不过,现在已经没有了Spare硬盘。

添加Spare硬盘

后备硬盘的好处不言而喻,它可以使Raid的运行更加可靠。由于之前的后备硬盘现在已经使用,要重新添加一个新硬盘作为后备,之前faulty的硬盘已经可以移除:

添加新的Spare

移除Raid

当有一天你不再使用这个阵列的时候,会希望把它删除。删除Raid的过程很简单,但是需要注意的是,删除Raid和停止Raid并不一样。在Raid的创建过程中,会把一些metadata(也叫做superblock)信息写入到硬盘的特定位置,当系统启动的时候,会根据这些信息判断一个硬盘是否Raid的成员,所以,要完整的删除一个Raid,必须先把Raid成员的superblock信息清除干净。

获取superblock信息

要获取superblock的信息,可以使用mdadm --examinemdadm -E命令查看,例如:

清除superblock信息

使用 --zero-superblock命令删除设备的superblock信息,但是清除之前必须停止Raid,否则会出现mdadm: Couldn’t open /dev/sdb for write – not zeroing的错误信息:

更详细的superblock资料,可参照《维基百科》:RAID superblock formats

移除挂载信息

superblock信息清除完毕后,需要把/etc/fstab文件中的自动挂载信息也一起删除,否则会造成系统重启无法进入正常模式,且出现类似下面的错误:

Error getting authority: Error initializing authority: Could not connect: No such file or directory (g-io-error-quark, 1)

转载请注明:Pure nonsense » 在Linux中组建软Raid

喜欢 (0)
0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x
()
x