Linux 之 RAID 磁盘阵列

本文深入介绍了RAID技术,包括常见的RAID级别如RAID0、RAID1、RAID5等的特点与优缺点,并提供了在Linux环境下搭建RAID5的具体步骤。


参考链接:这篇讲解很不错,推荐看一看

一、RAID 磁盘阵列

1.1 RAID 磁盘阵列介绍

 RAID 是 Redundant Array of Independent Disks 的缩写, 简称 独立冗余磁盘阵列。主要就是将磁盘资源集中进行管理,详细介绍如下:

  • 是把多块独立的物理硬盘 按照不同的方式组合起来 形成一个硬盘组(逻辑上还是一块硬盘),从而 提供比单个硬盘更高的存储性能 还能 提供数据备份技术
  • 组成磁盘阵列的不同方式称为 RAID级别(RAID Levels)
  • 常用的RAID级别RAID 0,RAID 1,RAID 5,RAID 6,RAID 1+0、0+1 等。

1.2 常用的RAID级别

1.2.1 RAID 0(条带化存储)

介绍:

RAID 0 是将 N块硬盘并行组合成一个新的逻辑盘;连续以 位 或 字节 为单位分割数据,并行 读/写 于多个磁盘上,因此具有很高的数据传输率,但它没有数据冗余(备份)功能;

RAID 0 只是单纯地提高性能,并没有为数据的可靠性提供保证,而且其中的一个磁盘失效将影响到所有数据;所以,RAID 0 不能应用于数据安全性要求高的场合;

优点:

  • 因为是把连续的数据分散(striping)到多个磁盘上存取,所以 拥有所有 RAID级别中最高的 读写效率
  • 系统有数据请求就可以被多个磁盘并行的执行,每个磁盘执行属于它自己的那部分数据请求,所以传输速率很快;
  • 利用率是100%;

缺点

  • 没有备份功能,可靠性差,当一个硬盘的数据丢失时,会影响所有的数据。

在这里插入图片描述
在这里插入图片描述

1.2.2 RAID 1 (镜像存储)

介绍:

  • 通过磁盘数据镜像实现数据冗余,在成对的独立磁盘上产生互为备份的数据,所以需要偶数个磁盘。(在一块硬盘上写,在另一块硬盘上备份)。
  • 当原始数据繁忙时,可直接从镜像拷贝中读取数据,因此 RAID 1 提高了读的性能;
  • RAID 1 是磁盘阵列中单位 成本最高的,但提供了很高的 数据安全性和可用性。当一个磁盘失效时,系统可以自动切换到镜像磁盘上读写,而不需要重组失效的数据。

在这里插入图片描述

1.2.3 RAID 5 磁盘列阵

介绍:

  • 由 N 块盘组成的磁盘阵列(N>=3),一份数据产生 N-1 个条带,同时还有1份校验数据,共N份数据在N块盘上循环均衡存储;
  • 需写一份校验数据,浪费一块硬盘
  • N 块盘可以同时读写,读性能很高;但由于 有校验机制的问题,写性能相对不高。
  • 磁盘利用率:( N-1) / N
  • 将校验数据分摊给所有硬盘,可靠性高,允许坏1块盘,不影响所有数据。

在这里插入图片描述
在这里插入图片描述

优点

  • 存储性能、数据安全 和 存储成本兼顾的存储解决方案。RAID 5 对比 RAID 1 的备份方式,RAID 5 备份的不是数据本身,而是把数据和相对应的校验数据分别存储到组成 RAID 5 的各个磁盘上,所以 当 RAID 5 的一个磁盘数据发生损坏后,可以利用剩下的数据和相对应的校验数据去恢复被损坏的数据,可靠性高

缺点

  • 因为校验机制问题,导致写的性能相对不高

1.2.4 RAID 6 磁盘列阵

介绍:

  • 由 N 块盘组成的磁盘阵列(N>=4)
  • 磁盘利用率: (N-2) / N
  • 与 RAID 5 相比,RAID 6 增加了 第二个独立的奇偶校验信息块
  • 两个独立的奇偶系统使用不同的算法,即使两块磁盘同时失效也不会影响数据的使用
  • 相对于 RAID 5 有更大的 “写损失”,因此写性能较差。
  • 需写两份校验数据,浪费两块硬盘

