侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

绿泡泡:___zze,添加备注来意

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

Linux基础(36)之RAID

zze
zze
2019-10-22 / 0 评论 / 0 点赞 / 398 阅读 / 10158 字

介绍

磁盘阵列(Redundant Arrays of Independent Drives,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意。
磁盘阵列是由很多块独立的磁盘,组合成一个容量巨大的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能。利用这项技术,将数据切割成许多区段,分别存放在各个硬盘上。
磁盘阵列还能利用同位检查(Parity Check)的观念,在数组中任意一个硬盘故障时,仍可读出数据,在数据重构时,将数据经计算后重新置入新硬盘中。
独立磁盘冗余阵列(RAID,redundant array of independent disks)是把相同的数据存储在多个硬盘的不同的地方(冗余地)的方法。通过把数据放在多个硬盘上,输入输出操作能以平衡的方式交叠,改良性能。因为多个硬盘增加了平均故障间隔时间(MTBF),储存冗余数据也增加了容错。
由加利福尼亚大学伯克利分校(University of California-Berkeley)在 1988 年,发表的文章:“A Case for Redundant Arrays of Inexpensive Disks”。文章中,谈到了 RAID 这个词汇,而且定义了 RAID 的 5 层级。伯克利大学研究目的是反映当时 CPU 快速的性能。CPU 效能每年大约成长 30~50%,而硬磁机只能成长约 7%。研究小组希望能找出一种新的技术,在短期内,立即提升效能来平衡计算机的运算能力。在当时,柏克莱研究小组的主要研究目的是效能与成本。
另外,研究小组也设计出容错(fault-tolerance),逻辑数据备份(logical data redundancy),而产生了 RAID 理论。研究初期,便宜(Inexpensive)的磁盘也是主要的重点,但后来发现,大量便宜磁盘组合并不能适用于现实的生产环境,后来 Inexpensive被改为 Independent,许多独立的磁盘组。

功能

RAID技术主要有以下三个基本功能:

  1. 通过对磁盘上的数据进行条带化,实现对数据成块存取,减少磁盘的机械寻道时间,提高了数据存取速度。
  2. 通过对一个阵列中的几块磁盘同时读取,减少了磁盘的机械寻道时间,提高数据存取速度。
  3. 通过镜像或者存储奇偶校验信息的方式,实现了对数据的冗余保护。

分类

磁盘阵列其样式有三种,一是外接式磁盘阵列柜、二是内接式磁盘阵列卡,三是利用软件来仿真。
外接式磁盘阵列柜最常被使用大型服务器上,具可热交换(Hot Swap)的特性,不过这类产品的价格都很贵。
内接式磁盘阵列卡,因为价格便宜,但需要较高的安装技术,适合技术人员使用操作。硬件阵列能够提供在线扩容、动态修改阵列级别、自动数据恢复、驱动器漫游、超高速缓冲等功能。它能提供性能、数据保护、可靠性、可用性和可管理性的解决方案。阵列卡专用的处理单元来进行操作。
利用软件仿真的方式,是指通过网络操作系统自身提供的磁盘管理功能将连接的普通 SCSI 卡上的多块硬盘配置成逻辑盘,组成阵列。软件阵列可以提供数据冗余功能,但是磁盘子系统的性能会有所降低,有的降低幅度还比较大,达 30% 左右。因此会拖累机器的速度,不适合大数据流量的服务器。

RAID的级别

RAID-0

RAID-0 是最早出现的 RAID 模式,即 Data Stripping 数据分条技术。RAID-0 是组建磁盘阵列中最简单的一种形式,只需要 2 块以上的硬盘即可,成本低,可以提高整个磁盘的性能和吞吐量。RAID-0 没有提供冗余或错误修复能力,但实现成本是最低的。
RAID-0 最简单的实现方式就是把 N 块同样的硬盘用硬件的形式通过智能磁盘控制器或用操作系统中的磁盘驱动程序以软件的方式串联在一起创建一个大的卷集。在使用中电脑数据依次写入到各块硬盘中,它的最大优点就是可以整倍的提高硬盘的容量。如使用了三块 80GB 的硬盘组建成 RAID-0 模式,那么磁盘容量就会是 240GB。其速度方面,各单独一块硬盘的速度完全相同。最大的缺点在于任何一块硬盘出现故障,整个系统将会受到破坏,可靠性仅为单独一块硬盘的 1/N。

image.png

如图,将要存储的数据切割为四块,分别存储在 A、B 两块磁盘中。
虽然RAID 0可以提供更多的空间和更好的性能,但是整个系统是非常不可靠的,如果出现故障,无法进行任何补救。所以,RAID 0一般只是在那些对数据安全性要求不高的情况下才被人们使用。 

小结

  • 读写性能提升;
  • 可用空间为 N*min(S1,S2);
  • 无容错能力;
  • 最少磁盘数为 2;

RAID-1

RAID-1 称为磁盘镜像,原理是把一个磁盘的数据镜像到另一个磁盘上,也就是说数据在写入一块磁盘的同时,会在另一块闲置的磁盘上生成镜像文件,在不影响性能情况下最大限度的保证系统的可靠性和可修复性上,只要系统中任何一对镜像盘中至少有一块磁盘可以使用,甚至可以在一半数量的硬盘出现问题时系统都可以正常运行,当一块硬盘失效时,系统会忽略该硬盘,转而使用剩余的镜像盘读写数据,具备很好的磁盘冗余能力。虽然这样对数据来讲绝对安全,但是成本也会明显增加,磁盘利用率为 50%,以四块80GB 容量的硬盘来讲,可利用的磁盘空间仅为 160 GB。另外,出现硬盘故障的 RAID 系统不再可靠,应当及时的更换损坏的硬盘,否则剩余的镜像盘也出现问题,那么整个系统就会崩溃。更换新盘后原有数据会需要很长时间同步镜像,外界对数据的访问不会受到影响,只是这时整个系统的性能有所下降。因此,RAID-1 多用在保存关键性的重要数据的场合。

image.png

如图,将要存储的数据相同的冗余存储在另一块磁盘中。
RAID-1 主要是通过二次读写实现磁盘镜像,所以磁盘控制器的负载也相当大,尤其是在需要频繁写入数据的环境中。为了避免出现性能瓶颈,使用多个磁盘控制器就显得很有必要。

小结

  • 读性能提升,写性能略下降;
  • 可用空间为 1*min(S1,S2);
  • 由冗余(容错)能力;
  • 最少磁盘数为 2;

RAID-2、RAID-3、RAID-4

RAID-2、RAID-3、RAID-4 这三种很类似,都是使用带校验码的磁盘结构(有差别,这里不深入)。
该种方式的一个特点是会额外使用一个磁盘来存储数据的校验码,通过数据的校验码可以根据一个磁盘的磁盘来计算出另一块磁盘的数据。

image.png

如图,存储数据时将数据拆分存储在了 S1 和 S2 磁盘中,另外使用 S3 磁盘保存了两块磁盘数据的校验码,即便 S2 磁盘挂掉,此时依旧可以通过 S3 和 S1 来计算出 S2 磁盘的内容。
该种方式有一个严重的缺陷就是使用了一个单独的盘作为校验磁盘,不管访问 S1 还是 S2 盘中内容都不可避免的要访问 S3,导致 S3 的访问频率极高,压力极大,容易出现性能瓶颈。

小结

  • 优点:当单块数据盘挂掉时可通过校验盘计算恢复数据;
  • 缺点:校验盘压力大,容易出现性能瓶颈;

RAID-5

RAID-5 和 RAID-4 相似,也是使用了校验码的机制。但它的校验码并不是存储在固定的、单个的磁盘上,而是让 RAID 环境下的所有磁盘轮流存放校验码。

小结

  • 相对 RAID-4 来说读写性能提升;
  • 可用空间为 (N-1)*min(S1,S2,S3);
  • 有容错能力(1 块磁盘);
  • 最少磁盘数为 3;

RAID-6

RAID-6 和 RAID-5 也相似,只是 RAID-6 使用了两块盘做校验盘,使用这两块校验盘做循环校验。

小结

  • 读写性能提升;
  • 可用空间为 (N-2)*min(S1,S2,S3,S4);
  • 有容错能力(1 块校验盘和 1 块数据盘);
  • 最少磁盘数 4;

RAID-10

RAID-10 也叫高可靠性与高效磁盘结构。这种结构是一个带区结构(RAID-0)加一个镜像结构(RAID-1),因为两种结构各有优缺点,因此可以相互补充,达到既高效又高速的目的。大家可以结合两种结构的优点和缺点来理解这种新结构。

image.png

如图,在 RAID-0 的基础上给每一个磁盘做镜像磁盘,即给 S1 增加了镜像磁盘 S3,给 S2 增加了镜像磁盘 S4。

RAID 常用的级别有 RAID-0、RAID-1、RAID-5、RAID-10、RAID-50。
如果想要更加详细的了解,可参考这篇博客,【RAID技术超详细讲解】

CentOS上软RAID的实现

软 RAID 指的是通过软件形式实现的 RAID,在 CentOS 的内核中有一个能将多个磁盘组合成一个磁盘的模块 md(multi devices),CentOS 也提供了与该模块通信的命令,它就是 mdadm
mdadm 是一个模式化的工具,使用格式如下:

mdadm [mode] <raiddevice> [options] <component-devices>
    mode:模式;
    raiddevice:要创建的 RAID 设备,命令通常以 /dev/md 开头;
    options:选项
    component-devices:组织 RAID 设备所需的成员设备,可以是任意块设备;

mdadm 该工具支持很多 RAID 级别,如下:

  • LINEAR 线性方式,类似 JBOD;
  • RAID-0;
  • RAID-1;
  • RAID-4;
  • RAID-5;
  • RAID-6;
  • RAID-10;

常用模式:

  • -C:创建模式;
  • -A:装配模式(扫描设备信息自动合并为 RAID 使用);
  • -F:监控模式;

默认不指定模式则为管理模式。

创建模式有如下选项可用:

  • -n #:使用 # 个设备来创建此 RAID;
  • -l #:指明要创建的 RAID 级别;
  • -a {yes|no}:是否自动创建目标 RAID 设备的设备文件;
  • -c CHUNK_SIZE:指明块大小;
  • -x #:指名空闲盘的个数(支持冗余的 RAID 级别);

管理模式有如下选项可用:

  • -f:标记指定磁盘为损坏状态;
  • -a:添加磁盘到 RAID 中;
  • -r:从 RAID 中移除磁盘;
  • -S:停止设备;

例:使用 4 个分区创建一个容量为 4G 的 RAID5 设备。
1、先使用 fdisk 创建 4 个大小为 2G 的分区,我这里创建的分别是 /dev/sda3/dev/sda5/dev/sda6/dev/sda7
2、将每个分区设置为 Linux raid 自动 类型,对应编号为 fd(使用 fdisk 命令的子命令 t):

image.png

3、准备创建 RAID,创建前可以通过 /proc/mdstat 查看 RAID 设备的状态,我这里没有 RAID 设备,所以现在该文件为空,如下:

[root@localhost ~]# cat /proc/mdstat 
Personalities : 
unused devices: <none>

4、使用 mdadm 开始创建 RAID,如下:

[root@localhost ~]# mdadm -C /dev/md0 -a yes -n 3 -x 1 -l 5 /dev/sda{3,5,6,7}
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

该命令使用 -C 指定创建模式,-a 指定自动创建设备文件,-n 指定数据设备个数,-x 指定空闲设备个数,-l 指定 RAID 级别,创建 RAID 设备 /dev/md0

5、再次查看 /proc/mdstat

[root@localhost ~]# cat /proc/mdstat 
Personalities : [raid6] [raid5] [raid4] 
md0 : active raid5 sda6[4] sda7[3](S) sda5[1] sda3[0]
      4188160 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
      
unused devices: <none>

可以看到 RAID 设备已成功创建。

6、开始格式化 RAID 设备:

[root@localhost ~]# mke2fs -t ext4 /dev/md0 
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
262144 inodes, 1047040 blocks
52352 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=1073741824
32 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: 完成                            
正在写入inode表: 完成                            
Creating journal (16384 blocks): 完成
Writing superblocks and filesystem accounting information: 完成 

7、接下来就可以挂载该 RAID 设备,并可以查看当前文件系统的信息:

[root@localhost ~]# mount /dev/md0 /mydata/
[root@localhost ~]# df -lh
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   17G  1.3G   16G    8% /
devtmpfs                 475M     0  475M    0% /dev
tmpfs                    487M     0  487M    0% /dev/shm
tmpfs                    487M  7.6M  479M    2% /run
tmpfs                    487M     0  487M    0% /sys/fs/cgroup
/dev/sda1               1014M  133M  882M   14% /boot
tmpfs                     98M     0   98M    0% /run/user/0
/dev/md0                 3.9G   16M  3.7G    1% /mydata

看到该设备大小只有 3.9G,不要惊讶,这是因为一个磁盘用来做校验盘了,还有一个磁盘做冗余空闲盘了。

8、可以使用 mdadm -D 来查看该 RAID 设备的详细信息:

image.png

可以看到,该设备由 /dev/sda{3,5,6} 这几个设备组成,并且这几个设备处于激活状态,而 /dev/sda7 是冗余设备,处于空闲状态。Array Size 表示设备总容量,Use Dev Size 表示用来做校验盘的大小。

9、下面继续测试一下 RAID5 的恢复功能,可使用 -f 选项将 RAID 设备的指定子设备标记为损坏状态,如下:

[root@localhost ~]# mdadm /dev/md0 -f /dev/sda3
mdadm: set /dev/sda3 faulty in /dev/md0

10、再次使用 -D 选项查看 RAID 设备的详细信息:

image.png

/dev/sda3 设备已被识别为损坏状态,而原来的空闲设备 /dev/sda7 顶上去了。

补充

JBOD

JBOD 也是能组合多个磁盘使用,它能够将多块磁盘的空间合并成一个大的连续空间使用,并且可用空间为多个磁盘的容量之和。
虽然 JBOD 也让多个磁盘看来似乎只有一个,但它是通过把多个驱动器合并成一个大的逻辑磁盘来做到这一点的。JBOD 使用独立的磁盘并没有带来任何好处,也不能提供任何 RAID 所能带来的容错或是更好的性能等好处。

watch命令

watch 命令可以指定间隔时间不断的执行某个命令,使用格式如下:

watch -n# 'COMMAND'
    #:使用 -n 选项指定的刷新间隔,单位为秒;
    COMMAND:要执行的命令;

比如,要每秒执行一次 ifconfig 命令,如下:

watch -n1 'ifconfig'
0

评论区