1.7笔记
本文介绍了Linux RAID存储技术的基本概念和操作。首先概述了RAID技术的历史演变,从"廉价磁盘冗余阵列"发展为"独立磁盘冗余阵列"。详细讲解了三种RAID实现方式:软RAID、硬RAID和软硬混合RAID。重点分析了RAID 0、RAID 1和RAID 5三种级别的原理、适用场景、优缺点,并配有对比图表。文章还提供了在Linux系统中使用mdadm工
1.7笔记
Linux RAID存储技术
环境准备
虚拟机添加6块20G 硬盘,sdb sdc sdd sde sdf sdg
RAID技术历史
1988 年美国加州大学伯克利分校的 D. A. Patterson 教授等人首次在论文 “A Case of Redundant Array of Inexpensive Disks” 中提出了 RAID 概念 ,即廉价磁盘冗余阵列( Redundant Array of Inexpensive Disks )。由于当时大容量磁盘比较昂贵, RAID 的基本思想是将多个容量较小、相 对廉价的磁盘进行有机组合,从而以较低的成本获得与昂贵大容量磁盘相当的容量、性能、可靠 性。随着磁盘成本和价格的不断降低, RAID 可以使用大部分的磁盘, “廉价” 已经毫无意义。因 此, RAID 咨询委员会( RAID Advisory Board, RAB )决定用 “ 独立 ” 替代 “ 廉价 ” ,于时 RAID 变成了独立磁盘冗余阵列( Redundant Array of Independent Disks )。但这仅仅是名称的变 化,实质内容没有改变。
RAID实现方式
从实现角度看, RAID 主要分为:
- 软 RAID:所有功能均有操作系统和 CPU 来完成,没有独立的 RAID 控制 / 处理芯片和 I/O 处理芯片,效率最低。
- 硬 RAID :配备了专门的 RAID 控制 / 处理芯片和 I/O 处理芯片以及阵列缓冲,不占用 CPU 资源,成本很高。
- 软硬混合 RAID:具备 RAID 控制 / 处理芯片,但缺乏 I/O 处理芯片,需要 CPU 和驱动程序 来完成,性能和成本在软 RAID 和硬 RAID 之间。
RAID级别介绍
RAID 0
原理
RAID 0使用数据条带化(striping)的方式将数据分散存储在多个磁盘驱动器上,而不进行冗余备 份。数据被分成固定大小的块,并依次存储在每个磁盘上。例如,如果有两个驱动器(驱动器A和 驱动器B),一块数据的第一个部分存储在驱动器A上,第二个部分存储在驱动器B上,以此类 推。这种条带化的方式可以同时从多个驱动器读取或写入数据,从而提高系统的性能。
适用场景
RAID 0适用于需要高性能而不关心数据冗余的场景。以下是几种适合使用RAID 0的场景:
- 视频编辑和处理:在视频编辑中,需要快速读取和写入大量数据。RAID 0可以通过并行读写 操作提高数据传输速度,加快视频编辑和处理的速度。
- 大型数据库应用:对于需要频繁访问和查询数据库的应用程序,RAID 0可以提供更快的数据 访问速度,加快数据库操作的响应时间。
- 实时流媒体:对于需要实时传输和处理大量数据的流媒体应用,RAID 0可以提供足够的带宽 和吞吐量,确保流媒体内容的平滑播放。
优点
RAID 0具有以下优点:
- 高性能:通过数据条带化和并行读写操作,RAID 0可以提供更快的数据传输速度和更高的系 统性能。
- 成本效益:相对于其他RAID级别(如RAID 1或RAID 5),RAID 0不需要额外的磁盘用于冗 余备份,因此在成本上更具竞争力。
缺点
RAID 0也存在一些缺点:
- 缺乏冗余:由于RAID 0不提供数据冗余,如果任何一个驱动器发生故障,所有数据都可能丢 失。因此,RAID 0不适合存储关键数据。 2.
- 可靠性降低:由于没有冗余备份,RAID 0的可靠性相对较低。如果任何一个驱动器发生故障,整个阵列的可用性将受到影响。
RAID 1
原理
RAID 1使用数据镜像(mirroring)的方式将数据完全复制到两个或多个磁盘驱动器上。当写入数 据时,数据同时写入所有驱动器。这样,每个驱动器都具有相同的数据副本,从而实现数据的冗 余备份。如果其中一个驱动器发生故障,系统可以继续从剩余的驱动器中读取数据,确保数据的 可用性和完整性。
适用场景
RAID 1适用于对数据冗余和高可用性要求较高的场景。以下是几种适合使用RAID 1的场景:
- 关键数据存储:对于关键数据的存储,如企业的财务数据、客户信息等,RAID 1可以提供数 据冗余备份,以防止数据丢失。
- 数据库服务器:对于需要高可用性和容错性的数据库服务器,RAID 1可以确保数据的持久性 和可用性,即使一个驱动器发生故障,也可以从其他驱动器中读取数据。
- 文件服务器:对于共享文件的服务器,RAID 1可以提供冗余备份,确保文件的可靠性和高可 用性。
优点
RAID 1具有以下优点:
- 数据冗余备份:RAID 1通过数据镜像将数据完全复制到多个驱动器上,提供冗余备份,保护 数据免受驱动器故障的影响。
- 高可用性:由于数据的冗余备份,即使一个驱动器发生故障,系统仍然可以从其他驱动器中 读取数据,保证数据的可用性和连续性。
- 读取性能提升:RAID 1可以通过并行读取数据的方式提升读取性能,从而加快数据访问速 度。
缺点
RAID 1也存在一些缺点:
- 成本增加:由于需要额外的磁盘用于数据冗余备份,RAID 1的成本相对较高。需要考虑额外 的硬件成本。 2.
- 写入性能略低:由于数据需要同时写入多个驱动器,相对于单个驱动器的写入性能,RAID 1 的写入性能可能略低。
RAID 5
原理
RAID 5使用数据条带化(striping)的方式将数据分散存储在多个磁盘驱动器上,并通过分布式奇 偶校验实现数据的冗余备份。数据和奇偶校验信息被组织成数据块,其中奇偶校验信息被分布式 存储在不同的驱动器上。当写入数据时,奇偶校验信息也会被更新。如果其中一个驱动器发生故 障,系统可以通过重新计算奇偶校验信息来恢复丢失的数据。这种方式可以同时提供性能增强和 数据冗余。
适用场景 RAID 5适用于需要性能增强和数据冗余的场景。以下是几种适合使用RAID 5的场景:
- 文件服务器:对于文件服务器,RAID 5可以提供高性能的数据访问和数据冗余备份,确保文 件的安全性和可用性。
- 数据库服务器:对于需要高性能和数据冗余的数据库服务器,RAID 5可以提供快速的数据读 取和写入,同时保护数据免受驱动器故障的影响。
- 小型企业环境:对于小型企业,RAID 5提供了经济实惠的解决方案,同时提供了性能和数据 冗余的好处。
优点
RAID 5具有以下优点:
- 性能增强:通过数据条带化和并行读写操作,RAID 5可以提供较高的数据传输速度和系统性 能。
- 数据冗余备份:通过分布式奇偶校验,RAID 5可以提供数据的冗余备份,保护数据免受驱动 器故障的影响。
- 成本效益:相对于其他RAID级别(如RAID 1),RAID 5只需要额外一个驱动器用于奇偶校验 信息,从而在成本上更具竞争力。
缺点 RAID 5也存在一些缺点:
- 写入性能受限:由于写入数据时需要重新计算奇偶校验信息,相对于读取操作,RAID 5的写 入性能较低。
- 驱动器故障期间的数据完整性:如果一个驱动器发生故障,系统在恢复数据时需要进行计 算,这可能导致数据访问速度较慢,并且在此期间可能会有数据完整性的风险。
RAID级别总结