在这里插入图片描述

1.2.5 RAID 1+0(先做镜像,再做条带)

介绍:

  • 由 N 块盘组成的磁盘阵列(偶数,N>=4),N 块盘两两镜像后,再组合成一个 RAID 0
  • 磁盘利用率:N/2
  • N/2 块盘同时写入,N块盘同时读取,性能高,可靠性高
    在这里插入图片描述

优点:RAID 1+0是存储性能和数据安全兼顾的方案。它在提供与 RAID 1一样的数据安全保障的同时,也提供了与RAID 0近似的存储性能。

缺点:由于 RAID 1+0 也通过数据的100%备份提供数据安全保障,因此 RAID 0+1的磁盘空间利用率与RAID1相同,存储成本高。

1.2.6 RAID 0+1(先做条带,再做镜像,不常用)

  • 读写性能与 RAID 1+0 相同
  • 安全性低于 RAID 1+0,所以一般不用该方式
    在这里插入图片描述

1.3 各个RAID级别的对比

RAID 0 : 安全性能高,没有冗余能力,可靠性能差;

RAID 1 : 磁盘数量大于等于2(偶数),读性能高,写的性能一般,安全系数高,允许一块硬盘坏掉;

RAID 5 : 磁盘数量大于等于3,要写入一块硬盘用于冗余校验数据,读性能较快,写性能较慢;

RAID 6 : 磁盘数量大于等于4,要写入两块硬盘用于冗余校验数据,写性能比5差;

RAID 10 : 先创1,再创0,磁盘数量大于等于4(偶数),每个1中可以各毁坏一个;

RAID级别硬盘数量磁盘利用率是否有校验保护能力读写性能
RAID 0N100%单个硬盘的N倍(最好)
RAID 1N(偶数)50%允许一个设备故障读和单个硬盘无分别,写则需写两对存储设备
RAID 5N >=3(N-1) / N允许一个设备故障读和RAID 0近似,写<单个硬盘
RAID 6N >=4(N-2) / N允许两个设备故障读写都近似与 RAID 5,写入<RAID 5
RAID 10N >=4(偶数)50%允许两个基组中各坏一个读=RAID 0,写=RAID 1

二、操作练习

2.1 步骤

 以 RAID 5 为例,创建软RAID磁盘阵列步骤:

 使用到 mdadm 命令。


1、检查是否已安装mdadm软件包
rpm -q mdadm
如未安装执行 yum install -y mdadm 进行安装

2、使用fdisk工具将新磁盘设备/dev/sdb、/dev/sdc、 /dev/sdd、 /dev/sde
划分出主分区sdb1、sdc1、 sdd1、 sde1, 并且把分区类型的ID 标记号改为“fd”

fdisk /dev/sdb
fdisk /dev/sdc

n  p  回车  回车  t  fd  w

3、创建RAID设备

#创建RAID5,md0 为磁盘阵列的名字
mdadm -C -v /dev/md0 [-a yes] -l5 -n3 /dev/sd[bcd]1 -x1 /dev/sde1

-C:                      表示新建
-v:                      显示创建过程中的详细信息
/dev/md0:                创建RAID5 的名称
-a yes:                  --auto, 表示如果有什么设备文件没有存在的话就自动创建,可省略。
-l:                      指定RAID的级别,l5表示创建RAID5,l10代表RAID10
-n:                      指定使用几块硬盘创建RAID, n3表示使用3块硬盘创建RAID
-n3 /dev/sd[bcd]1:       指定使用这3块磁盘分区去创建RAID
-x:                      指定使用几块硬盘做RAID的热备用盘,x1表示保留1块空闲的硬盘作备用(热备份,支持热插拔的)
/dev/sde1:               指定用作于备用的磁盘

#查看创建RAID磁盘进度详细信息
cat /proc/mdstat        查看创建RAID的进度(实时的查看一次,不能自动刷新)   
或者        
mdadm -D /dev/md0  
    
#用watch命令来每隔一段时间定时刷新/proc/mdstat 的输出
watch -n 5 'cat /proc/mdstat'  #每隔5秒执行一次 cat /proc/mdstat 命令,用户定时刷新并输出命令结果

