▼RAID
RAID:Redundant Arrays of Inexpensive(Independent) Disks
1988年由加利福尼亚大学伯克利分校(University of California-Berkeley) “A Case for Redundant Arrays of Inexpensive Disks”
多个磁盘合成一个“阵列”来提供更好的性能、冗余,或者两者都提供
RAID
提高IO能力
磁盘并行读写
提高耐用性
磁盘冗余来实现
级别:多块磁盘组织在一起的工作方式有所不同
RAID实现的方式
- 外接式磁盘阵列:通过扩展卡提供适配能力
- 内接式RAID:主板集成RAID控制器,安装OS前在BIOS里配置
- 软件RAID:通过OS实现
RAID级别 | |
---|---|
RAID-0 | 条带卷,strip 读、写性能提升 可用空间:N*min(S1,S2,…) 无容错能力 最少磁盘数:2, 2+ |
RAID-1 | 镜像卷,mirror 读性能提升、写性能略有下降 可用空间:1*min(S1,S2,…) 有冗余能力 最少磁盘数:2, 2N RAID-4: 多块数据盘异或运算值存于专用校验盘 |
RAID-5 | 读、写性能提升 可用空间:(N-1)*min(S1,S2,…) 有容错能力:允许最多1块磁盘损坏 最少磁盘数:3, 3+ |
RAID-6 | 读、写性能提升 可用空间:(N-2)*min(S1,S2,…) 有容错能力:允许最多2块磁盘损坏 最少磁盘数:4, 4+ |
RAID7 | 可以理解为一个独立存储计算机 自身带有操作系统和管理工具 可以独立运行,理论上性能最高的RAID模式 |
RAID-10 | 读、写性能提升 可用空间:N*min(S1,S2,…)/2 有容错能力:每组镜像最多只能坏一块 最少磁盘数:4, 4+ |
RAID-01 | 多块磁盘先实现RAID0,再组合成RAID1 |
RAID-50 | 多块磁盘先实现RAID5,再组合成RAID0 |
JBOD | Just a Bunch Of Disks 功能:将多块磁盘的空间合并一个大的连续空间使用 可用空间:sum(S1,S2,…) |
- 常用级别:
RAID-0, RAID-1, RAID-5, RAID-10, RAID-50, JBOD
▼软RAID
- mdadm:为软RAID提供管理界面
- 为空余磁盘添加冗余
- 结合内核中的md(multi devices)
- RAID设备可命名为/dev/md0、/dev/md1、/dev/md2、/dev/md3等
软件RAID的实现
-
mdadm:模式化的工具
-
命令的语法格式:
mdadm [MODE] <raiddevice> [options] <component-devices>
-
支持的RAID级别:LINEAR, RAID0, RAID1, RAID4, RAID5, RAID6, RAID10
-
[MODE]模式:
创建:-C
装配:-A
监控:-F
管理:-f, -r, -a -
<raiddevice>
: /dev/md# -
<component-devices>
: 任意块设备 -
[MODE]模式:
- -C: 创建模式
-n #: 使用#个块设备来创建此RAID
-l #:指明要创建的RAID的级别
-a {yes|no}:自动创建目标RAID设备的设备文件
-c CHUNK_SIZE: 指明块大小,单位k
-x #: 指明空闲盘的个数 - -D:显示raid的详细信息
mdadm -D /dev/md# - -f: 标记指定磁盘为损坏
- -a: 添加磁盘
- -r: 移除磁盘
- -C: 创建模式
-
观察md的状态: cat /proc/mdstat
软RAID配置示例
- 使用mdadm创建并定义RAID设备
mdadm -C /dev/md0 -a yes -l 5 -n 3 -x 1 /dev/sd{b,c,d,e}1
- 用文件系统对每个RAID设备进行格式化
mkfs.xfs /dev/md0
- 测试RAID设备:使用mdadm检查RAID设备的状况
mdadm --detail|D /dev/md0
- 增加新的成员
mdadm –G /dev/md0 –n4 -a /dev/sdf1
软RAID测试和修复
- 模拟磁盘故障
mdadm /dev/md0 -f /dev/sda1
- 移除磁盘
mdadm /dev/md0 –r /dev/sda1
- 从软件RAID磁盘修复磁盘故障
•替换出故障的磁盘然后开机
•在备用驱动器上重建分区
•mdadm /dev/md0 -a /dev/sda1
- mdadm、/proc/mdstat及系统日志信息
软RAID管理
- 生成配置文件:mdadm –D –s >> /etc/mdadm.conf
- 停止设备:mdadm –S /dev/md0
- 激活设备:mdadm –A –s /dev/md0 激活
- 强制启动:mdadm –R /dev/md0
- 删除raid信息:mdadm --zero-superblock /dev/sdb1
▼逻辑卷管理器(LVM)
允许对卷进行方便操作的抽象层,包括重新设定文件系统的大小
允许在多个物理设备间重新组织文件系统
•将设备指定为物理卷
•用一个或者多个物理卷来创建一个卷组
•物理卷是用固定大小的物理区域(Physical Extent,PE)来定义的
•在物理卷上创建的逻辑卷
是由物理区域(PE)组成
•可以在逻辑卷上创建文件系统
LVM介绍
- LVM: Logical Volume Manager, Version 2
- PE(Physical Extend):物理区域,PV中可以用于分配的最小存储单元,可以在创建PV的时候制定(默认为4MB)。
- PV(Physical Volume):物理卷,可以是物理硬盘或者分区。
- LV(Logical Volume):逻辑卷,大小可以动态改变。
- VG(Volume Group):卷组。
- dm: device mapper,将一个或多个底层块设备组织成一个逻辑设备的模块
- 设备名:/dev/dm-#
- 软链接:
/dev/mapper/VG_NAME-LV_NAME
/dev/mapper/vol0-root
/dev/VG_NAME/LV_NAME
/dev/vol0/root - LVM更改文件系统的容量
LVM可以弹性的更改LVM的容量
通过交换PE来进行资料的转换,将原来LV内的PE转移到其他的设备中以降低LV的容量,或将其他设备中的PE加到LV中以加大容量
pv管理工具
- 显示pv信息(pvs:简要pv信息显示)
pvdisplay
- 创建pv
pvcreate /dev/DEVICE
- 删除pv
pvremove /dev/DEVICE
vg管理工具
- 显示卷组
vgs
vgdisplay
- 创建卷组
vgcreate [-s #[kKmMgGtTpPeE]] VolumeGroupName PhysicalDevicePath...
- 管理卷组
vgextend VolumeGroupName PhysicalDevicePath...
vgreduce VolumeGroupName PhysicalDevicePath...
- 删除卷组
先做pvmove
,再做vgremove
lv管理工具
- 显示逻辑卷
lvs
Lvdisplay
- 创建逻辑卷
lvcreate -L #[mMgGtT] -n NAME VolumeGroup
lvcreate -l 60%VG -n mylv testvg
lvcreate -l 100%FREE -n yourlv testvg
- 删除逻辑卷
lvremove /dev/VG_NAME/LV_NAME
- 重设文件系统大小
fsadm [options] resize device [new_size[BKMGTEP]]
resize2fs [-f] [-F] [-M] [-P] [-p] device [new_size]
xfs_growfs /mountpoint
扩展和缩减逻辑卷
- 扩展逻辑卷:
lvextend -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME
或lvextend -l +1000 /dev/vg0/lv0 #增加1000个PE大小的空间
或lvresize -r -l +100%FREE /dev/VG_NAME/LV_NAME #增加空间并同步
resize2fs /dev/VG_NAME/LV_NAME #ext4文件系统同步
xfs_growfs /mount_point #xfs文件系统同步
- 缩减逻辑卷:
umount /dev/VG_NAME/LV_NAME
e2fsck -f /dev/VG_NAME/LV_NAME
resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT]
lvreduce -L [-]#[mMgGtT] /dev/VG_NAME/LV_NAME
mount
跨主机迁移卷组
源计算机上
- 在旧系统中,umount所有卷组上的逻辑卷
- 禁用卷组
vgchange –a n vg0
lvdisplay
- 导出卷组
vgexport vg0
pvscan
vgdisplay
- 拆下旧硬盘
- 在新系统中安装旧硬盘,并导入卷组:
vgimport vg0
vgchange –ay vg0
启用mount
所有卷组上的逻辑卷
partx -d --nr 1 /dev/sdb
fuser -v /mount-point
创建逻辑卷示例
- 创建物理卷
pvcreate /dev/sda3
- 为卷组分配物理卷
vgcreate vg0 /dev/sda3
- 从卷组创建逻辑卷
lvcreate -L 256M -n data vg0
- 格式化
mkfs.xfs /dev/vg0/data
- 挂载
mount /dev/vg0/data /mnt/data
lvm搬家(移除硬盘)
pvmove /dev/sdd
vgreduce vg0 /dev/sdd
pvremove /dev/sdd
逻辑卷管理器快照
- 快照是特殊的逻辑卷,它是在生成快照时存在的逻辑卷的准确拷贝
- 对于需要备份或者复制的现有数据临时拷贝以及其它操作来说,快照是最合适的选择
- 快照只有在它们和原来的逻辑卷不同时才会消耗空间
- 在生成快照时会分配给它一定的空间,但只有在原来的逻辑卷或者快照有所改变才会使用这些空间
- 当原来的逻辑卷中有所改变时,会将旧的数据复制到快照中
- 快照中只含有原来的逻辑卷中更改的数据或者自生成快照后的快照中更改的数据
- 建立快照的卷大小小于等于原始逻辑卷,也可以使用lvextend扩展快照
- 快照就是将当时的系统信息记录下来,就好像照相一般,若将来有任何数据改动了,则原始数据会被移动到快照区,没有改动的区域则由快照区和文件系统共享
- 由于快照区与原本的LV共用很多PE的区块,因此快照与被快照的LV必须在同一个VG中.系统恢复的时候的文件数量不能高于快照区的实际容量
使用LVM快照
- 为现有逻辑卷创建快照
#xfs文件系统可读写
#ext4文件系统必须只读(-p r)
lvcreate -l 64 -s -n data-snapshot -p r /dev/vg0/data
- 挂载快照
mkdir -p /mnt/snap
#只读挂载
mount -o ro /dev/vg0/data-snapshot /mnt/snap
- 恢复快照
umount /dev/vg0/data-snapshot
umount /dev/vg0/data
lvconvert --merge /dev/vg0/data-snapshot
- 删除快照
umount /mnt/databackup
lvremove /dev/vg0/databackup
练习
- 创建一个可用空间为1G的RAID1设备,文件系统为ext4,有一个空闲盘,开机可自动挂载至/backup目录
- 创建由三块硬盘组成的可用空间为2G的RAID5设备,要求其chunk大小为256k,文件系统为ext4,开机可自动挂载至/mydata目录
- 创建一个至少有两个PV组成的大小为20G的名为testvg的VG;要求PE大小为16MB, 而后在卷组中创建大小为5G的逻辑卷testlv;挂载至/users目录
- 新建用户archlinux,要求其家目录为/users/archlinux,而后su切换至archlinux用户,复制/etc/pam.d目录至自己的家目录
- 扩展testlv至7G,要求archlinux用户的文件不能丢失
- 收缩testlv至3G,要求archlinux用户的文件不能丢失
- 对testlv创建快照,并尝试基于快照备份数据,验证快照的功能
练习答案
- 创建一个可用空间为1G的RAID1设备,文件系统为ext4,有一个空闲盘,开机可自动挂载至/backup目录
#首先在虚拟机添加硬盘
#创建3个分区
fdisk /dev/sdb
fdisk /dev/sdb
fdisk /dev/sdb
...
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 10G 0 part /
├─sda3 8:3 0 2G 0 part [SWAP]
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 5G 0 part /data
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 1G 0 part
sdc 8:32 0 20G 0 disk
└─sdc1 8:33 0 1G 0 part
sdd 8:48 0 20G 0 disk
└─sdd1 8:49 0 1G 0 part
#创建raid1
mdadm -C /dev/md0 -a yes -n 2 -x 1 /dev/sd{b,c,d}1
#创建文件系统
mkfs.ext4 /dev/md0
#查看创建的RAID1
mdadm -D /dev/md0
#创建/backup
mkdir /backup
#设置开机启动(先查看UUID)
blkid | grep /dev/md0
echo "UUID=f448ac3d-40bd-4293-a016-a4285fd890e5 /backup ext4 defaults 0 0 " >> /etc/fstab
#挂载
mount -a
- 创建由三块硬盘组成的可用空间为2G的RAID5设备,要求其chunk大小为256k,文件系统为ext4,开机可自动挂载至/mydata目录
fdisk /dev/sdb
fdisk /dev/sdb
fdisk /dev/sdb
...
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 10G 0 part /
├─sda3 8:3 0 2G 0 part [SWAP]
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 5G 0 part /data
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 1G 0 part
sdc 8:32 0 20G 0 disk
└─sdc1 8:33 0 1G 0 part
sdd 8:48 0 20G 0 disk
└─sdd1 8:49 0 1G 0 part
#创建raid5
mdadm -C /dev/md0 -a yes -l 5 -n 3 -c 256 /dev/sd{b,c,d}1
#创建ext4文件系统
mkfs.ext4 /dev/md0
#设置开机启动(先查看UUID)
mkdir /mydata
blkid /dev/md0
echo "UUID=5815c922-df18-46f4-975a-53172cff5aa9 /mydata ext4 defaults 0 0 " >> /etc/fstab
#挂载
mount -a
- 创建一个至少有两个PV组成的大小为20G的名为testvg的VG;要求PE大小为16MB, 而后在卷组中创建大小为5G的逻辑卷testlv;挂载至/users目录
#创建2个10G的分区(fdisk)
[root@centos7 ~]$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 10G 0 part /
├─sda3 8:3 0 2G 0 part [SWAP]
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 5G 0 part /data
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 10G 0 part
sdc 8:32 0 20G 0 disk
└─sdc1 8:33 0 10G 0 part
#创建物理卷
pvcreate /dev/sd{b,c}1
#查看创建的pv物理卷
pvs
#创建vg卷组
vgcreate -s 16M testvg /dev/sd{b,c}1
#查看
vgs或vgdisplay
#创建lv逻辑卷
lvcreate -n testlv -L 5G testvg
#查看
lvs
#挂载
mkdir /users
mount /dev/testvg/testlv /users
- 新建用户archlinux,要求其家目录为/users/archlinux,而后su切换至archlinux用户,复制/etc/pam.d目录至自己的家目录
useradd -d /users/archlinux archlinux
su archlinux
cp /etc/pam.d /user/archlinux
- 扩展testlv至7G,要求archlinux用户的文件不能丢失
lvextend -L 7G /dev/testvg/testlv
resize2fs /dev/testvg/testlv
- 收缩testlv至3G,要求archlinux用户的文件不能丢失
#取消挂载
umount /users
#检查文件系统
fsck -f /dev/testvg/testlv
#缩减文件系统至3G
resize2fs /dev/testvg/testlv 3G
#缩减逻辑卷至3G
lvreduce -L 3G /dev/testvg/testlv
#挂载
mount /dev/testvg/testlv /users
6=7. 对testlv创建快照,并尝试基于快照备份数据,验证快照的功能
#创建快照
lvcreate -L 1G -s -n testlv-data -p r /dev/testvg/testlv
#挂载
mkdir shot
mount /dev/testvg/testlv-shot /mnt/shot
mount -o ro /dev/testvg/testlv-shot /mnt/snap
rm -f /users/test1.txt
umount /dev/testvg/testlv-shot
umount /dev/testvg/testlv
#恢复快照
lvconvert --merge /dev/testvg/testlv-shot