★RAID 简介
◇啥是 RAID?
RAID 是洋文“Redundant Array of Inexpensive Disks”的缩写,中文称之为“磁盘冗余阵列”。
搞这个玩意儿的好处包括两方面:
其一,通过增加数据的【冗余度】来提升其【可靠性】(RAID 有好几种类型;除了 RAID0,其它各种类型都可以不同程度地提高可靠性)
其二,提升“读性能”或“写性能”或“读写性能”(取决于你具体使用哪种 RAID 类型)
◇RAID 的类型
RAID 有很多种类型,详细解释参见维基百科的“这个链接”。LVM 已经支持如下几种:
RAID 0
RAID 1
RAID 4
RAID 5
RAID 6
RAID 10
考虑到篇幅,俺挑几种常用的 RAID 类型,在下一个章节介绍。介绍的时候,会顺便说说该 RAID 类型的【原理】。
◇“软 RAID”与“硬 RAID”
硬 RAID
“硬 RAID”需要在电脑主板上插一个“RAID 硬件”(RAID 控制器)。然后由这个“RAID 硬件”来控制多块磁盘——RAID 功能全靠该“RAID 硬件”来完成。
操作系统通过该“RAID 硬件”的驱动来与之打交道。在这种模式下,操作系统【看不到】具体的每一个磁盘。因此,这种这种模式的 RAID 对操作系统来说是【透明】滴。
软 RAID
在这种模式下,每个磁盘都直接连到主板上,操作系统可以看到每个磁盘,RAID 功能由操作系统层面(软件层面)实现。故称之为“软 RAID”。
本文讨论的就是这种。
◇哪些同学需要考虑 RAID?
使用 RAID 的【前提】是——你的电脑上同时装了【多个】物理磁盘。如果没有这个前提,搞 RAID 是没意义滴。
LVM 自带的 RAID 功能
◇RAID 0 的玩法
原理
RAID0 有时候也称作“带区集 or 条纹集”。通俗地说就是:把 N 个设备凑成一个大的逻辑设备。每次要写入数据时,先拆分为 N 等份,平均写入每个设备。
空间利用率
完全不浪费(利用率接近 100%
)。在所有 RAID 类型中,这种的空间利用率最高。
可靠性
虽然利用率最高,但可靠性最差(无冗余)——任何一个设备坏掉,全完蛋。
操作步骤
先创建 N 个大小一样的 PV(此处假设 N = 2
),并加入到同一个 VG 里面(假设 VG 名称叫做 vg_raid
)。具体如何做,前面已经聊过。
用如下命令可以创建一个名叫 lv_xxxx
的逻辑卷,并设定以 RAID0 方式存储数据。
lvcreate --type raid0 --stripes 2 --extents 100%FREE -n lv_xxxx vg_raid
上述命令的参数说明:
参数 | 说明 |
--type raid0 | 采用 RAID 0 的方式存储数据 |
--stripes 2 | 用来创建“带区集”的设备数,在本示例中是 |
--extents 100%FREE | 创建一个 LV,把 VG 的剩余空间都用掉 |
最后,在这个新创建的 LV 之上创建文件系统。
◇RAID 1 的玩法
原理
RAID1 有时候也称作“镜像”。也就是说,用 N 块【大小一样】的存储空间,存储相同的数据,以达到冗余的目的。
空间利用率
在常见的 RAID 类型中,RAID1 的【空间利用率】最低(只有 1/N
)。
可靠性
可靠性最高(哪怕 N-1
个设备【同时】坏掉,数据都还在)。
操作步骤
先创建 N
个大小一样的 PV(此处假设 N = 2
),并加入到同一个 VG 里面(假设 VG 名称叫做 vg_raid
)。具体如何做,前面已经聊过。
用如下命令可以创建一个名叫 lv_xxxx
的逻辑卷,并设定以 RAID1 方式存储数据。
lvcreate --type raid1 --mirrors 1 --nosync --extents 100%FREE -n lv_xxxx vg_raid
上述命令的参数说明:
参数 | 说明 |
--type raid1 | 采用 RAID 1 的方式存储数据 |
--mirrors 1 | 镜像设备的数量。 在本示例中用了两个存储设备,其中一个用作镜像; 如果是3个设备搞 RAID1,该参数就是 (对于 RAID1,该参数的最大值为 |
--nosync | 创建 LV 的过程中【不】在几个 PV 之间同步数据, 可缩短该命令的执行时间。 |
最后,在这个新创建的 LV 之上创建文件系统(具体命令,前面已经聊过)。
◇RAID 5 的玩法
原理
RAID5 是针对 RAID4 的改良。这2款的存储风格与前面所说的 RAID0 类似(都用了 stripes 方式拆分数据);为了做到“可靠性”,RAID4 & RAID5 引入了校验码。它至少需要 N
个设备(N ≥ 3
),数据写入前,先拆分为 N-1
份,写入其中 N-1
个设备,多出来的那个设备用来保存【校验码】。
俺用下面这张示意图表示 RAID4 & RAID5 的存储差异。RAID4 把校验值全部放到同一个磁盘,会大大增加该磁盘的写操作——每次有数据块被修改,都要更新校验值,都得写这块磁盘。这块磁盘就会成为“写操作”的瓶颈。
(由于 RAID4 明显不如 RAID5,如今用的很少,所以俺就不聊 RAID4 了)
空间利用率
空间利用率 (N-1)/N
,明显高于 RAID1(1/N
),但低于 RAID0(100%
)。
可靠性
可靠性也不差,N 块设备随便坏一块,都可以恢复。同时坏两块,数据会完蛋(但同时坏两块的概率很低)。
操作步骤
先创建 N 个大小一样的 PV(此处假设 N = 3
),并加入到同一个 VG 里面(假设 VG 名称叫做 vg_raid
)。
用如下命令可以创建一个名叫 lv_xxxx
的逻辑卷,并设定以 RAID5 方式存储数据。
lvcreate --type raid5 --stripes 2 --nosync --extents 100%FREE -n lv_xxxx vg_raid
上述命令的参数说明:
参数 | 说明 |
--type raid5 | 采用 RAID 5 的方式存储数据 |
--stripes 2 | 表示数据拆分为几份。 对于 RAID5 模式的 N 个设备,该数字是【 (对于 RAID5,该参数的最大值为 |
--nosync | 创建 LV 的过程中【不】在几个 PV 之间同步数据, 可缩短该命令的执行时间。 |
最后,在这个新创建的 LV 之上创建文件系统(具体命令,前面已经聊过)。
◇LVM 使用 RAID 存储的注意事项
一旦你在某个 VG 上创建了 RAID 方式的 LV,之后你就【无法】再从该 VG 中移除 PV 了(这是由 RAID 本身的特点决定的)。这种情况下,如果你非要移除该 VG 中的 PV,除非你先把该 VG 上涉及 RAID 存储的那些 LV 先全部删除,然后才能移除 PV。
一般来说,如果你要采用 RAID 的方式,应该为此单独创建一个新的 VG,该 VG 中的 PV 只用于 RAID 方式。
实战
1、在虚拟机上实现 软raid5.
主要步骤:
- 添加三块scsi硬盘
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─rhel-root 253:0 0 17G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 5G 0 disk
sdc 8:32 0 5G 0 disk
sdd 8:48 0 5G 0 disk
- 创建三个大小一样的pv
[root@localhost ~]# pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.
[root@localhost ~]# pvcreate /dev/sdc
Physical volume "/dev/sdc" successfully created.
[root@localhost ~]# pvcreate /dev/sdd
Physical volume "/dev/sdd" successfully created.
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 rhel lvm2 a-- <19.00g 0
/dev/sdb lvm2 --- 5.00g 5.00g
/dev/sdc lvm2 --- 5.00g 5.00g
/dev/sdd lvm2 --- 5.00g 5.00g
- 将三个pv放一个vg逻辑池
[root@localhost ~]# vgcreate vg_raid /dev/sdb
Volume group "vg_raid" successfully created
[root@localhost ~]# vgextend vg_raid /dev/sdc
Volume group "vg_raid" successfully extended
[root@localhost ~]# vgextend vg_raid /dev/sdd
Volume group "vg_raid" successfully extended
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
rhel 1 2 0 wz--n- <19.00g 0
vg_raid 3 0 0 wz--n- <14.99g <14.99g
[root@localhost ~]#
- 创建lv逻辑卷并以raid5方式存储数据。
[root@localhost ~]# lvcreate --type raid5 --stripes 2 --nosync --extents 100%FREE -n lv_raid5 vg_raid
Using default stripesize 64.00 KiB.
Rounding size (3837 extents) down to stripe boundary size (3836 extents)
WARNING: New raid5 won't be synchronised. Don't read what you didn't write!
Logical volume "lv_raid5" created.
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root rhel -wi-ao---- <17.00g
swap rhel -wi-ao---- 2.00g
lv_raid5 vg_raid Rwi-a-r--- 9.98g 100.00
[root@localhost ~]#
可以看到三快盘一共是15GB ,做完raid变成了9.8GB
利用率刚好是66.7%
做了raid5还需要热备盘吗?
uodate 2022年11月2日17:35:44
今天infra同事给服务器做了raid5,并开启了热备盘。整个过程看了一遍在这里总结一下:
12块10TB的SAS盘
1、做raid5 容量少一块
2、热备需要一块
剩余10块 10/12 = 83%.
但问题是为啥是11/12 = 91%的利用率呢?