#查看磁盘是否已做 RAID
mdadm -E /dev/sd[b-e]1

4、创建并挂载文件系统
#临时挂载
mkfs -t xfs /dev/md0
mkdir /myraid
mount /dev/md0 /myraid
df -Th

#自动挂载
cp /etc/fstab /etc/fstab.bak
vim /etc/fstab
/dev/md0     /myraid    xfs     defaults    0    0

5、实现故障恢复
mdadm /dev/md0 -f /dev/sdb1         模拟/dev/sdb1故障
mdadm -D /dev/md0                   查看发现sde1已顶替sdb1
 
6、创建/etc/mdadm.conf 配置文件,方便管理软RAID的配置,比如启动、停止
echo 'DEVICE /dev/sdc1 /dev/sdb1 /dev/sdd1 /dev/sde1' > /etc/mdadm.conf
mdadm --detail --scan >> /etc/mdadm.conf

 mdadm 命令其它常用选项:

-f:指定设备故障
-r:移除设备
-a:添加设备
-S:停止RAID
-A:启动RAID

mdadm /dev/md0 -f /dev/sdb1
mdadm /dev/md0 -r /dev/sdbl
mdadm /dev/md0 -a /dev/sde1

#不添加配置文件的停止后启动不了
echo 'DEVICE /dev/sdc1 /dev/sdb1 /dev/sdd1' > /etc/mdadm.conf
mdadm --detail --scan >> /etc/mdadm.conf

umount /dev/md0
mdadm -S /dev/md0
mdadm -As /dev/md0
#-s: 指查找/etc/mdadm.conf 文件中的配置信息

2.2 Linux 中创建软 RAID 5 实操

操作前准备:

 先添加四块硬盘,每个硬盘5G,前三个做 RAID 5,一个用来做备份。执行 fdsik -l 查看硬盘已经添加进来了,分别是 /dev/sdb、 /dev/sdc、 /dev/sdd、 /dev/sde。
在这里插入图片描述
在这里插入图片描述
 执行 rpm -q mdadm 发现也已经安装了。

2.2.1 步骤一:进行磁盘分区,设置分区类型为 fd

 执行四次命令进行分区,fdisk /dev/sd[b-e], n → p → 回车 → 回车 → t → fd → w 。fd 表示分区类型为 fd Linux raid 自动检测。
在这里插入图片描述

2.2.2 步骤二:创建、查看 RAID设备

 执行命令 mdadm -Cv /dev/md0 -l5 -n3 /dev/sd[b-d]1 -x1 /dev/sde1 创建 RAID 5,/dev/sdb1、/dev/sdc1、/dev/sdd1 做主设备,/dev/sde1 做备用。
在这里插入图片描述
在这里插入图片描述
 或者用命令 mdadm -D /dev/md0,查看:
在这里插入图片描述
 或者用检查磁盘是否已做RAID:mdadm -E /dev/sdb1。

2.2.3 步骤三:创建并挂载文件系统

 可以用 mount 临时挂载,和在 /etc/fstab 中永久挂载,为了方便我使用mount 临时挂载。
在这里插入图片描述
 因为我用了 -n3 使用了三块磁盘共15G 去创建 RAID 5,磁盘利用率是 (N-1) / N 即 2/3 * 15 = 10G,所以挂载后的容量为 10G。

步骤四:模拟故障,实现故障恢复

执行命令: mdadm /dev/md0 -f /dev/sdc1 使用 RAID 5 方式创建的 /dev/md0 磁盘阵列中的 /dev/sdc1 磁盘故障,再执行命令 mdadm -D /dev/md0 查看阵列信息,发现 sde1 已顶替 sdc1。
在这里插入图片描述
 faulty 有错误的
在这里插入图片描述
在这里插入图片描述

步骤五:创建 /etc/mdadm.conf 配置文件

 创建 /etc/mdadm.conf 配置文件,为了方便的管理软RAID的配置,比如启动、停止。如果不创建该配置文件,执行完 -S 停止后,-A 执行会失败。

echo 标准输出
> 重定向输出,有就覆盖,没有就新建文件
>> 重定向追加 有就追加,没有就新建文件

