第十二章 磁盘阵列 raid
12.1 raid技术简介
当一台服务器需要较大存储空间时,由于单块磁盘的空间容量相对较小,那么则需要连接多块磁盘。但是我们知道,一般计算机上的磁盘接口只有2-4块,服务器的磁盘接口可能有4-8块,不管怎样,接口数总是较少的。当需要连接更多磁盘时,则需要外界设备的辅助,磁盘阵列就是最常用的外界设备之一。
磁盘阵列(RedundantArrays of Independent Drives,RAID),简称盘阵。它就像一个电路板一样,上面有很多的磁盘接口,可连接多块磁盘。一般家庭或小型机房环境会使用到raid卡,一般会有4盘位、6盘位、12盘位等规格,操作简单,功能有限,也被称为raid卡。。但在正规的数据中心机房中,一般使用的磁盘阵列设备类似于一台主机,里面有自己的操作系统,可以设置很多的磁盘组合方案(即不同的raid级别),这种磁盘阵列很多都是由全球较大企业自主研发研发出,如:IBM、HP、EMC、华为、联想等。
由于生产环境中对数据的读写性能、稳定性、安全性有较高的要求,所以,可以借助于盘阵上的多块磁盘,按照特定的数据存储方案,组织、划分分区,以实现数据自动备份、数据恢复、性能提升等功能。下面我们就介绍一下常用的一些raid方式,即raid级别。
12.2 raid技术
12.2.1 raid0
raid0技术是指将多块磁盘组成一个组合,至少2块,多则几十块,生产环境一般使用在2-3块左右。raid0将在每块磁盘上占用相同的空间大小,那么raid0的总容量就是多块磁盘所占空间的总和。如2块磁盘,每块占用10G,则raid0总大小20G。
在存储文件时,raid0将文件平均存储到多块磁盘的,如:2块磁盘的raid0,存放100M的文件,则每块磁盘存放50m数据;3块磁盘的raid0存放90M数据,每块磁盘存放30M数据,以此类推。并且,当存储时,由于磁盘是相互独立的,则存入工作是多块磁盘同时进行的,即并行存入,读取时亦是如此。
由此可见,raid0技术可以很好的提升数据的读写速度,大约n块提升n倍。而且磁盘越多,速度提升越快,但由于raid0不具备数据备份功能,因此,当磁盘较多时,故障率也会随之提高,存在安全风险。所以,一般raid0中只使用2-3块磁盘为佳。
再深入的介绍下raid0的存储原理:以两块磁盘为例,平均存储文件时,它并不是把文件的前一半内容存入一块磁盘,后一半内容存入另一块磁盘的。raid0是将磁盘空间分成n多的小存储区域,称为区块,可手动指定区块大小,一般在64k-256k之间,存储时是第一块盘的第一个区块存满,转去存第二块盘的第一个区块,写满,再去存第一块盘的第二个区块,一次类推,所以raid0存储文件时会被分的很细、很碎。如下图:
raid0又被称为条带化(Linux、unix)、带区卷(windows)
12.2.2 raid1
raid1又称镜像分区、镜像卷。顾名思义,它也是使用多块磁盘,且每块磁盘占用相同空间大小。这多块磁盘间互为镜像关系,即备份。一般raid1会使用2-3块磁盘工作,文件存入一块磁盘时,其他磁盘也将文件全部再存一份,即所有操作都会在每块磁盘上完整操作一次。如:两块磁盘的raid1会把文件存储2份,三块磁盘的raid1会把文件存储3份。
这样raid1可以保证数据的安全性,若出现故障磁盘,其他磁盘上也会有完整的数据,不至于数据丢失。但raid1牺牲的是存储空间,即同一文件要占据两份空间的,所以会有空间的浪费,我们称之为磁盘冗余。如:一个2块磁盘的raid1,每块磁盘占用10G空间,总占用量是20G,但实际可用空间只有10G,磁盘冗余度是50%,若是三块磁盘的raid1,冗余度更高。
每块磁盘上的一份数据我们称为一份copy,如:三块磁盘组成raid1,即称数据有三个copy。当改变数据时,多块磁盘一起改变,以保证数据的一致性,称为数据同步。但raid1在性能上却没有读写速度的提升。
12.2.3 raid5
由于raid1的冗余度较高,为了能够在保证数据安全的前提下减少浪费,研发、推出了raid5技术。raid5要求至少由3块磁盘组成,且占用空间一致,采用多存一备的机制保证数据安全,并减少冗余。具体原理如下:
三块磁盘加入raid5分区,每块磁盘以64KB为单位被划分成n多的块区,存储数据时先存满两块磁盘的各64K,另一块磁盘不存数据,是将另两块盘的数据采用奇偶校验算法计算后,将结果存入第三块磁盘的64KB。并且,raid5上的磁盘采用轮流做备份区块的方式操作。奇偶校验是一种比较复杂的验证、校验算法,但对我们以后在Linux方面工作的帮助不大,所以,在此我们不做扩展介绍。为了帮助大家理解,我们以加法为例介绍具体过程,如下图:
如图,raid5在存放数据时,先把第一块磁盘的第一个64KB的块区存满,再去存第二块磁盘的第一个块区,然后将前两块磁盘的数据用算法做计算,假设是加法,则结果3存入第三块磁盘。同理,之后,再在第1、3块磁盘上存数据,第二块磁盘存备份,然后在第2、3块磁盘存数据,第1块磁盘存备份,依此类推。
这样数据将被分别存放在多块磁盘上,当有一块磁盘故障时,更换新的磁盘,通过算法的逆运算(图例中逆运算即是减法)就能够恢复回丢失的数据。而且,空间冗余度只有1/3。若raid5中有4块磁盘则,三存一备,冗余度会是1/4。可见,raid5中磁盘越多,冗余度月底。但是raid5也有缺点,它不支持同时两块或以上故障盘的数据修复。所以,raid5分区不建议有太多磁盘,3-5块即可。
12.2.4 raid技术总结
综上,我们来对三种raid技术做下比较:
1)raid0
特性:占用两块以上的磁盘,多块磁盘占用的空间必须一样大,存储文件时,是把文件平均存储到各个磁盘的,且各个磁盘同时做读写操作。
优点:读写性能有提升。
缺点:不具备数据备份、恢复功能,若有一块故障盘,则分区失效,数据丢失
2)raid1
特性:要占用2块以上的磁盘,一般3、4块即可,多块磁盘占用的空间必须一样大,存储文件时,各个磁盘都把文件完整的存一份,等同于做了多次复制。
优点:磁盘间互为备份,若有故障盘,可做数据恢复
缺点:浪费磁盘空间。冗余度高。
3)raid5
原理:占用至少3块磁盘,每盘磁盘空间都会按照64KB为单位划分成n多存储区域,以3块磁盘为例:前两块存满64KB数据,第三块使用前两块的数据,按照特定的奇偶校验算法,计算出结果当做备份并存入3块磁盘轮流存数据,轮流做备份。磁盘冗余度:1/n
优点:支持备份、恢复,冗余度低
缺点:不支持2块或更多的磁盘故障,一般建议磁盘数3-5块
另外,其实raid技术还有很多其他级别,如:raid2、raid3、raid4等,最高可达raid9,但是由于其他raid技术在实现时较为复杂,所以当前使用最多的只是raid0、raid1、raid5三种。
12.3 raid复用
从上节可知,每种raid技术都有各自的特点与缺点,如果我们想既可以提高读写速度,又想能够保证数据安全,该怎们做呢?这就可以使用raid复用技术来实现。
12.3.1 raid0 1
raid0 1 又称raid01。是将多块磁盘分为两组,组内采用raid0机制,组之间采用raid1机制。如图:
如图,当我们要存入一个100MB文件时,先按raid1存入,即两侧各存入100MB,然后每组内使用raid0,即组内的两块磁盘各存50MB。这样我们可以分析得到,100MB的文件,实际存入磁盘时只需要使用存50MB的时间,提升了速度,同时还具备数据备份功能。
当有一块磁盘故障时,可能一侧的数据丢失了,但另一侧的数据是完整的。即便一侧故障多块磁盘,另一侧也不受影响。但是,raid01不能解决两侧同时有故障盘的情况。
12.3.2 raid1 0
raid0 1又称raid01。是将多块磁盘分为两组,组内采用raid1机制,组之间采用raid0机制。如图:
图中,假设要存入100MB的文件,先按raid0,两侧各分50MB,然后每组内使用raid1,每块磁盘存放50MB数据。所以,100MB的文件存储到磁盘上,只需要50MB的存储时间,并且具备数据备份功能。如果出现一块故障磁盘,同侧的磁盘上即有备份。如果两侧各坏一块磁盘,都可以通过备份恢复数据。但是,如果同一侧故障两块磁盘,则丢失了一半的数据,不可恢复。
相比较于raid0 1,虽然故障磁盘出现的概率是不可控的,但其实在生产环境中,我们使用raid0 1的概率是更高些的,这是因为除了磁盘会有故障,还有盘阵、连接盘阵的线路等也可能出现异常,那么能够解决单侧多盘故障的方案就会更为实用些。
12.3.3 raid5 1
之前我们看了raid0 1、raid1 0的复用,这两种模式的数据稳定性还是存在很大风险的,当在对数据安全要求比较高的项目中,我们需要使用安全性、稳定性更高的复用模式,这时使用raid5就是备选方案之一。
如图,两组磁盘内部使用raid5,两组之间使用raid1,这种组合,虽然对数据的读写速度没有太大提升,但是在数据修复方面却具有较强的健壮性。
我们可以分析得到,一侧内坏一块盘时,可以通过同组内的另外两块盘把数据恢复回来,若一侧内故障两块磁盘,则这一侧的数据丢失了,但另一侧的数据是完整的。再多坏一块磁盘,就算是在另一侧内的也是可以恢复数据的,所以raid5 1可以解决任意50%的故障率。而且只要不是两侧各故障两块磁盘以上,即一边坏3块,一边坏1块,也是可以恢复的。
但是,raid5 1的缺点也是很明显的,分析可知,6块磁盘的环境下,真正有效存储的磁盘只有2块,冗余度有2/3之高。所以这种方案只在对数据稳定性要求较高的项目中使用。
12.3.4 raid复用技术小结
1) raid0 1 ---raid01
原理:两组磁盘,每组内部使用raid0,两组之间使用raid1,数据存储时,先按raid1两组都存完整的一份,组内raid0平均存。
特性:有速度提升,且支持备份、恢复
缺点:无法解决两组内各坏一块盘,可解决单侧坏多盘
2) raid1 0 ---raid10
原理:两组磁盘,每组内部使用raid1,两组之间使用raid0,数据存储时,先按raid0两组平均存,再组内各盘存完整的一份
特性:有速度提升,且支持备份、恢复
缺点:无法解决一组内坏两块盘,可解决两侧各坏一块盘
3) raid5 1 ---raid51
原理:两组磁盘,每组内部使用raid5,两组之间使用raid1,数据存储时,先按raid1两组都存完整的一份,组内raid5存储
优点:健壮性强,可解决50%的故障率
缺点:没有读写速度的优化,冗余度高
12.4 Linux中实现raid技术
上几节我们介绍了raid技术的基本概念,在实际生产环境中,一般都是用在物理盘阵上使用多块磁盘组成各种raid分区,这种raid我们称为硬raid,而且,在实际的项目中,也会有专职的磁盘管理人员负责盘阵的日常运维,项目中称为存储岗。而下面我们要在Linux中做的实验,是通过Linux中的软件工具实现的,即软raid。所以这个实验更多是为了让大家理解raid的思路与功能。
12.4.1 Linux中创建raid1分区
首先要在Linux制作raid分区,需要先安装raid的管理包,mdadm,Linux安装光盘上即有,可直接使用
yum -y install mdadm
然后,我们按一下步骤逐步操作:
1、创建分区
fdisk /dev/sda
新建三个分区:sda7 600M sda8 800M sda9 1000M
都设定文件系统类型为 fd Linux raid
注:本实验中,我们使用三个分区为raid提供存储空间,实际生产环境正更常使用整块磁盘做raid,如:sdb sdcsdd等
2、创建raid1分区
mdadm -C /dev/md0 -a yes -l 1 -n 2 -x 1 /dev/sda7 /dev/sda8 /dev/sda9 ---创建raid1分区
参数介绍:-C 创建新分区 raid分区名必须叫 /dev/mdX X表示是第几个的编号 -a yes 自动创建设备,-l 设定raid等级,-n 指定raid中的可用设备数,即使用几块磁盘组件raid ,-x 指定热备盘数。
热备盘:即多准备的一块备用盘,出现故障后,会自动使用热备盘做恢复、修复,无需等待人为发现故障后再手动解决,缩短了故障的解决反应时间。
注:命令执行后会提示说由于三个分区空间不一致,所以会按照最小空间的磁盘,即sda7的大小创建raid1,则sda9上会有浪费,询问是否继续?输入y,确认继续创建即可
mdadm -D /dev/md0 ---查看raid分区详细信息
可查看到,sda7、sda8为活动的镜像盘active sync,sda9为热备盘sqare
cat /proc/mdstat ---查看本机所有raid分区状态
3、制作文件系统,挂载
mkfs -t ext4 /dev/md0
mkdir /mnt/d1
mount /dev/md0 /mnt/d1
4、撤销、清除raid分区
mdadm -S /dev/md0 ---关闭、清除raid分区。
注:关闭会直接删除分区文件/dev/md0
12.4.2 制作配置文件
与之前的很多实验类似,手动创建的raid分区,重启后也会失效、丢失,所以需要写入配置文件中。过程如下:
mdadm -C /dev/md0 -a yes -l 1 -n 2 -x 1 /dev/sda7 /dev/sda8 /dev/sda9
mdadm -Ds >> /etc/mdadm.conf ---创建mdadm的配置文件
注:mdadm -Ds --- 扫描当前raid信息,-s表示扫描
vi /etc/mdadm.conf
开头写入:device /dev/sda7 /dev/sda8 /dev/sda9
功能:指定创建raid分区的磁盘或源分区
下面来验证一下:
mdadm -S /dev/md0 ---删除raid
mdadm -As /dev/md0 ---重建回md0
注:-s 表示从/etc/mdadm.conf文件中找到md0,-A表示启动
vi /etc/fstab ---设置开机自动挂载
/dev/md0 /mnt/d1 ext4 defaults 1 2
若没有创建mdadm配置文件,raid分区删除后,我们可以使用如下命令手动重建:
mdadm -A /dev/md0 /dev/sd[789]
12.4.3 故障盘处理
当raid中出现故障盘磁,若该磁盘彻底故障不可读写,则raid会自动发现并启用热备盘,自动从正常可用的盘上把数据复制到热备盘,热备盘即变成镜像盘
但是如果是读写变慢,有故障风险的磁盘,在磁盘并未彻底故障前,raid仍会视该盘为可用盘,此时需要人为标记为故障盘,让raid启用热备盘。实验模拟如下:
mdadm /dev/md0 -f /dev/sda8 --- -f强制设定故障磁盘,即标记故障盘
mdadm -D /dev/md0 ---可查看到故障盘位fault状态,并热备盘启用
mdadm /dev/md0 -r /dev/sda8 ---把故障盘从raid中删除
mdadm /dev/md0 -a /dev/sda10 ---加入新盘,作为热备盘使用
mdadm -D /dev/md0 ---可查看到新加入的盘作为热备盘
12.4.4 设定raid监控报警
我们可以使用raid内的监控程序,当raid发生故障时,给用户发送邮件做通知,命令如下:
mdadm --monitor --mail=root@localhost --delay=30 /dev/md0 &
注:设定后台运行监控程序,回车后可见进程ID,用jobs命令可查看到后台进程。
参数解释:--monitor 启动监控进程 --mail 指定出现故障后给谁发邮件
--delay 指定检测raid分区的时间间隔,单位:秒
下面我们可以模拟发生磁盘故障后被检测到,然后查看邮箱:
mdadm /dev/md0 -f /dev/sda7
mail ---查看邮箱,可见报警邮件,前提:当前是以root登录的。
若想关闭后台监控进程,则需使用下面的命令:
kill -9 进程ID ---杀死后台的监控进程
12.5 给LV配置raid
其实,我们的LVM管理,就支持制作raid功能的LV,具体如下:
12.5.1 制作raid0功能的LV
因为raid0的工作原理是给磁盘划分区块后,多块磁盘轮流存入数据,所以对现有的已经制作好文件系统的LV,无法升级为raid0级LV,所以只能在创建LV时设定为raid0状态。过程如下:
1、创建VG
首先:清空raid后,重建sda[789]三个分区,并设定为LVM的文件系统
vgcreate /vg01 /sda[789]
2、VG中创建raid0LV
lvcreate -L 300M -i 2 -I 64K -n lv_r0 vg01
3、查看信息
lvdisplay
lvs –a ---查看LV信息,功能类似于display,但可见到raid类型
lvs -a -ovg_name,name,devices,size ---指定显示列查看
注:-a 显示所有lv信息,-o 指定显示的列
12.5.2制作raid1功能的LV
我们也可以在创建LV时,直接指定创建为带镜像功能的LV,即raid1级LV。
lvcreate -L 400M -m 1 -n lv_r1 vg01 ---创建raid1级LV
参数:-m 表示增加1个镜像,即做几个备份mirror
注:镜像又称为mirror,给源数据增加一份镜像,又称为增加一个mirror
lvdisplay -m/dev/vg01/lv01 ---可见raid1镜像信息
lvs -a -o devices
注: devices是在lvs原有的显示结果后增加devices列,即显示所在设备。
12.5.3 raid1级LV故障修复
当raid1出现故障时,我们的解决思路是:先通知LV去除镜像功能,把raid1中故障盘上的mirror删除。再从VG中的一个可用PV上,重新与LV建立镜像关系,重建mirror,或重新加入新PV到VG中,恢复镜像。具体模式实验如下:
首先我先故意破坏一个分区,模拟故障盘:
dd if=/dev/zero of=/dev/sda7 bs=100M count=3 ---模拟sda7故障
lvs -a -o devices ---再次查看会发现故障盘,显示为unknown未知状态
pvdisplay ---查看PV,也会见到丢失的磁盘
其实,当前的LV中的sda7数据是丢失的,在有丢失磁盘(miss或unknown状态)的情况下,VG、LV是不可删除、清理的,我们可以自行用lvremove、vgremove尝试下,会发现命令是不能正确执行的。
所以必须先把故障磁盘剔除后,VG、LV才可以正常操作。命令如下:
vgreduce --removemissing --force vg01 ---把丢失的磁盘从vg中清除
pvdisplay ---再次查看会发现丢失的磁盘不见了
lvs -a -o devices ---查看LV会发现某个镜像无磁盘存放
这时候我们需要通知LV把故障磁盘上的mirror镜像删除
lvconvert -m 0 /dev/vg01/lv_r1 ---更改lv的镜像数为0,即去除镜像功能,成为普通LV
lvconvert -m 1 /dev/vg01/lv_r1 /dev/sda9 ---增加回镜像,并指定在哪个PV上加镜像
lvs -a -o devices --再次查看,恢复正常
重建mirror的过程,其实也是给现有LV增加mirror,升级成raid1级LV的过程,命令操作基本一样,读者可自行操作验证。
说明:以上我们所讲解的创建带raid功能LV的过程,仅介绍了LV的配置管理,其实LV创建成功后,仍然需要制作文件系统,再挂载使用。同样需要编辑/etc/fstab配置文件,让其开机自动挂载。具体操作读者可自行完成。