Linux磁盘阵列
一、磁盘列阵(RAID)
1.1 RAID磁盘阵列介绍
把多块独立的物理硬盘按不同的方式组成一个逻辑硬盘,从而提供比单个硬盘更高的存储性能和提供数据备份技术
常用的RAID级别:
- RAID0、RAID1、RAID5、RAID6、RAID1+0 等
1.2 RAID级别详细说明
1.2.1 RAID 0(条带化存储)
特点:
- 读写性能最强
- 没有数据备份功能
- 需要n(n≥1)个硬盘
- 磁盘利用率为n(100%)
- 任意一块硬盘损坏,数据就全部异常
1.2.2 RAID 1(镜像存储)
特点:
-
互为备份
-
写性能差一些,读性能一般
-
高可用,坏了其中一块硬盘不影响数据
-
需要偶数个硬盘
-
磁盘利用率为n/2(50%)
1.2.3 RAID 5
特点:
- 读性能强,写性能一般
- 允许一块硬盘损坏,不影响数据
- 拥有数据校验机制(这是写性能慢的原因)
- 需要n(n≥3)个硬盘
- 在成本控制的前提下,追求最大容量,速度及高可用性
- 磁盘利用率(n-1)/n
1.2.4 RAID 6
特点:
- 需要n(n≥4)个硬盘
- 增加了奇偶校验
- 读性能与RAID5相当,写性能比RAID5差
- 允许损坏两块硬盘,不影响数据
- 磁盘利用率(n-2)/n
1.2.5 RAID 1+0(先做镜像,再做条带)
特点:
- 硬盘数n为偶数,且n≥4
- 读性能很高,写性能稍差
- 理论上可以损坏三块硬盘,但再实际业务中允许两个基组中各坏一个,数据不会收到影响
- 磁盘利用率n/2(50%)
1.2.6 RAID 0+1(先做条带,再做镜像)
特点:
- 硬盘数n为偶数,且n≥4
- 读写性能与RAID 1+0相同;
- 数据可靠性比RAID 1+0要更差。 实际使用较少。
1.3 RAID级别比较
RAID级别 | 磁盘数量 | 磁盘利用率 | 读性能 | 写性能 | 高可用性 | 特点 |
---|---|---|---|---|---|---|
RAID 0 | n | n(100%) | 高 | 高 | 无 | 追求最大容量和读写速度,损坏一块,数据全部异常 |
RAID 1 | n(偶数) | n/2(50%) | 低 | 低 | 中等 | 追求安全,损坏一块不影响使用,数据也不受影响 |
RAID 5 | n≥3 | (n-1)/n | 高 | 低 | 高 | 成本控制的前提下,追求最大容量,速度及高可用性,可以损坏一块 |
RAID 6 | n≥4 | (n-2)/n | 高 | 低 | 很高 | 比RAID5的数据安全更高,但写速度比较低,可以损坏两块硬盘 |
RAID 10 | n≥4(偶数) | n/2(50%) | 高 | 中等 | 中等 | 综合RAID 0和RAID 1的有点,既有速度也有高可用,每个基组允许损坏一个,数据不受影响 |
二、磁盘阵列配置实验(RAID 5)
2.1 配置RAID 5
2.1.1 检测软件是否安装
[root@localhost ~]# rpm -q mdadm
mdadm-4.0-5.el7.x86_64 //已有,无需安装软件
2.1.2 创建分区
[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0x140ee0a2 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
分区号 (1-4,默认 1):
起始 扇区 (2048-62914559,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-62914559,默认为 62914559):+10G
分区 1 已设置为 Linux 类型,大小设为 10 GiB
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@localhost ~]# fdisk /dev/sdc
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0xebf36733 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+10G
分区 1 已设置为 Linux 类型,大小设为 10 GiB
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@localhost ~]# fdisk /dev/sdd
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0x323399f5 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+10G
分区 1 已设置为 Linux 类型,大小设为 10 GiB
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@localhost ~]# fdisk /dev/sde
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0xe13e3a01 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+10G
分区 1 已设置为 Linux 类型,大小设为 10 GiB
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 953M 0 part /boot
└─sda2 8:2 0 51.2G 0 part
├─centos-root 253:0 0 46.6G 0 lvm /
└─centos-swap 253:1 0 4.7G 0 lvm [SWAP]
sdb 8:16 0 30G 0 disk
└─sdb1 8:17 0 10G 0 part
sdc 8:32 0 20G 0 disk
└─sdc1 8:33 0 10G 0 part
sdd 8:48 0 20G 0 disk
└─sdd1 8:49 0 10G 0 part
sde 8:64 0 20G 0 disk
└─sde1 8:65 0 10G 0 part
sdf 8:80 0 20G 0 disk
sr0 11:0 1 1024M 0 rom
2.1.3 创建RAID磁盘
-C:创建
-v:列出详细信息
-l:指定raid级别
-n:指定用几块硬盘做raid
-x:指定几块硬盘作为热备份
[root@localhost ~]# mdadm -C -v /dev/md5 -l5 -n3 /dev/sd[b-d]1 -x1 /dev/sde1
mdadm: layout defaults to left-symmetric
mdadm: layout defaults to left-symmetric
mdadm: chunk size defaults to 512K
mdadm: size set to 10477568K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md5 started.
[root@localhost ~]# mdadm -D /dev/md5 //查看详细信息
/dev/md5:
Version : 1.2
Creation Time : Tue May 9 19:53:05 2023
Raid Level : raid5
Array Size : 20955136 (19.98 GiB 21.46 GB)
Used Dev Size : 10477568 (9.99 GiB 10.73 GB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Tue May 9 19:53:57 2023
State : clean
Active Devices : 3 //由此可知创建成功
Working Devices : 4
Failed Devices : 0
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : resync
Name : localhost.localdomain:5 (local to host localhost.localdomain)
UUID : 36391dbd:dd031c90:7c0be78f:ed388e64
Events : 18
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 33 1 active sync /dev/sdc1
4 8 49 2 active sync /dev/sdd1
3 8 65 - spare /dev/sde1
2.1.4 格式化
[root@localhost ~]# mkfs.xfs /dev/md5
meta-data=/dev/md5 isize=512 agcount=16, agsize=327296 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=5236736, imaxpct=25
= sunit=128 swidth=256 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
2.1.5 挂载
[root@localhost /]# mkdir /data //创建data目录
[root@localhost /]# ls //查看data目录是否创建成功
bin boot data dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@localhost /]# mount /dev/md5 /data/ //临时挂载/dev/md5到/data/
[root@localhost /]# lsblk //查看是否挂载成功
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 953M 0 part /boot
└─sda2 8:2 0 51.2G 0 part
├─centos-root 253:0 0 46.6G 0 lvm /
└─centos-swap 253:1 0 4.7G 0 lvm [SWAP]
sdb 8:16 0 30G 0 disk
└─sdb1 8:17 0 10G 0 part
└─md5 9:5 0 20G 0 raid5 /data
sdc 8:32 0 20G 0 disk
└─sdc1 8:33 0 10G 0 part
└─md5 9:5 0 20G 0 raid5 /data
sdd 8:48 0 20G 0 disk
└─sdd1 8:49 0 10G 0 part
└─md5 9:5 0 20G 0 raid5 /data
sde 8:64 0 20G 0 disk
└─sde1 8:65 0 10G 0 part
└─md5 9:5 0 20G 0 raid5 /data
sdf 8:80 0 20G 0 disk
sr0 11:0 1 1024M 0 rom
2.2 模拟故障
root@localhost /]# cd /data
[root@localhost data]# touch aa bb cc
[root@localhost data]# ls
aa bb cc
##表明现在读写是正常的
[root@localhost data]# mdadm /dev/md5 -f /dev/sdb1 //强制下线sdb1
mdadm: set /dev/sdb1 faulty in /dev/md5
[root@localhost data]# mdadm -D /dev/md5 //查看md5的详细信息
/dev/md5:
Version : 1.2
Creation Time : Tue May 9 19:53:05 2023
Raid Level : raid5
Array Size : 20955136 (19.98 GiB 21.46 GB)
Used Dev Size : 10477568 (9.99 GiB 10.73 GB)
Raid Devices : 3
Total Devices : 4
Persistence : Superblock is persistent
Update Time : Tue May 9 23:03:43 2023
State : clean
Active Devices : 3
Working Devices : 3
Failed Devices : 1
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Consistency Policy : resync
Name : localhost.localdomain:5 (local to host localhost.localdomain)
UUID : 36391dbd:dd031c90:7c0be78f:ed388e64
Events : 37
Number Major Minor RaidDevice State
3 8 65 0 active sync /dev/sde1
1 8 33 1 active sync /dev/sdc1
4 8 49 2 active sync /dev/sdd1
0 8 17 - faulty /dev/sdb1
##此时sdb1被下线,由热备盘sde1顶上
[root@localhost data]# ls
aa bb cc
[root@localhost data]# echo 123 > aa
[root@localhost data]# cat aa
123
##下线sdb1后读写功能依然正常,说明热备盘起作用了
[root@localhost data]# mdadm /dev/md5 -f /dev/sdc1
mdadm: set /dev/sdc1 faulty in /dev/md5
[root@localhost data]# mdadm /dev/md5 -f /dev/sdd1
mdadm: set /dev/sdd1 faulty in /dev/md5
[root@localhost data]# ls
ls: 无法打开目录.: 输入/输出错误
[root@localhost data]# cat aa
cat: aa: 输入/输出错误
[root@localhost data]# touch dd
touch: 无法创建"dd": 输入/输出错误
##由于RAID5只允许损坏一个硬盘,上面我下线了两个硬盘,所以此时无法输入输出,模拟故障验证成功
2.3 删除RAID
[root@localhost data]# umount /dev/md5 /data
umount: /data:未挂载
[root@localhost data]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 47G 4.9G 42G 11% /
devtmpfs 969M 0 969M 0% /dev
tmpfs 984M 0 984M 0% /dev/shm
tmpfs 984M 9.2M 975M 1% /run
tmpfs 984M 0 984M 0% /sys/fs/cgroup
/dev/sda1 950M 179M 772M 19% /boot
tmpfs 197M 4.0K 197M 1% /run/user/42
tmpfs 197M 48K 197M 1% /run/user/0
[root@localhost data]# mdadm -S /dev/md5
mdadm: stopped /dev/md5
[root@localhost data]# mdadm --misc --zero-superblock /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
[root@localhost /]# lsblk //查看是否删除成功
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 953M 0 part /boot
└─sda2 8:2 0 51.2G 0 part
├─centos-root 253:0 0 46.6G 0 lvm /
└─centos-swap 253:1 0 4.7G 0 lvm [SWAP]
sdb 8:16 0 30G 0 disk
└─sdb1 8:17 0 10G 0 part
sdc 8:32 0 20G 0 disk
└─sdc1 8:33 0 10G 0 part
sdd 8:48 0 20G 0 disk
└─sdd1 8:49 0 10G 0 part
sde 8:64 0 20G 0 disk
└─sde1 8:65 0 10G 0 part
sdf 8:80 0 20G 0 disk
sr0 11:0 1 1024M 0 rom