RAID的原理及实现
一、简介
-
RAID(独立磁盘冗余阵列,Redundant Array of Independent Disks),磁盘阵列技术。
-
现代硬盘的缺陷:IO性能极弱、稳定性极差。
-
硬盘性能的指标有两个:磁盘的吞吐量和IOPS(每秒进行读写(I/O)操作的次数)
-
现代的计算机总线、内存的速度可以达到5G毎秒,甚至更高,但是硬盘
RAID (Redundant Array of Independent Disks)廉价磁盘冗余阵列技术是通过多磁盘并行运行来提高计算机的存储IO性能
RAID分为很多种类,称之为RIAD级别,现代RIAD共有7类,常用的有以下四类
-
RAID 0 读写性能
-
RAID 1 读取性能、冗余性
-
RAID 5 读写性能、冗余性(支持1块硬盘故障)
-
RAID 6 读写性能、冗余性(支持2块硬盘故障)
1.1、RAID 0
使用最少2块硬盘,两块磁盘的大小、型号规格要一样
在读写时,将数据分开读写到多块硬盘的方式来提高读写性能
数据条带化
空间利用率: 所有硬盘空间之和
性能: 所有硬盘速度之和
冗余能力: 无 也就是说没有备份
1.2、RAID 1
用最少2块硬盘,在写数据时,将数据复制写到多块硬盘,在读数据时,以提供冗余性,同时从多块硬盘读取数据,以提高读性能
,对数据的安全要求非常严格,读取速度要求快,写入数据要求不是很高
的系统会用RAID1
空间利用率: 所有磁盘中最小的那块
性能: 读性能为所有磁盘速度之和,写性能会有所减弱
冗余能力: 只要有一块磁盘正常,数裾就正常
1.3、RAID 5
RAID5最少使用3块硬盘即实现了raid1
又实现了raid0
,读写数据的时候会将数据分布式的读写在所有硬盘上,但是在写数据的时候会对数据进行奇偶校验运算
,将校验信息同时保存在硬盘上
空间利用率: 1- (1/n)
性能: 读性能接近RAID0,写性能较RAID0弱一些
冗余能力: 可接受1块硬盘损坏
1.4、RAID1,0
二、RAID的实现
软件RAID
企业在使用 稳定速度快,没有独立硬件和接口,需要占用一定的系统资源
(CPU、硬盘接口速度),并且受操作系统稳定性影响。
在Linux中软件RAID通过mdadm( multiple devices admin )这个程序实现
mdadm支持的RAID级别有: RAIDO、RAID1 RAID4、RAID5、RAID6
mdadm可以基于多块硬盘、分区或逻辑卷
创建软件RAID,
创建好的软件RAID对应/dev/mdn,n为第几个RAID,如第一个创建的RIAD为/dev/mdO,第二个为/dev/mdl
RAID的信息保存在/proc/mdstat
文件中,或通过mdadm命令査看
2.1、RAID 0,1,5的基本应用
2.1.1、创建RAID 0
先保证有至少两块磁盘
[root@postgres ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 200M 0 part /boot
└─sda2 8:2 0 39.8G 0 part
├─rhel-root 253:0 0 36.8G 0 lvm /
└─rhel-swap 253:1 0 3G 0 lvm [SWAP]
sdb 8:16 0 5G 0 disk
sdc 8:32 0 5G 0 disk
sdd 8:48 0 5G 0 disk
sde 8:64 0 5G 0 disk
sr0 11:0 1 4.2G 0 rom
[root@postgres ~]# df -hl
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 13M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/rhel-root 37G 22G 16G 58% /
/dev/sda1 197M 160M 37M 82% /boot
tmpfs 378M 8.0K 378M 1% /run/user/42
tmpfs 378M 0 378M 0% /run/user/0
创建RAID 0 ,然后把配置信息写入文件
[root@postgres ~]# mdadm -C /dev/md0 -a yes -l 0 -n 2 /dev/sdb /dev/sdc
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@postgres ~]# mdadm -D --scan > /etc/mdadm.conf
[root@postgres ~]# cat /etc/mdadm.conf
ARRAY /dev/md0 metadata=1.2 name=postgres:0 UUID=e5725052:eeb29c8a:f39b7781:e06ea8c0
mdadm
命令参数说明:
参数 | 说明 |
---|---|
-C |
创建一个新的 RAID 设备。 |
/dev/md0 |
指定创建的 RAID 设备的名称,表示新的 RAID 设备将命名为 /dev/md0 。 |
-a yes |
自动确认所有提示,无需用户手动干预,直接允许创建 RAID 设备。 |
-l 0 |
指定 RAID 级别。在此为 0 ,表示创建 RAID 0(条带化),提供性能但无冗余。 |
-n 2 |
指定参与 RAID 的磁盘数量。在此为 2 ,表示使用两个磁盘。 |
/dev/sdb |
参与 RAID 设备的第一个物理磁盘。 |
/dev/sdc |
参与 RAID 设备的第二个物理磁盘。 |
格式化磁盘组,挂载磁盘组
## 可以看到raid磁盘组已经生效
[root@postgres ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 200M 0 part /boot
└─sda2 8:2 0 39.8G 0 part
├─rhel-root 253:0 0 36.8G 0 lvm /
└─rhel-swap 253:1 0 3G 0 lvm [SWAP]
sdb 8:16 0 5G 0 disk
└─md0 9:0 0 10G 0 raid0
sdc 8:32 0 5G 0 disk
└─md0 9:0 0 10G 0 raid0
sdd 8:48 0 5G 0 disk
sde 8:64 0 5G 0 disk
sr0 11:0 1 4.2G 0 rom
##格式化磁盘组
[root@postgres ~]# mkfs.ext4 /dev/md0
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=128 blocks, Stripe width=256 blocks
655360 inodes, 2618880 blocks
130944 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2151677952
80 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, 1605632
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
[root@postgres ~]# df -hl
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 13M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/rhel-root 37G 22G 16G 58% /
/dev/sda1 197M 160M 37M 82% /boot
tmpfs 378M 12K 378M 1% /run/user/42
tmpfs 378M 0 378M 0% /run/user/0
## 新建磁盘组挂载路径
[root@postgres /]# mkdir raid0_data
[root@postgres /]# mount /dev/md0 /raid0_data
[root@postgres /]# df -hl
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 13M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/rhel-root 37G 22G 16G 58% /
/dev/sda1 197M 160M 37M 82% /boot
tmpfs 378M 12K 378M 1% /run/user/42
tmpfs 378M 0 378M 0% /run/user/0
/dev/md0 9.8G 37M 9.2G 1% /raid0_data
[root@postgres /]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 200M 0 part /boot
└─sda2 8:2 0 39.8G 0 part
├─rhel-root 253:0 0 36.8G 0 lvm /
└─rhel-swap 253:1 0 3G 0 lvm [SWAP]
sdb 8:16 0 5G 0 disk
└─md0 9:0 0 10G 0 raid0 /raid0_data
sdc 8:32 0 5G 0 disk
└─md0 9:0 0 10G 0 raid0 /raid0_data
sdd 8:48 0 5G 0 disk
sde 8:64 0 5G 0 disk
sr0 11:0 1 4.2G 0 rom
[root@postgres /]#
查看RAID磁盘组信息
##显示当前系统中 RAID 设备的状态,包括各个 RAID 设备的活动状态和组成设备。
root@postgres /]# cat /proc/mdstat
Personalities : [raid0]
md0 : active raid0 sdc[1] sdb[0]
10475520 blocks super 1.2 512k chunks
unused devices: <none>
##显示指定 RAID 设备(这里是 /dev/md0)的详细信息,包括 RAID 级别、设备状态、参与的物理设备等。
[root@postgres /]# mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sun Oct 20 11:32:06 2024
Raid Level : raid0
Array Size : 10475520 (9.99 GiB 10.73 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Sun Oct 20 11:32:06 2024
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Chunk Size : 512K
Consistency Policy : none
Name : postgres:0 (local to host postgres)
UUID : e5725052:eeb29c8a:f39b7781:e06ea8c0
Events : 0
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 activ