前言
- RAID是英文Redundant Array of Independent Disks的缩写,中文简称为独立冗余磁盘阵列。简单的说,RAID是一种把多块独立的硬盘(物理硬盘)按不同的方式组合起来形成一个硬盘组(逻辑硬盘),从而提供比单个硬盘更高的存储性能和提供数据备份技术
- 组成磁盘阵列的不同方式称为RAID级别(RAID Levels)。在用户看起来,组成的磁盘组就像是一个硬盘,用户可以对它进行分区,格式化等等。总之,对磁盘阵列的操作与单个硬盘一模一样。不同的是,磁盘阵列的存储速度要比单个硬盘高很多,而且可以提供自动数据备份。数据备份的功能是在用户数据一旦发生损坏后,利用备份信息可以使损坏数据得以恢复,从而保障了用户数据的安全性
一、服务器及 RAID 磁盘阵列介绍
RAID 将一组硬盘连结起来,组成一个阵列,以避免单个硬盘损坏而带来的数据损失, 同时亦提供了比单个硬盘高的可用性及容错性。常见的组合方式有:RAID0、RAID1、RAID5、 RAID6、RAID01、RAID10
1.1 RAID 0
- RAID0 俗称“条带”,它将两个或多个硬盘组成一个逻辑硬盘,容量是所有硬盘之和
- 因为是多个硬盘组合成一个,故可并行写操作,写入速度提高
- RAID0硬盘数据没有冗余, 没有容错,一旦一个物理硬盘损坏,则所有数据均丢失
- RAID0 适合于对数据量大, 但安全性要求不高的场景,比如音像、视频文件的存储等
1.2 RAID 1
- RAID1 俗称“镜像”,它最少由两个硬盘组成,且两个硬盘上存储的数据均相同,以实现数据冗余
- RAID1 读操作速度有所提高,写操作理论上与单硬盘速度一样
- RAID1由于数据需要同时写入所有硬盘,实际上稍为下降
- 容错性是所有组合方式里最好的,只要有一块硬盘正常,则能保持正常工作
- RAID1对硬盘容量的利用率则是最低,只有 50%,因而成本也是最高
- RAID1 适合对数据安全性要求非常高的场景,比如存储数据库数据文件之类
1.3 RAID 5
- RAID5 最少由三个硬盘组成,它将数据分散存储于阵列中的每个硬盘,并且还伴有一个数据校验位,数据位与校验位通过算法能相互验证,当丢失其中的一位时,RAID 控制器能通过算法,利用其它两位数据将丢失的数据进行计算还原
- RAID5 最多能允许一个硬盘损坏,有容错性
- RAID5 相对于其它的组合方式,在容错与成本方面有一个平衡,因而受到大多数使用者的欢迎
- 一般的磁盘阵列,最常使用的就是 RAID5 这种方式
1.4 RAID 6
- RAID6 是在 RAID5 的基础上改良而成的
- RAID6 再将数据校验位增加一位,所以允许损坏的硬盘数量也由 RAID5 的一个增加到二个
- 由于同一阵列中两个硬盘同时损坏的概率非常少,所以,RAID6 用增加一块硬盘的代价,换来了比 RAID5 更高的数据安全性
1.5 RAID 1+0
- RAID1+0 是先将数据进行镜像操作,然后再对数据进行分组,RAID 1 在这里就是一个冗余的备份阵列,而 RAID 0 则负责数据的读写阵列
- 至少要四块盘,两块做 raid0,另两块做 raid1,RAID 10 对存储容量的利用率和 RAID 1 一样低,只有 50%
- 优点:
- Raid1+0 提供了 200%的速度和单磁盘损坏的数据安全性
- 当同时损坏的磁盘不在同一 Raid1 中,就能保证数据安全性、RAID 10 能提供比 RAID 5 更好的性能
- 缺点:
- 这种新结构的可扩充性不好,使用此方案比较昂贵
- Raid1+0 方案造成了 50%的磁盘浪费
二、阵列卡介绍
2.1 阵列卡介绍
- 阵列卡全称为磁盘阵列卡,是用来实现RAID 功能的板卡
- RAID卡一般分为硬RAID卡和软RAID卡两种
- 通过硬件来实现RAID功能的就是硬RAID,通常是哟I/O处理器,硬盘控制器,硬盘连接器和缓存等一些列组件构成
- 通过软件并使用CPU的RAID卡我们成为软RAID,因为软RAID占用CUP资源比较高,所以绝大部分的服务器设备都使用的硬RAID
- 不同的RAID卡支持的RAID功能不同,例如支持RAID 0,RAID 1,RAID 5,RAID1+0等
- RAID卡的第一个重要功能就是他可以达到单个磁盘驱动器的几倍,几十倍甚至上百倍的速率,这也是RAID最初想要解决的问题
- RAID卡的第二个重要功能就是提供容错能力,现在服务器基本上集成了RAID卡
2.2 RAID卡的接口类型
- RAID卡的接口指的是支持的接口,目前有IDE 接口,SCSI接口,SATA接口和SAS接口
2.2.1 IDE接口
- IDE 的英文全称为“Integrated Drive Electronics”,即“电子集成驱动器”,它的本意是指把“硬盘控制器”与“盘体”集成在一起的硬盘驱动器,属于并行接口
- 把盘体与控制器集成在一起的做法减少了硬盘接口的电缆数目与长度,数据传输的可靠性得到了增强,硬盘制造起来变得更容易
- 价格低廉、兼容性强
- 在实际的应用中,这种类型的接口随着接口技术的不断发展已经很少用了,逐渐被后续发展分支出更多类型的硬盘接口所取代,而其后发展分支出更多类型的硬盘接口,比如 ATA、Ultra ATA、DMA、Ultra DMA 等接口都属于 IDE 硬盘
- 由于 IDE 口属于并行接口,因此为了和 SATA 口硬盘相区别,IDE 口硬盘也叫 PATA 口硬盘
2.2.2 SCSI 接口
- SCSI 的英文全称为“Small Computer System Interface”(小型计算机系统接口),是同 IDE 完全不同的接口,IDE 接口是普通 PC 的标准接口,而 SCSI 并不是专门为硬盘设计的接口,是一种广泛应用于小型机上的高速数据传输技术
- SCSI 接口具有应用范围广、多任务、带宽大、CPU 占用率低,以及支持热插拔等优点,但较高的价格使得它很难如 IDE 硬盘般普及,因此 SCSI 硬盘主要应用于中、高端和高档工作站中
- SCSI 硬盘和普通 IDE 硬盘相比有很多优点:接口速度快,并且由于主要用于服务器,因此硬盘本身的性能也比较高,硬盘转速快,缓存容量大,CPU 占用率低,扩展性远优于 IDE 硬盘,并且支持热插拔
2.2.3 SATA 接口
- SATA是“Serial ATA”的缩写,主要用在主板和大量存储设备之间传输数据。拥有这种接口的硬盘又叫串口硬盘,以采用串行方式传输数据
- SATA总线使用了嵌入式时钟信号,使得其具备更强的纠错能力。如果发现数据传输中的错误会自动进行矫正,很大程度上提高了数据传输的可靠性,也是一种支持热拔热插的接口
2.2.4 SAS 接口
- SAS的英文全称为“Serial Attached SCSI”是新一代的SCSI技术,称为序列式SCSI
- SAS可以看做是SATA与SCSI的结合体,是同时发挥两者的优势产生的,主要用在周边零件的数据传输上
- 和SATA硬盘相同,都是采用串行技术以获得更高的传输速度
- SAS的接口技术可以向下兼容SATA设备
- 串行 SCSI 是点到点的结构,可以建立磁盘到控制器的直接连接。具有以下特点
- 更好的性能
- 点到点的技术减少了地址冲突以及菊花链连结的减速
- 为每个设备提供了专用的信号通路来保证最大的带宽
- 全双工方式下的数据操作保证最有效的数据吞吐量
- 简便的线缆连结
- 更细的电缆搭配更小的连接器;
- 更好的扩展性
- 可以同时连结更多的磁盘设备
- 更好的性能
2.3 阵列卡的缓存
- 缓存(Cache)是 RAID 卡与外部总线交换数据的场所,RAID 卡先将数据传送到缓存, 再由缓存和外边数据总线交换数据
- 它是 RAID 卡电路板上的一块存储芯片,与硬盘盘片相比,具有极快的存取速度,实际上就是相对低速的硬盘盘片与相对高速的外部设备(例如内存)之间的缓冲器
- 缓存的大小与速度是直接关系到 RAID 卡的实际传输速度的重要因素, 大缓存能够大幅度地提高数据命中率从而提高 RAID 卡整体性能
- 多数 RAID 卡都配备了一定数量的内存作为高速缓存使用
- 不同的 RAID 卡出厂时配备的内存容量不同,一般为几兆到数百兆容量不等,这取决于磁盘阵列产品的应用范围
三、构建软RAID 磁盘阵列
- 首先为 linux 服务器添加 4 块 SCSI 硬盘,使用 mdadm 软件包,构建 RAID5 磁盘阵列, 提高磁盘存储的性能和可靠性
3.1 构建磁盘阵列
3.1.1 安装 mdadm 工具
- 在CentOS7.3 系统中mdadm 工具由mdadm-3.4-14.el7.x86_64 软件包提供,执行 rpm -qa | grep mdadm 命令查看系统中是否安装 mdadm 工具。若系统内未安装 mdadm 工具, 可使用 RPM 或 YUM 方式安装
[root@localhost ~]# rpm -qa | grep mdadm
mdadm-3.4-14.el7.x86_64
3.1.2 准备用于 RAID 阵列的分区
- 为 Linux 服务器添加 4 块 SCSI 硬盘。使用 fdisk 工具各划分出一块 2GB 的分区,依次为/dev/sdb1、/dev/sdc1、/dev/sdd1、/dev/sde1,将分区的类型 ID 均更改为 fd。fd 分区类型对应“Linux raid autodetect”,表示支持用于 RAID 磁盘阵列
[root@localhost ~]# fdisk -l //查看已添加的 4 块 SCSI 硬盘
...... // 省略部分内容
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇 区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/sdc:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇 区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/sdd:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇 区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/sde:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇 区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
- 以/dev/sdb 磁盘为例进行创建分区操作演示
[root@localhost ~]# fdisk /dev/sdb
...... // 省略部分内容
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
分区号 (1-4,默认 1):1
起始 扇区 (2048-41943039,默认为 2048): 将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+2G
分区 1 已设置为 Linux 类型,大小设为 2 GiB
命令(输入 m 获取帮助):t
已选择分区 1
Hex 代码(输入 L 列出所有代码):fd
已将分区“Linux”的类型更改为“Linux raid autodetect”
命令(输入 m 获取帮助):p
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇 区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512
字节磁盘标签类型:dos
磁盘标识符:0x16fb789e
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 4196351 2097152 fd Linux raid autodetect
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
- 创建完 4 个分区后,执行 fdisk -l | grep '/dev’查看分区结果
[root@localhost ~]# fdisk -l | grep '/dev'
磁盘 /dev/sdc:21.5 GB, 21474836480 字节,41943040 个扇区
/dev/sdc1 2048 4196351 2097152 fd Linux raid autodetect
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
/dev/sdb1 2048 4196351 2097152 fd Linux raid autodetect
磁盘 /dev/sda:85.9 GB, 85899345920 字节,167772160 个扇区
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 167772159 82836480 8e Linux LVM
磁盘 /dev/sde:21.5 GB, 21474836480 字节,41943040 个扇区
/dev/sde1 2048 4196351 2097152 fd Linux raid autodetect
磁盘 /dev/sdd:21.5 GB, 21474836480 字节,41943040 个扇区
/dev/sdd1 2048 4196351 2097152 fd Linux raid autodetect
...... // 省略部分内容
3.1.3 创建 RAID 设备
- 使用 mdadm 命令创建 RAID,执行以下命令即可创建名称为 md0 的 RAID5
[root@localhost ~]# mdadm -Cv /dev/md0 -a yes -n4 -l5 /dev/sd[bcde]1
mdadm: layout defaults to left-symmetric mdadm: layout defaults to left-symmetric mdadm: chunk size defaults to 512K mdadm: size set to 2095104K
mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started.
常用的命令参数
命令选项 | 解释说明 |
---|---|
-C | 等同于 create,表示新建 |
-v | 显示创建过程中的信息 |
/dev/md0 | 创建 RAID5 的名称 |
-a | –auto,表示通知 mdadm 是否创建设备文件,并分配一个未使用的次设备号, 后面跟 yes 代表如果有什么设备文件没有存在的话就自动创建 |
-n | 指定使用几块硬盘创建 RAID,n4 表示使用 4 块硬盘创建 RAID |
-l | 指定 RAID 的级别,l5 表示创建 RAID5 |
/dev/sd[bcde]1 | 指定四块磁盘分区 |
- 查看 RAID5 创建结果
[root@localhost ~]# ls -l /dev/md0 //查看设备文件brw-rw---- 1 root disk 9, 0 11 月 7 14:27 /dev/md0 [root@localhost ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sde1[4] sdd1[2] sdc1[1] sdb1[0]
6285312 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU] unused devices: <none>
3.1.4 创建并挂载文件系统
[root@localhost ~]# mkfs -t xfs /dev/md0
meta-data=/dev/md0 isize=512 agcount=8, agsize=196480 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=1571328, imaxpct=25
= sunit=128 swidth=384 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@localhost ~]# mkdir /raidme
[root@localhost ~]# mount /dev/md0 /raidme/
[root@localhost ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/cl-root xfs 50G 4.0G 47G 8% / devtmpfs devtmpfs 473M 0 473M 0% /dev
tmpfs tmpfs 489M 144K 489M 1% /dev/shm
tmpfs tmpfs 489M 7.2M 482M 2% /run
tmpfs tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 173M 842M 18% /boot
/dev/mapper/cl-home xfs 27G 33M 27G 1% /home
tmpfs tmpfs 98M 16K 98M 1% /run/user/0
/dev/sr0 iso9660 7.8G 7.8G 0 100% /run/media/root/CentOS 7 x86_64
/dev/md0 xfs 6.0G 33M 6.0G 1% /raidme
[root@localhost ~]# cp /etc/fstab /etc/fstab.bak
[root@localhost ~]# vim /etc/fstab //设置RAID 磁盘开机自动挂载
/dev/md0 /raidme xfs
- RAID5 的特性,用于存放校验数据的部分不显示
3.2 RAID 阵列管理及设备恢复
3.2.1 扫描查看磁盘阵列信息
[root@localhost ~]# mdadm -vDs
ARRAY /dev/md0 level=raid5 num-devices=4 metadata=1.2 name=localhost.localdomain:0
UUID=ecb84a9a:15ddd135:76f4ac44:35318c27
devices=/dev/sdb1,/dev/sdc1,/dev/sdd1,/dev/sde1
[root@localhost ~]# mdadm -vD /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Thu Nov 7 16:33:40 2019
Raid Level : raid5
Array Size : 6285312 (5.99 GiB 6.44 GB)
Used Dev Size : 2095104 (2046.00 MiB 2145.39 MB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Fri Nov 8 14:09:10 2019
State : clean
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Name : localhost.localdomain:0 (local to host localhost.localdomain)
UUID : 349b6221:b8bcaa15:bcdba96e:0bea1bd9
Events : 51
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 33 1 active sync /dev/sdc1
2 8 49 2 active sync /dev/sdd1
4 8 65 3 active sync /dev/sde1
- 参数解释
参数 | 解释 |
---|---|
D | detail 的缩写,打印一个或多个磁盘阵列的详细信息 |
v | 对正在发生的事情显示更详细的信息 |
s | 扫描/proc/mdstat 中的阵列设备列表 |
3.2.2 建立配置文件
- 为了方便日后启动/停止 RAID 阵列,可以创建一个配置文件来进行管理
[root@localhost ~]# mdadm -vDs > /etc/mdadm.conf
[root@localhost ~]# vim /etc/mdadm.conf
DEVICE /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
ARRAY /dev/md0 level=raid5 num-devices=4 metadata=1.2 name=localhost.localdomain:0 UUID=ecb84a9a:15ddd135:76f4ac44:35318c27
devices=/dev/sdb1,/dev/sdc1,/dev/sdd1,/dev/sde1
3.2.3 启动和停止进行测试
[root@localhost ~]# umount /dev/md0
[root@localhost ~]# mdadm -S /dev/md0 //-S 停止
mdadm: stopped /dev/md0
[root@localhost ~]# mdadm -A /dev/md0 //-A 激活
mdadm: /dev/md0 has been started with 4 drives.
3.2.4 实现故障恢复
[root@localhost ~]# mdadm /dev/md0 -f /dev/sde1 //模拟/dev/sde1 故障
mdadm: set /dev/sde1 faulty in /dev/md0
[root@localhost ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdb1[0] sde1[4](F) sdd1[2] sdc1[1]
6285312 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [UUU_]
unused devices: <none>
[root@localhost ~]# mdadm /dev/md0 -r /dev/sde1 //移除损坏设备
mdadm: hot removed /dev/sde1 from /dev/md0
[root@localhost ~]# mdadm /dev/md0 -a /dev/sde1 //添加新磁盘阵列
mdadm: added /dev/sde1
[root@localhost ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sde1[4] sdb1[0] sdd1[2] sdc1[1]
6285312 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [UUU_]
[==>..................] recovery = 12.2% (256956/2095104) finish=0.2min
speed=128478K/sec //数据恢复过程
unused devices: <none>