echo 'DEVICE /dev/sdc1 /dev/sdb1 /dev/sdd1 /dev/sde1' > /etc/mdadm.conf
#如果文件存在,则覆盖原文件中的内容;如果不存在,则创建文件,将内容输入进去

mdadm --detail --scan >> /etc/mdadm.conf
#如果文件存在,则在文件最后行追加内容;如果不存在,则创建文件,将内容输入进去

在这里插入图片描述
添加、移除 磁盘设备;停止、启动 RAID 设备

-r 移除RAID中的磁盘设备、 -a 添加磁盘设备。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
-S 停止RAID、 -A 启动RAID

 注意:停止前 RAID 要先进行解挂载,因为磁盘在使用过程中无法被停止。

umount /dev/md0
mdadm -S /dev/md0

mdadm -As /dev/md0
#-s: 指查找/etc/mdadm.conf 文件中的配置信息
#前提是解挂的设备名 已经写入到  /etc/mdadm.conf 配置文件中了。

在这里插入图片描述

2.3 附加题 1+0

 如果要做 RAID 1+0,先做镜像(1)再做条带(0)。即先做两个 RAID 1(共四个硬盘)出来,再做一个 RAID 0 。

#创建RAID10(先做镜象,再做条带)
mdadm -Cv /dev/md0 -l1 -n2 /dev/sd[bc]1
mdadm -Cv /dev/md1 -l1 -n2 /dev/sd[de]1

mdadm -Cv /dev/md10 -l0 -n2 /dev/md0 /dev/md1

三、阵列卡

阵列卡

  • 阵列卡是用来实现RAID功能的板卡
  • 通常是由I/O处理器、硬盘控制器、硬盘连接器和缓存等一系列组件构成的
  • 不同的RAID卡支持的RAID功能不同
  • RAID卡的接口类型:IDE接口、SCSI接口、SATA接口和SAS接口

阵列卡的缓存

  • 缓存 (Cache) 是RAID卡与外部总线交换数据的场所,RAID卡先将数据传送到缓存,再由缓存和外边数据总线交换数据;
  • 缓存的大小与速度是直接关系到RAID卡的实际传输速度的重要因素;
  • 不同的RAID卡出厂时配备的内存容量不同,一般为几兆到数百兆容量不等。
在C语言里,位左对齐右对齐一般在格式化输出时会用到,主要用于控制数据在输出时的位置。以下是相关介绍: ### 整型数据的左对齐右对齐 通过`printf`函数实现整型数据的左对齐右对齐右对齐是默认方式,在格式说明符`%`和`d`之间添加数字来规定输出宽度,若数字位数小于规定宽度,会在左边补空格;左对齐则需在数字前加`-`号,若数字位数小于规定宽度,会在右边补空格。 示例代码如下: ```c #include <stdio.h> int main() { // 右对齐。数字宽度为10,若不足10,在左边补足空格 printf("%10d\n", 1234); // 左对齐。数字宽度为10,若不足10,在右边补足空格 printf("%-10d\n", 1234); return 0; } ``` ### 不同输出长度的情况 当规定的输出宽度和数字实际位数不同时,有不同的处理方式。若规定宽度小于数字实际位数,会完整输出数字;若规定宽度大于数字实际位数,右对齐在左边补空格,左对齐在右边补空格。 示例代码如下: ```c #include <stdio.h> int main() { // -5是左对齐,输出长度为5。5是右对齐,输出长度为5 printf("%-5d %5d\n", 455, 455); printf("%-5d %5d\n", -123, -123); // 规定宽度小于实际位数,完整输出数字 printf("%-5d %5d\n", 987654, 987654); return 0; } ``` ### 其他数据类型的对齐 除整型外,其他数据类型也能实现左对齐右对齐。例如浮点数(`%f`)、字符串(`%s`)等,方法和整型一致。 示例代码如下: ```c #include <stdio.h> int main() { // 右对齐浮点数,宽度为10 printf("%10f\n", 3.14); // 左对齐浮点数,宽度为10 printf("%-10f\n", 3.14); // 右对齐字符串,宽度为10 printf("%10s\n", "hello"); // 左对齐字符串,宽度为10 printf("%-10s\n", "hello"); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值