一、软件磁盘阵列
磁盘阵列(RAID)是通过硬件或软件技术将多个较小的磁盘整合成为一个较大的磁盘设备,而这个较大的磁盘除了存储还具备数据保护功能。
RAID分不同的级别,不同级别具有不同功能:
-
1、RAID 0:性能最佳
这种模式的RAID会将磁盘先切出等量的数据块chunk,当一个文件要写入时,该文件会根据chunk的大小切割好,之后再依序放到各个磁盘里去,数据会被等量的放到各个磁盘上,每块磁盘负责的数据量都降低了,因此性能会好。
但是RAID 0只要有任何一块磁盘损坏,在RAID上面的所有数据都会遗失而无法读取。
-
2、RAID 1:完整备份
这种模式主要是让同一份数据完整地保存在两块磁盘上面。由于数据写入时存在复制行为,所以RAID 1的写入性能不佳,但读取性能还可以。
RAID 1最大的优点就是数据备份,但磁盘容量有一半用作备份,因此总容量会是全部磁盘容量的一半。
-
3、RAID 5:性能与数据的均衡考虑
该磁盘阵列类型需要三块以上的硬盘,这种磁盘阵列的写入类似于RAID 0,这不过每次数据写入,都会有奇偶校验值被记录下来,并且每次记录在不同的磁盘。由于需要存储奇偶校验值,因此RAID 5的总容量时整体磁盘数量减一块。而当损坏的磁盘数量大于等于两块时,RAID 5是无法恢复数据的,它只能支持一块磁盘损坏的情况。
-
4、RAID 1+0/0+1 与RAID 6
RAID 1+0/0+1 是RAID 1与RAID 0结合的产物,例如RAID 1+0 是宏观方案使用RAID 1,存储两份相同数据,而微观上,每份数据的存储方案都采用RAID 0,即分多块磁盘分散存储数据。RAID 6是最新的磁盘阵列模式,它是RAID 5 的进一步发展,使用两块磁盘存储奇偶校验值,那么允许出错的磁盘数量也达到了两块。
当磁盘阵列的磁盘损坏时,就需要将坏掉的磁盘拔除,然后换一块新的磁盘。换成新磁盘并且顺利启动磁盘阵列后,磁盘阵列就会开始主动重建(rebuild)原本坏掉的那块磁盘数据到新的磁盘上,然后磁盘阵列上面的数据就恢复了,这就是磁盘阵列的优点。不过,我们还是得要动手拔插硬盘,除非系统支持热插拔,否则通常得要关机才能这么做。
为了让系统可以实时地在坏掉硬盘时主动地重建,就需要热备份磁盘(spare disk)的辅助。所谓的热备份磁盘就是一块或多块没有包含在原本磁盘阵列级别中的磁盘,这块磁盘平时并不会被磁盘阵列所使用,当磁盘阵列有任何磁盘损坏时,这块热备份磁盘就会被主动拉进磁盘阵列中,并将坏掉的那块硬盘移出磁盘阵列,然后立即重建数据系统,如此你的系统就可以永保安康。
硬件磁盘阵列是通过磁盘阵列卡来完成磁盘阵列的功能,但是磁盘阵列卡一般较为昂贵,低端主板上集成的磁盘阵列卡通常仅支持RAID 0和RAID 1,因此就发展出软件模拟磁盘阵列的功能。硬件磁盘阵列向上透明。因此硬件磁盘阵列的设备文件名为/dev/sd[a~p]
,由于软件磁盘阵列是系统模拟的,因此使用的设备文件名是系统的设备文件,文件名为/dev/md[0~128]
。
二、LVM
为了实现磁盘分区的动态扩容或缩小,引入了LVM。LVM的全名是Logical Volume Manager,中文翻译为逻辑卷管理器。
- 物理卷(Physical Volume,PV)
我们实际的分区(或Disk)需要调整系统标识符(system ID)成为 LVM的标识符,然后再经过 pvcreate 的命令将它转成 LVM 最底层的物理卷(PV),之后才能够将这些PV加以利用。调整 system ID 的方式就是通过gdisk。
- 卷组(Volume Group,VG)
所谓的LVM大磁盘就是将许多PV整合成这个VG,所以VG就是LVM组合起来的大磁盘。那么这个大磁盘最大可以到多少容量呢?在64位的Linux系统上面,LV几乎没有啥容量限制。
- 物理扩展块(Physical Extent,PE)
LVM 默认使用4MB的PE数据块,它是整个LVM最小的存储数据单位,也就是说,其实我们的文件数据都是借由写入PE 来完成的。简单地说,这个PE 就有点像文件系统里面的block大小。LVM可以弹性修改文件系统容量就是通过交换PE来进行数据转换。
- 逻辑卷(Logical Volume,LV)
最终的VG还会被切成LV,这个LV就是最后可以被格式化使用的类似分区的东西了。那么LV是否可以随意指定大小呢?当然不可以。既然PE 是整个LVM的最小存储单位,那么LV的大小就是PE的整数倍。为了方便用户利用LVM来管理VG,LV的设备文件名通常为【/dev/gname/vname】的样式。
建立PV:
pvcreate #将物理分区建立成pv
pvscan #查找目前系统内的pv
pvdisplay #显示某一pv的具体状态
pvremove #删除pv
建立VG:
vgcreate [-s N[mgt]] VG名称 PV名称 #建立VG
# -s后面接PE的大小,单位可以是m、g、t
vgscan #查找系统中所有VG
vgdispaly #显示某一VG的具体状态
vgextend #在VG内增加额外的PV
vgchange #设置VG是否启动
vgremove #删除一个VG
创建LV:
lvcreate [-L N[mgt]] -n LV名称 VG名称 #建立LV
#-L后面接容量,容量单位可以是M、G、T,但是容量需要为PE的整数倍
lvscan #查询所有的LV
lvdisplay #显示某一lv的状态
lvextend #增加容量
lvreduce #减少容量
lvremove #删除一个LV
lvresize [-L +/-N[mgt]] LV名称 #调整LV容量,增加用+号,减少用-号