RAID

       RAIDRedundantArrays of Inexpensive/Independant Disks 即磁盘阵列

       RAID可以通过一些技术将多个小的磁盘整合成为一个较大的磁盘设备;而这个较大的磁盘功能可不止是存储而已,它还具有数据保护的功能

       RAID的分类:

              硬件RAID:是通过磁盘阵列卡来完成数组的目的。磁盘阵列卡上面有一块专门的芯片在处理RAID的任务,因此在性能方面会比较好。在很多任务时磁盘阵列并不会重复消耗原本系统的I/O总线,理论上性能会较佳。

              软件RAID:主要是通过软件来仿真属组的任务,因此会损耗较多的系统资源,比如说CPU的运算与I/O总线的资源等。         

       整个RAID由于选择的level不同,而使得整合后的磁盘具有不同的功能,基本常见的等级有这几种。

        RAID-0(等量模式,stripe):性能最佳

              这种模式如果使用相同型号与容量的磁盘来组成时,效果较佳。这种模式的RAID会将磁盘先切出等量的区块(举例来说,4KB),然后当一个文件要写入RAID时,该文件会依据块的大小切割好,之后再依序存放到各个磁盘里面去。由于每个磁盘文件会交错存放数据,因此当你的数据要写入RAID时,数据会被等量放置在各个磁盘上面。举例来说,你有两块磁盘组成RAID-0,当你有100MB的数据要写入时,每个磁盘会各被分配到50MB的存储量。RAID-0的示意图如下图所示:

      

       上图的意思是,在组成RAID-0时,每块磁盘都会先被分隔成为小区块(chunk),当有数据要写入RAID时,数据会先被分成符合小区块的大小,然后再依序一个一个放置到不同的磁盘去。由于数据已经先被分并且依序放置到不同的磁盘上面,因此每块磁盘所负责的数据量都降低了。照这样的情况来看,越多块磁盘组成的RAID-0性能会越好,因为每块负责的数据量就更低了,这表示我的数据可以分散让多块磁盘来存储,当然性能会变得更好,此外,磁盘总容量也变大了,因为每块磁盘的容量最终会加成为RAID-0的总容量。

       使用此等级你必须自行负担数据损毁的风险,由上图我们知道文件是被切割成为适合每块磁盘分区区块的大小,然后再依序放置到各个磁盘中。这时,如果某一块磁盘损毁了,那么文件数据将缺一块,此时这个文件就损毁了。由于每个文件都是这样存放的,因此RAID-0只要任何一块磁盘损毁,在RAID上面的所有数据都会丢失而无法读取。

       RAID-1(映像模式,mirror):完整备份

              这种模式也是需要相同的磁盘容量的,最好一模一样的磁盘。如果是不同容量的磁盘组成RAID-1时,那么总容量将以最小的那一块磁盘为主,这种模式主要是让同一份数据完整保存在两块磁盘上面。举例来说,如果我有一个100MB的文件,且我仅有两块磁盘组成RAID-1时,那么这两块磁盘将会同步写入100MB到它们的存储空间去。因此,整体RAID的容量几乎少了50%。由于两块硬盘内容一模一样,好像镜子映照出来的一样,所以我们也称它为镜像模式。

              如下图所示,一份数据传送到RAID-1之后会被分成两份,并分别写入到各个磁盘里面去。由于同一份数据会被分别写入到其它不同磁盘,因此如果要写入100MB时,数据传送到I/O总线后会被复制多份到各个磁盘,结果就是感觉数据量变大了。因此在大量写入RAID-1的情况下,写入的性能可能会变得非常差。

             

       由于两块磁盘的数据一模一样,所以任何一块硬盘损毁时,你的数据还是可以完整保留下来。所以说,RAID-1最大的优点是数据的备份,不过由于磁盘容量有一半用在备份,因此总容量会是全部磁盘容量的一半。

       RAID 0+1RAID 1+0

       RAID-0的性能佳但是数据不安全,RAID-1的数据安全但是性能不佳,那么能不能将这两者整合起来呢,那就是RAID 0+1RAID 1+0。所谓的RAID 0+1就是先让两块磁盘组成RAID0,并且这样的设置共有两组;然后将这两组RAID 0再组成一组RAID 1。这就是RAID 0+1。反过来说,RAID1+0就是先组成RAID 1再组成RAID 0的意思。

       如下图所示,DiskA +Disk B组成第一组 RAID 0Disk C +Disk D组成第二组RAID 0,然后这两组再整合成为一组RAID1。如果我有100MB的数据要写入,则由于RAID1的关系,两组RAID 0都会写入100MB,但由于RAID 0的关系,因此每块磁盘仅会写入50MB而已。如此一来不论哪组RAID0的磁盘损毁,只要另外一组RAID 0还存在,那么就能够通过RAID1的机制来恢复数据。

      

       由于具有RAID 0的优点,所以性能得以提升,由于具有RAID 1的优点,所以数据得以备份。但是也由于RAID的缺点,所以总量会少一半用来作为备份。

       RAID 5

              RAID -5至少需要三块以上的磁盘才能够组成这种类型的磁盘阵列。这种磁盘阵列的数据写入有点类似RAID -0,不过每个循环的写入过程中,在每块磁盘还加入一个同位检查数据,这个数据会记录其它磁盘的备份数据,用于当有磁盘损毁时的救援。RAID-5读写的情况如下图所示:

             

              图中,每个循环写入时,都会有部分的同位检查码被记录起来,并且记录的同位检查码每次都记录在不同的磁盘,因此,任何一个磁盘损毁时都能够通过其它磁盘的检查码来重建原本磁盘内的数据。不过需要注意的是,由于有同位检查码,因此RAID-5的总容量会是整体磁盘数量减一块。以上图为例,原来的3块磁盘只会剩下2块磁盘的容量,而且当损毁的磁盘容量大于等于两块时,这整租RAID5的数据就损毁了,因为RAID5默认仅能支持一块磁盘的损毁情况。

              在读写性能上,与RAID-0有得比,不过写的性能就不见得能够增加很多。这是因为要写入RAID 5的数据还得要经过计算同位检查码的关系。由于加上这个计算的操作,所以写入的性能与系统的硬件关系较大。

              CentOS 6上的软件RAID实现:

                     结合内核中的md(multi devices)模块实现的

                     mdadm:模式化的工具

                            命令的语法格式:mdadm [mode] [options]

                                   支持的RAID级别:LINEARRAID0RAID1RAID4RAID5RAID6RAID10

                            模式:

                                   创建:-C

                                   装配:-A

                                   监控:-F

                                   管理      -f,-r,-a      

                            /dev/md#

                            :任意块设备

                            -C:创建模式

                                   -n:使用#个块设备来创建此RAID

                                   -l:指明要创建的RAID的级别

                                   -a{yes|no}是否自动创建目标RAID设备的设备文件

                                   -c CHUNK_SIZE:指明块大小

                                   -x #:指明空闲盘的个数;

                            -D:显示raid的详细信息

                            管理模式:

                                   -f:标记指定磁盘为损坏

                                   -a:添加磁盘

                                   -r:移除磁盘

                            观察md的状态:

                                   cat/proc/mdstat

                            停止md设备:

                                   mdadm -S/dev/md#

       mdadm -C /dev/md0 -a yes -n 3 -x 1 -l 5/dev/sdc{1,2,3,4} 创建一个raid 5

                     cat /proc/mdstat 查看当前系统上的raid状态

                     mdadm -D /dev/md0:查看做好的raid md0的详细信息

                     mdadm /dev/md0 -f /dev/sda8表示将raid md0中的sda8盘标记为错误盘

                     mdadm /dev/md0 -r /dev/sda7表示将raid md0中的sda7盘移除

                     mdadm /dev/md0 -a /dev/sda7表示将sda7盘加入到raid dev/md0中;

 

