14.2 软件磁盘阵列
14.2.1 什么是RAID
磁盘阵列的全名是【Redundant Arrays of Inexpensive Disks,RAID】,大意是价格便宜的冗余磁盘阵列
通过硬件技术或软件技术将多个小磁盘整合成一个较大的磁盘设备,根据level不同可以提供性能提升,数据保护(冗余)等功能
常见的level和各自优缺点如下:
项目 | RAID 0 | RAID 1 | RAID1+0 | RAID 5 | RAID 6 |
---|---|---|---|---|---|
最少磁盘数 | 2 | 2 | 4 | 3 | 4 |
最大容错磁盘数 | 无 | n-1 | n/2 | 1 | 2 |
数据可靠性 | 无 | 最佳 | 最佳 | 好 | 比RAID 5好 |
理论写入性能 | n | 1 | n/2 | <n-1 | <n-2 |
理论读出性能 | n | n | n | <n-1 | <n-2 |
可用容量 | n | 1 | n/2 | n-1 | n-2 |
一般应用 | 强调性能但 数据不重要的环境 | 数据与备份 | 服务器、云系统 | 数据与备份 | 数据与备份 |
注1:n是指所有硬盘的个数
注2:RAID5和RAID6实际上就是添加1/2个校验盘,类似纠删码来达到数据可靠性
注3:热备份磁盘(Spare Disk)这个是指没有包含在原本磁盘阵列里的磁盘,平时不被使用,只有列阵中的磁盘损坏时,该磁盘才会被主动拉入,并将损坏磁盘移除,然后重建数据系统
14.2.2 硬件RAID,软件RAID
硬件磁盘阵列(hardware RAID)是通过磁盘阵列卡来完成磁盘阵列的功能,磁盘阵列卡上有一块专门的芯片用于处理RAID的任务,因此性能更好,但是价格比较贵
软件磁盘阵列(software RAID)是通过软件来模拟磁盘阵列的任务,因此占用系统资源,但是更加灵活和便宜,CentOS提供的是mdadm软件
14.2.3 软件磁盘阵列的设置
举一个例子:新建一个磁盘阵列设备 /dev/md0,level是RAID5,块大小256k,一共5个盘(5,6,7,8,9),其中1个备用盘
mdadm --create /dev/md0 --auto=yes --level=5 --chunk=256k \
--raid-devices=4 --spare-devices=1 /dev/vda{5,6,7,8,9)
查看磁盘阵列md0 : mdadm --detail /dev/md0
设置设备状态为出错:mdadm --manage /dev/md0 --fail /dev/vd7
从md0移除设备: mdadm --manage /dev/md0 --remove /dev/vd7
加入新设备到md0: mdadm --manage /dev/md0 --add /dev/vd7
删除磁盘阵列md0: 1)先删除md0可能存在的数据:dd if=/dev/zero of=/dev/md0 bs=1M count=50
2)然后关闭:mdadm --stop /dev/md0
3)再删除5个盘的所有数据:dd if=/dev/zero of=/dev/vda5 bs=1M count=50
4)最后删除UUID:vim /etc/mdadm.conf
14.3 逻辑卷管理器(Logical Volume Manager)
14.3.1 什么是LVM:PV、PE、VG、LV的意义
LVM的做法是将几个物理的分区或者物理磁盘通过软件组合成一块看起来是独立的大磁盘(VG),然后再将VG划分成为可用的逻辑分区(LV),这样就可以被挂在使用了
LVM可以弹性地调整文件系统的容量,具体是通过PE进行实现的
-
物理卷PV
物理分区/物理磁盘通过pvcreate的命令被转化成LVM的最底层的物理卷(PV),转化之前需要调整system ID为8e00(LVM系统,默认是 Linux filesystem)
-
卷组VG
将1个或多个PV整合成VG
-
逻辑卷LV
VG还需要被切分成LV,这个LV是最后可以被格式化使用的东西
-
物理扩展块PE
PE默认大小4M,是LVM最小的存储数据单位,我们的文件数据会借助写入PE来完成,具体如下图
对于以上概念可以通过一个例子来解释:
现在有4个300G的硬盘,将每个硬盘分成3个分区,每个分区100G,然后转化成12个100G的物理卷PV;
在4个硬盘中各取一个分区组成一个卷组VG,从而一共得到4个300G的VG;
然后将4个VG转化为LV,这样就得到4个400G的LV,它的空间实际上是来自于4个硬盘,每个硬盘100G
PS:感觉这个PE和Ceph的PG原理很像,VG和存储池的原理也很像
14.3.2 LVM操作流程
0、LVM相关命令集合
任务 | PV阶段 | VG阶段 | LV阶段 | 文件系统(XFS/ ext4) |
---|---|---|---|---|
查找(scan) | pvscan | vgscan | lvscan | lsblk, blkid |
建立(create) | pvcreate | vgcreate | lvcreate | mkfs.xfs, nkfs.ext4 |
列出(display) | pvdisplay | vgdisplay | lvdisplay | df, mount |
增加(extend) | vgextend | lvextend | xfs_growfs, resize2fs | |
减少(reduce) | vgreduce | lvreduce | 不支持, resize2fs | |
删除(remove) | pvremove | vgremove | lvremove | umount |
修改容量(resize) | lvresize | xfs_growfs, resize2fs | ||
修改属性(change) | pvchange | vgchange | lvchange | remount |
1、PV阶段
pvcreate:将物理分区建立成PV
pvscan:查找目前系统里面任何具有PV的磁盘
pvdisplay:显示出目前系统上面的PV状态
pvremove:将PV属性删除,让该分区不具有PV属性
[root@host-7 vdbench50406]# pvcreate /dev/sdb6 Physical volume "/dev/sdb6" successfully created. # 查看所有PV [root@host-7 vdbench50406]# pvscan PV /dev/sdb4 VG vg_data lvm2 [20.00 GiB / 4.00 MiB free] PV /dev/sdb3 VG vg_sys lvm2 [<90.02 GiB / 20.00 MiB free] PV /dev/sdb5 lvm2 [1.00 GiB] PV /dev/sdb6 lvm2 [1.00 GiB] Total: 4 [112.02 GiB] / in use: 2 [110.02 GiB] / in no VG: 2 [2.00 GiB]
2、VG阶段
vgcreate:建立VG的命令
vgscan:查找系统上面是否有VG
vgdisplay:显示目前系统上面的VG状态
vgextend:在VG内增加额外的PV
vgreduce:在VG内删除PV
vgchange:设置VG是否启动(active)
vgremove:删除一个VG
[root@host-7 vdbench50406]# vgcreate vgtest /dev/sdb{5,6}
Volume group "vgtest" successfully created
参数:-s:后面接PE的大小,比如-s 16M,没有指定,就默认4M
# 查看所有VG
[root@host-7 vdbench50406]# vgscan
Reading all physical volumes. This may take a while...
Found volume group "vgtest" using metadata type lvm2
Found volume group "vg_data" using metadata type lvm2
Found volume group "vg_sys" using metadata type lvm2
#再次查看LV,会发现PV关联了VG
[root@host-7 vdbench50406]# pvscan
PV /dev/sdb5 VG vgtest lvm2 [1020.00 MiB / 1020.00 MiB free]
PV /dev/sdb6 VG vgtest lvm2 [1020.00 MiB / 1020.00 MiB free]
3、LV阶段
lvcreate:建立LV的命令
lvscan:查找系统上面的LV
lvdisplay:显示目前系统上面的LV状态
lvextend:在LV中增加容量
lvreduce:在LV中减少容量
lvremove:删除一个LV
lvresize:对LV进行容量大小的调整
[root@host-7 vdbench50406]# lvcreate -L 1G -n lvtest vgtest Logical volume "lvtest" created. 选项与参数: -L:后面接容量,单位可以是M、G、T -l:后面接PE的个数,容量根据 PE容量*PE个数 进行计算 -n:后面接LV的名称 # 查看所有LV [root@host-7 vdbench50406]# lvscan ACTIVE '/dev/vgtest/lvtest' [1.00 GiB] inherit ACTIVE '/dev/vg_data/lv_nova' [20.00 GiB] inherit ACTIVE '/dev/vg_sys/lv_root' [20.00 GiB] inherit ACTIVE '/dev/vg_sys/lv_home' [20.00 GiB] inherit ACTIVE '/dev/vg_sys/lv_var' [50.00 GiB] inherit
4、文件系统阶段
[root@host-7 vdbench50406]# mkfs.xfs /dev/vgtest/lvtest # 先格式化
[root@host-7 vdbench50406]# mount /dev/vgtest/lvtest /test #然后挂载
[root@host-7 vdbench50406]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_sys-lv_root 20G 2.4G 17G 13% /
devtmpfs 95G 0 95G 0% /dev
tmpfs 95G 0 95G 0% /dev/shm
tmpfs 95G 19M 95G 1% /run
tmpfs 95G 0 95G 0% /sys/fs/cgroup
/dev/mapper/vg_sys-lv_home 20G 524M 19G 3% /home
/dev/sdb2 976M 184M 726M 21% /boot
/dev/mapper/vg_sys-lv_var 49G 1012M 46G 3% /var
/dev/mapper/vg_data-lv_nova 20G 33M 20G 1% /var/lib/placements
tmpfs 19G 0 19G 0% /run/user/1000
/dev/mapper/vgtest-lvtest 1014M 33M 982M 4% /test #可以查询到并使用
14.3.3 放大LV容量
1、放大LV容量
[root@host-7 test]# lvresize -L +500M /dev/vgtest/lvtest
Size of logical volume vgtest/lvtest changed from 1000.00 MiB (250 extents) to 1.46 GiB (375 extents).
Logical volume vgtest/lvtest successfully resized.
# 增加成功500M
[root@host-7 test]# lvscan
ACTIVE '/dev/vgtest/lvtest' [1.46 GiB] inherit
ACTIVE '/dev/vg_data/lv_nova' [20.00 GiB] inherit
ACTIVE '/dev/vg_sys/lv_root' [20.00 GiB] inherit
ACTIVE '/dev/vg_sys/lv_home' [20.00 GiB] inherit
ACTIVE '/dev/vg_sys/lv_var' [50.00 GiB] inherit
# 但是文件系统没有变化
[root@host-7 test]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vg_sys-lv_root ext4 20G 2.4G 17G 13% /
devtmpfs devtmpfs 95G 0 95G 0% /dev
tmpfs tmpfs 95G 0 95G 0% /dev/shm
tmpfs tmpfs 95G 19M 95G 1% /run
tmpfs tmpfs 95G 0 95G 0% /sys/fs/cgroup
/dev/mapper/vg_sys-lv_home ext4 20G 525M 19G 3% /home
/dev/sdb2 ext4 976M 184M 726M 21% /boot
/dev/mapper/vg_sys-lv_var ext4 49G 1012M 46G 3% /var
/dev/mapper/vg_data-lv_nova xfs 20G 33M 20G 1% /var/lib/placements
tmpfs tmpfs 19G 0 19G 0% /run/user/1000
/dev/mapper/vgtest-lvtest xfs 1014M 185M 830M 19% /test
2、放大操作系统容量
[root@host-7 test]# xfs_growfs /test
meta-data=/dev/mapper/vgtest-lvtest isize=512 agcount=4, agsize=65536 blks
= sectsz=4096 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=4096 sunit=1 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 262144 to 384000
# 此时已经方法到1.5G
[root@host-7 test]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vg_sys-lv_root ext4 20G 2.4G 17G 13% /
devtmpfs devtmpfs 95G 0 95G 0% /dev
tmpfs tmpfs 95G 0 95G 0% /dev/shm
tmpfs tmpfs 95G 19M 95G 1% /run
tmpfs tmpfs 95G 0 95G 0% /sys/fs/cgroup
/dev/mapper/vg_sys-lv_home ext4 20G 525M 19G 3% /home
/dev/sdb2 ext4 976M 184M 726M 21% /boot
/dev/mapper/vg_sys-lv_var ext4 49G 1012M 46G 3% /var
/dev/mapper/vg_data-lv_nova xfs 20G 33M 20G 1% /var/lib/placements
tmpfs tmpfs 19G 0 19G 0% /run/user/1000
/dev/mapper/vgtest-lvtest xfs 1.5G 185M 1.3G 13% /test
14.3.4 使用LVM thin Volume让LVM动态调整磁盘使用率
可以在1G的thin pool中创建10G的thin设备,thin设备用了多少空间,pool才会动态分配多少空间,具体的后续了解
14.3.5 LVM的LV磁盘快照
14.3.5 LVM的关闭
1、先卸载系统上的LVM文件系统
[root@host-7 /]# umount /test
[root@host-7 /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_sys-lv_root 20G 2.4G 17G 13% /
devtmpfs 95G 0 95G 0% /dev
tmpfs 95G 0 95G 0% /dev/shm
tmpfs 95G 19M 95G 1% /run
tmpfs 95G 0 95G 0% /sys/fs/cgroup
/dev/mapper/vg_sys-lv_home 20G 526M 19G 3% /home
/dev/sdb2 976M 184M 726M 21% /boot
/dev/mapper/vg_sys-lv_var 49G 1012M 46G 3% /var
/dev/mapper/vg_data-lv_nova 20G 33M 20G 1% /var/lib/placements
tmpfs 19G 0 19G 0% /run/user/1000
2、删除LV
[root@host-7 /]# lvremove /dev/vgtest/lvtest
Do you really want to remove active logical volume vgtest/lvtest? [y/n]: y
[root@host-7 /]# lvscan
ACTIVE '/dev/vg_data/lv_nova' [20.00 GiB] inherit
ACTIVE '/dev/vg_sys/lv_root' [20.00 GiB] inherit
ACTIVE '/dev/vg_sys/lv_home' [20.00 GiB] inherit
ACTIVE '/dev/vg_sys/lv_var' [50.00 GiB] inherit
3、删除VG Active标志,然后删除VG
[root@host-7 /]# vgchange -a n vgtest
0 logical volume(s) in volume group "vgtest" now active
[root@host-7 /]# vgremove vgtest
Volume group "vgtest" successfully removed
[root@host-7 /]# vgscan
Reading all physical volumes. This may take a while...
Found volume group "vg_data" using metadata type lvm2
Found volume group "vg_sys" using metadata type lvm2
4、删除PV
[root@host-7 /]# pvremove /dev/sdb{5,6}
Labels on physical volume "/dev/sdb5" successfully wiped.
Labels on physical volume "/dev/sdb6" successfully wiped.
[root@host-7 /]# pvscan
PV /dev/sdb4 VG vg_data lvm2 [20.00 GiB / 4.00 MiB free]
PV /dev/sdb3 VG vg_sys lvm2 [<90.02 GiB / 20.00 MiB free]
Total: 2 [110.02 GiB] / in use: 2 [110.02 GiB] / in no VG: 0 [0 ]
6、将System ID修改回来
[root@host-7 /]# gdisk /dev/sdb
GPT fdisk (gdisk) version 0.8.6
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help): t # t就是修改code,可以通过?查看命令
Partition number (1-6): 6
Current type is 'Linux LVM'
Hex code or GUID (L to show codes, Enter = 8300): 8300
Changed type of partition to 'Linux filesystem'
Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sdb.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.
[root@host-7 /]# gdisk -l /dev/sdb
GPT fdisk (gdisk) version 0.8.6
Number Start (sector) End (sector) Size Code Name
1 2048 22527 10.0 MiB EF02 bios_grub
2 22528 2119679 1024.0 MiB 8300 primary
3 2119680 190912511 90.0 GiB 8E00 primary
4 190912512 232871935 20.0 GiB 8E00 primary
5 232871936 234969087 1024.0 MiB 8300 Linux filesystem
6 234969088 237066239 1024.0 MiB 8300 Linux filesystem