管理软RAID
Linux 提供 mdadm 实用程序来创建和管理软件RAID。
RAID0
创建
#安装mdadm工具
yum install -y mdadm
#创建一个2磁盘的RAID 0设备/dev/md0
mdadm --create /dev/md0 --level 0 --raid-devices 2 /dev/sd{b,c}
查看
#查看 raid 概要信息
cat /proc/mdstat
#查看raid设备详细信息
mdadm --detail /dev/md0
lsblk /dev/md0
格式化和挂载
#查看磁盘布局
lsblk /dev/sdb /dev/sdc
#格式化,xfs文件系统类型
mkfs.xfs /dev/md0
#创建挂载点
mkdir -p /raid/raid0
#挂载
mount /dev/md0 /raid/raid0
#查看磁盘空间
dh -h /raid/raid0/
#测试
cp /etc/ho* /raid/raid0/
ls /raid/raid0/
删除
#删除raid
#① 卸载
umount /dev/md0
#② 停止RAID阵列,将删除阵列
mdadm --stop /dev/md0
#③ 清除原先设备上的 md superblock超级块
mdadm --zero-superblock /dev/sd{b,c}
补充
#raid0 条带不能增加新成员盘。
#raid0 条带不能强制故障成员盘。
RAID1
创建
#创建一个包含2个块设备的raid1设备/dev/md1
#如果不记得创建命令,可以输入 man mdadm,进去后输入/EXAMPLES查看示例
mdadm --create /dev/md1 --level 1 --raid-devices 2 /dev/sd{b,c}
查看
mdadm --detail /dev/md1
lsblk /dev/md1
lsblk /dev/sdb /dev/sdc
格式化和挂载
等待同步完成:直到同步进度达到100%,然后进行格式化和挂载。
#格式化,文件系统类型为xfs
mkfs.xfs /dev/md1
mkfs.xfs -f /dev/md1
mkdir /raid/raid1
mount /dev/md1 /raid/raid1
df -h /raid/raid1
cp /etc/ho* /raid/raid1
ls /raid/raid1
增加热备盘
mdadm --add /dev/md1 /dev/sdd
mdadm --detail /dev/md1
#要等待100%
模拟故障
mdadm --fail /dev/md1 /dev/sdc
mdadm --detail /dev/md1 | tail -5 # 热备盘顶替故障光盘
#数据依然正常访问
ls /raid/raid1
cat /raid/raid1/hostname
删除故障磁盘
mdadm --remove /dev/md1 /dev/sdc
mdadm --detail /dev/md1 | tail -5
删除RAID
#卸载
umount /dev/md1
mdadm --stop /dev/md1
mdadm --zero-superblock /dev/sd{b..d}
lsblk
补充说明
RAID1的设计初衷是数据冗余和可靠性, 而不是为了增加存储容量。 因此, 即使添加了新的硬盘 并进行了扩容操作, 由于RAID1的工作方式, 其总容量是不会增加的。
RAID 5
创建 查看 格式化和挂载 增加热备盘
#创建一个4磁盘的RAID 5设备/dev/md5
mdadm --create /dev/md5 --level 5 --raid-devices 4 /dev/sd{b..e}
#查看RAID
mdadm --detail /dev/md5
lsblk /dev/md5
#要等待Rebuild Status到100%
mdadm --detail /dev/md5 |tail -15
#格式化,创建xfs文件系统
mkfs.xfs -f /dev/md5
#创建挂载点
mkdir /raid/raid5
#挂载
mount /dev/md5 /raid/raid5
#查看磁盘空间
df -h /raid/raid5
#测试
cp /etc/ho* /raid/raid5
ls /raid/raid5
#增加热备盘
mdadm --add /dev/md5 /dev/sdf
模拟故障 删除磁盘 扩容 删除
#模拟故障
mdadm --fail /dev/md5 /dev/sdb
#观察变化
mdadm --detail /dev/md5 |tail -7
#最初
Number Major Minor RaidDevice State
0 8 16 0 active sync /dev/sdb
1 8 32 1 active sync /dev/sdc
2 8 48 2 active sync /dev/sdd
4 8 64 3 active sync /dev/sde
5 8 80 - spare /dev/sdf
#/dev/sdf是增加的热备盘
#故障后
Number Major Minor RaidDevice State
5 8 80 0 spare rebuilding /dev/sdf
1 8 32 1 active sync /dev/sdc
2 8 48 2 active sync /dev/sdd
4 8 64 3 active sync /dev/sde
0 8 16 - faulty /dev/sdb
#数据访问正常
ls /raid/raid5
cat /raid/raid5/hostname
#删除故障磁盘
mdadm --remove /dev/md5 /dev/sdb
mdadm --detail /dev/md5 |tail -7
#扩容
#对于raid5,只能扩容,不能减容。
mdadm --add /dev/md5 /dev/sdb /dev/sdg
mdadm --detail /dev/md5 |tail -7
#设置成员数量为5,-G是grow(扩展)
mdadm --grow /dev/md5 --raid-devices 5
mdadm --detail /dev/md5 |tail -15
#等待重组完成
mdadm --detail /dev/md5
#确认 raid 容量:增加了20G
lsblk /dev/md5
mdadm --detail /dev/md5
lsblk /dev/md5
#删除
umount /dev/md5
mdadm --stop /dev/md5
mdadm --assemble /dev/md5 /dev/sd{b..g}
lsblk /dev/md5
mdadm --stop /dev/md5
mdadm --zero-superblock /dev/sd{b..g}
Linux 逻辑卷管理
环境准备
虚拟机添加3块20G硬盘,sdb sdc sdd
逻辑卷基本管理
硬盘分区管理方案缺点
- 硬盘分区空间必须使用连续空间,所以硬盘分区扩容很麻烦,特别是要扩容的分区后没有空间。
- 使用硬盘分区创建的文件系统不同跨多个硬盘,受单个硬盘容量限制。
- 如果硬盘损坏,则文件系统中数据也会丢失。
逻辑卷管理硬盘方案优点
- 使用逻辑卷可以更加灵活地扩展和缩减文件系统空间。
- 使用逻辑卷创建的文件系统可以跨多个硬盘,适合创建超大容量文件系统。
- 使用逻辑卷可以创建镜像卷,保证数据的冗余性。即使单个硬盘损坏,文件系统中数据也会丢失。
- 使用逻辑卷还可以创建快照,保留某一时刻数据,就像虚拟机快照一样。
逻辑卷基本概念
LVM是 Logical Volume Manager(逻辑卷管理)的简写,LVM将若干个磁盘或者磁盘分区连接为一个整块的卷组,形成一个存储池。管理员可以在卷组上任意创建逻辑卷,并进一步在逻辑卷上创建文件系统。
- 物理卷(PV, Physical Volume),是LVM的基本存储逻辑块,通过块设备创建。块设备是指磁盘、磁盘分区或从逻辑上和磁盘分区具有同样功能的设备(如RAID)。与基本的物理存储介质(如分区、磁盘等)相比,物理卷包含有和LVM相关的管理参数。
- 卷组(VG, Volume Group),是一个逻辑的存储空间,由一个或多个物理卷组成。
- 逻辑卷(LV, Logical Volume),是从卷组中创建出来的一个逻辑空间。如果把一个卷组类比为一个逻辑硬盘,那么逻辑卷则可以类比为一个硬盘分区,所以也可以在逻辑卷之上创建文件系统。
简单地说:卷组由多个物理卷组成,可以在卷组中创建多个逻辑卷,对逻辑卷创建文件系统给用户使用。
LVM管理基本流程:
- 创建物理卷
- 创建卷组
- 创建逻辑卷
创建物理卷 卷组 逻辑卷 文件系统
#创建物理卷
#创建单个PV
pvcreate /dev/sdb
#创建多个PV
pvcreate /dev/sd[cd]
#查看物理卷/PV列表
pvs
#查看单个PV详细信息
pvdisplay /dev/sdb
#创建卷组
#创建包含单个PV的VG
vgcreate webapp /dev/sdb
#创建包含多个PV的VG
vgcreate dbapp /dev/sd[cd]
#
pvs
#查看卷组/VG列表
vgs
#查看单个VG详细信息
vgdisplay dbapp
#在卷组webapp中创建一个逻辑卷:名称为webapp01,大小为5G。
lvcreate -n webapp01 -L 5G webapp
#在卷组dbapp中创建一个跨硬盘逻辑卷:名称为data01,大小为25G。
lvcreate -n data01 -L 25G dbapp
lvs
ls -l /dev/dbapp/data01 /dev/mapper/dbapp-data01
#查看单个LV详细信息
lvdisplay /dev/dbapp/data01
pvs
lsblk /dev/sd[bcd]
#创建文件系统
mkfs.xfs /dev/webapp/webapp01
mount /dev/webapp/webapp01 /var/www/html
#清理
umount /dev/webapp/webapp01
lvremove /dev/webapp/webapp01 /dev/dbapp/data01
vgremove webapp dbapp
pvremove /dev/sd[bcd]
pvs
扩展和缩减卷组
#创建卷组
vgcreate webapp /dev/sdb
#创建卷组的时候,如果指定的块设备不是物理卷,则会先将块设备创建为物理卷。
#创建逻辑卷,分配10G空间
lvcreate -n webapp01 -L 10G webapp
#扩展卷组,将 /dev/sdc 和 /dev/sdd 添加到 webapp 卷组
vgextend webapp /dev/sd[cd]
#查看所有物理卷信息
pvs
vgreduce webapp /dev/sdb
pvmove /dev/sdb
pvs
vgreduce webapp /dev/sdb
pvs
lvextend -L +2G /dev/webapp/webapp01
lvs /dev/webapp/webapp01
lvreduce -L -2G /dev/webapp/webapp01
lvs /dev/webapp/webapp01
扩展和缩减逻辑卷
扩展和缩减文件系统
扩展XFS文件系统
扩展EXT4文件系统
mkfs.xfs /dev/webapp/webapp01
mkdir /var/www/html
mount /dev/webapp/webapp01 /var/www/html/
cp /etc/ho* /var/www/html/
ls /var/www/html/
lvextend -rL 20G /dev/webapp/webapp01
lvs /dev/webapp/webapp01
df -h /var/www/html/
umount /var/www/html
mkfs.ext4 /dev/webapp/webapp01
mount /dev/webapp/webapp01 /var/www/html/
df -h /var/www/html/
lsblk
cp /etc/ho* /var/www/html/
ls /var/www/html/
lvextend -L 25G /dev/webapp/webapp01
lvs /dev/webapp/webapp01
resize2fs /dev/webapp/webapp01
df -h /var/www/html/
ls /var/www/html/
lvextend -rL 30G /dev/webapp/webapp01
lvs /dev/webapp/webapp01
缩减 EXT4 文件系统
缩减EXT4文件系统注意事项:
- 不支持在线缩减,必须卸载后缩减。
- 缩减后的容量,不能小于当前使用的容量。
ext4 减容流程:
- 卸载文件系统
- e2fsck 文件系统
- 缩减文件系统
- 缩减lv
- 挂载测试
具体操作如下:
# 第一步:卸载文件系统
[root@centos7 ~]# umount /var/www/html
# 第二步:检测文件系统
[root@centos7 ~]# e2fsck -f /dev/webapp/webapp01
e2fsck 1.42.9 (28-Dec-2013)
第一步: 检查inode,块,和大小
第二步: 检查目录结构
第3步: 检查目录连接性
Pass 4: Checking reference counts
第5步: 检查簇概要信息
/dev/webapp/webapp01:14/1966080 文件(0.0% 为非连续的), 167445/7864320 块
# 第三步:缩减文件系统
[root@centos7 ~]# resize2fs /dev/webapp/webapp01 10G
resize2fs 1.45.6 (20-Mar-2020)
将 /dev/webapp/webapp01 上的文件系统调整为 2621440 个块(每块 4k)。
/dev/webapp/webapp01 上的文件系统现在为 2621440 个块(每块 4k)。
# 第四步:缩减逻辑卷
[root@centos7 ~]# lvreduce -L 10G /dev/webapp/webapp01
WARNING: Reducing active logical volume to 10.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce webapp/webapp01? [y/n]: `y`
Size of logical volume webapp/webapp01 changed from 30.00 GiB (7680 extents) to 10.00 GiB (2560 extents).
Logical volume webapp/webapp01 successfully resized.
# 第五步:挂载文件系统验证
[root@centos7 ~]# mount /dev/webapp/webapp01 /var/www/html
[root@centos7 ~]# df -h /var/www/html
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/webapp-webapp01 9.7G 36K 9.3G 1% /var/www/html
[root@centos7 ~]# ls /var/www/html
host.conf hostname hosts lost+found
补充说明: 如果文件系统是构建在磁盘分区上,扩展文件系统容量和缩减文件系统容量操作相同。
逻辑卷快照
我们可以使用快照记录了lv中数据,后续可以用来恢复数据。
# 创建快照:快照的容量不能小于lv容量
[root@centos7 ~]# lvcreate -s -n webapp01-snap1 -L 10G /dev/webapp/webapp01
Logical volume "webapp01-snap1" created.
# 挂载快照
[root@centos7 ~]# mount /dev/webapp/webapp01-snap1 /webapp/webapp01/
# 查看数据
[root@centos7 ~]# ls /webapp/webapp01/
host.conf hostname hosts hosts.allow hosts.deny
# 创建新数据
[root@centos7 ~]# echo hello world > /webapp/webapp01/hello.txt
[root@centos7 ~]# cat /webapp/webapp01/hello.txt
hello world
raid 逻辑卷
准备环境
[root@centos7 ~]# umount /webapp/webapp0
[root@centos7 ~]# umount /var/www/html
[root@centos7 ~]# lvremove /dev/webapp/webapp01*
创建 raid1 逻辑卷
[root@centos7 ~]# lvcreate --type raid1 -n webapp01 -L 15G webapp
[root@centos7 ~]# mkfs.xfs /dev/webapp/webapp01
[root@centos7 ~]# mount /dev/webapp/webapp01 /var/www/html/
[root@centos7 ~]# cp /etc/ho* /var/www/html/
模拟故障
[root@centos7 ~]# dd if=/dev/zero of=/dev/sdd bs=1M count=256
此时文件系统仍可以正方访问
[root@centos7 ~]# ls /var/www/html/
host.conf hostname hosts hosts.allow hosts.deny
[root@centos7 ~]# umount /var/www/html
[root@centos7 ~]# mount /dev/webapp/webapp01 /var/www/html/
修复raid
# 删除丢失的物理卷
[root@centos7 ~]# vgreduce --removemissing webapp --force
# 扩容回来
[root@centos7 ~]# vgextend webapp /dev/sdd
# 修复raid1 逻辑卷
[root@centos7 ~]# lvconvert --repair /dev/webapp/webapp01
# 扫描物理卷变化
[root@centos7 ~]# pvscan
# 验证结果
[root@centos7 ~]# pvs|grep webap
/dev/sdb webapp lvm2 a-- <20.00g 4.99g
/dev/sdc webapp lvm2 a-- <20.00g 4.99g
/dev/sdd webapp lvm2 a-- <20.00g <20.00g
其他示例:创建 raid5 逻辑卷
# Create a RAID5 LV with a usable size of 5GiB, 3 stripes, a stripe size of 64KiB, using a total of 4 devices (including one for parity).
lvcreate --type raid5 -L 5G -i 3 -I 64 -n mylv vg00
容回来
[root@centos7 ~]# vgextend webapp /dev/sdd
修复raid1 逻辑卷
[root@centos7 ~]# lvconvert --repair /dev/webapp/webapp01
扫描物理卷变化
[root@centos7 ~]# pvscan
验证结果
[root@centos7 ~]# pvs|grep webap
/dev/sdb webapp lvm2 a-- <20.00g 4.99g
/dev/sdc webapp lvm2 a-- <20.00g 4.99g
/dev/sdd webapp lvm2 a-- <20.00g <20.00g
其他示例:创建 raid5 逻辑卷
```bash
# Create a RAID5 LV with a usable size of 5GiB, 3 stripes, a stripe size of 64KiB, using a total of 4 devices (including one for parity).
lvcreate --type raid5 -L 5G -i 3 -I 64 -n mylv vg00
更多推荐


所有评论(0)