LVM2

       LVMlogicalVolume Manager Version2

       使用内核中的dm(devicemapper)模块,将一个或多个底层块设备组织成一个逻辑设备的模块;

              /dev/dm-#

       /dev/mapper/VG_NAME-LV_NAME

       /dev/mapper/vol0-root

       物理存储介质(Thephysical media):这里指系统的存储设备:硬盘,如:/dev/hda1/dev/sda等等,是存储系统最低层的存储单元。

       物理卷(physicalvolume):物理卷就是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM   相关的管理参数。

       卷组(VolumeGroup):LVM卷组类似于非LVM系统中的物理硬盘,其由物理卷组成。可以在卷组上创建一个或多个“LVM分区(逻辑卷),LVM卷组由一个或多个物理卷组成。

       逻辑卷(logicalvolume):LVM的逻辑卷类似于非LVM系统中的硬盘分区,在逻辑卷之上可以建立文件系统(比如/home或者/usr)

       PEphysicalextent):每一个物理卷被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB

       LElogicalextent):逻辑卷也被划分为被称为LE(Logical Extents) 的可被寻址的基本单位。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。

       简单来说就是:

       PV:是物理的磁盘分区

       VG:LVM中的物理的磁盘分区,也就是PV,必须加入VG,可以将VG理解为一个仓库或者是几个大的硬盘。

       LV:也就是从VG中划分的逻辑分区

       pv管理工具:

              pvs:简要pv显示信息

              pvdispaly:显示pv的详细信息

              pvcreate /dev/DIVICE:创建pv

              pvremove /dev/DEVICE:删除pv

       vg管理工具:

              vgs:显示简要vg信息

              vgdisplay:显示vg的详细信息

              vgcreate NAME /dev/DEVICE:创建vg

              vgextend NAME /dev/DEVICE:扩展vg

              vgreduce

       lv管理工具:

              lvs:查看简要lv信息

              lvdisplay

              lvcreate -L #[mMgGtT] -n NAMEVolumeGroup 注意,指定的大小必须在卷组vg中存在那么大的空间

       扩展逻辑卷:

              lvextend -L  [+]#[mMgGtT] /dev/VG_NAME/LV_NAME扩展之后需要执行以下命令扩展文件系统

              resize2fs /dev/VG_NAME/LV_NAME

       缩减逻辑卷步骤:

              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