RAID来源

RAID功用

RAID的实现:硬件、软件

RAID的级别

在CentOS 6上软件实现RAID



一、RAID来源

    1、防止重要数据因磁盘损坏而丢失,人为损坏不能恢复。RAID不能取代备份

    2、IO能力有限

    3、对廉价高IO能力的硬件设备的需求

        

  Berkerly在A case for Redundent Arrays of Inexpensive Disks 论文中说明了RAID。将多个IDE接口的磁盘按照特定的结构组织在一起,提高IO,提高耐用性。


控制器硬盘跟主板交互,通过主板上接的控制器和硬盘上的控制器,基于某种协议或工业标准,有相同的频率,电压....,才能实现通信。

    多块不同的硬盘有不同控制器,都要与主机通信,所以只需要一个中间层,能将所有硬盘控制器的协议统一成一个协议,进而与主板交互。主板通过此控制器就能完成与每个硬盘交互。


    生产出这样一个控制器的价格相当的不廉价。后来改名为 Redundant Arrays of Indepent Disks 独立冗余磁盘阵列


二、RAID功用

    将多个硬盘 按照特定的格式组织起来,当一块硬盘使用

        提升IO能力

        提升耐用性


三、RAID的实现


    1、硬件实现

        1)主板集成控制器

            特殊线缆直接连接主板的适配器

wKioL1mNkHDj6IxpAACKK1YKF9U921.png-wh_50

        2)主板不集成控制器

            特殊线缆连接适配卡

wKioL1mNkM7QSGDGAACLwP_TcOM400.png-wh_50

    

        3) RAID提升IO能力有限

  某些厂商给RAID设备提供了CPU,RAM(RAID的专用内存),IO,是一个独立的设备。数据来时,直接存入内存中,并告知主板,存储好了,性能多好。

   如果断电了,内存中数据,岂不跟跟异步IO一样?承诺给别人的事情,你没有做到。这个人的形象、能力、开锅......

   为了解决这个问题,为RAID提供外部电源,目的:在系统断电后,保证让内存中的数据同步到

   磁盘中,不至于丢失。下次开机后,又继续为电源充电。

    **********对于有内存的RAID设备,一定要检查有无供电功能******************

        wKioL1mNlUez2L6-AABxdM3nmw0148.png-wh_50

    2、软件实现

        Linux内核提供一个模块(md模块,Multi Devices),程序员为了软件实现raid,就必须调用此模块,RAID是一种通用的功能,所以就有程序员开发程序,能够调用内核中模块,完成RAID的软件实现。我们仅需要调用用户空间中mdadm工具即可。


四、RAID的级别


   常见的RAID设备:RAID0,RAID1,RAID5,RAID10,RAID50,JBOD


RAID0(条带卷,strip)

   将多块硬盘平行组织起来当作一块硬盘 实现IO并行的磁盘组织结构

  1、IO能力为1块磁盘的N倍,但有上限。磁盘块越多,能力不增反降

   写入时,对数据的切割时间

   读出时,对数据的合并时间

  2、没有冗余能力,随着块数增加,损坏的可能性为单块的N倍。

  3、可用空间为N * min(S1,S2,....),至少需要2个磁盘块

wKiom1mNmfuxq7GCAAA3Qa4qIG0336.png-wh_50


RAID1(镜像卷,mirror)

  1、有冗余能力,可以坏掉一个盘

  2、可用空间为 1*min (S1,S2)

  3、IO能力:读:分散性,性能上升。写:不分散,性能略微下降


wKioL1mNmvjg9Co_AAA6-84WrM0935.png-wh_50

RAID4

  校验盘:根据另外两个盘的值进行对位异或运算得出校验盘的块编号。

  硬盘坏掉:监控指示灯,API接口,控制器支持多个空闲盘,用于做热备。(不停机备份)

  优点:兼具RAID1,RAID0的特性

  缺点:单个磁盘做校验,无论读写均要使用校验盘,对单个盘的IO压力大,则出现性能瓶颈

  

  1、有冗余能力,可以坏掉一个盘

  2、可用空间为 (N - 1) * min (S1,S2,S3,...),至少3个盘

  3、如果坏掉一个盘,转换为降级模式工作。依然能够读写。


RAID5

 校验码循环放于不同的盘,默认为校验码为左对称,如图所示

  1、有冗余能力,可以坏掉一个盘

  2、可用空间为 (N - 1) * min (S1,S2,S3,...),至少3个盘

  3、如果坏掉一个盘,转换为降级模式工作。依然能够读写。

wKiom1mNuVCxsY5kAABfhq8f5WA954.png

RAID6

  两个盘做校验盘,循环校验,根据异或值做校验。

  1、有冗余能力,可以坏掉2个盘

  2、可用空间为 (N - 2) * min (S1,S2,S3,S4...),至少4个盘

  3、如果坏掉2个盘,转换为降级模式工作。依然能够读写。


RAID10

  先用2个盘做RAID1,再用多个RAID做RAID0

  1、有冗余能力,每组只能坏一个盘

  2、可用空间为(N/2) * min(S1,S2,S3,S4,...)最少4个盘

  3、每组两个盘同时坏的可能性不大。

wKioL1mNvbmhtomLAAAixBM1RsI052.png

RAID01

  先用多个盘做RAID0,再用2个RAID做RAID1

  1、有冗余能力,两个组不能同时坏,只能坏一个组

  2、可用空间为(N/2) * min(S1,S2,S3,S4,...)最少4个盘

  3、每组都坏的可能性很大



 wKiom1mNvfSgDwEzAAAh_04DRiE828.png

RAID50

  先用至少3个盘做RAID5,再用多个RAID做RAID0

wKiom1mNvtPx4RdYAAAi9uitc4Y258.png

RAID7

   Optimized Asynchrony for High I/O Rates as well as high Data Transfer Rates(最优化的异步高I/O速率和高数据传输率)”RAID 7 存储计算机操作系统(Storage Computer Operating System )是一套实时事件驱动操作系统



JBOD

   将多块磁盘空间合并成一个大的连续的磁盘空间,存储数据时,先填满第一个,第二个,....

    例如,需要存储3T数据,有3个1T磁盘,基于JBOD方式组织磁盘。


五、在CentOS 6上软件实现RAID

   1、Raid在内核中实现

     模块 md

     用户空间管理工具 mdadm


   2、语法

mdadm [MODE] [RAID_DEVICE] [OPTIONS..] [componet-device]
MODE:
    -C 创建模式
      -n #    ## 创建由#指定个数磁盘块RAID
      -l #    ## 指定RAID级别
         RAID0、RAID1、RAID5、RAID6、RAID10
      -a {yes|no}      ## 是否自动创建目标设备的设备文件
      -c CHUNK_SIZE    ## 默认512K,指明块大小
      -x #             ## 空闲盘的个数,RAID0没有冗余能力不需要空闲盘。
   -A 装配模式
   -F 监控模式
   -f(标记为损坏),-r(remove),-a(add)管理模式

RAID_DEVICE:
   /dev/md# [0,]
   开机RAID设备名,可能发生变化,挂载用LABEL或UUID。
   
OPTIONS:
   -D RAID_DEVICE      ## 显示RAID设备的详细信息
   -S RAID_DEVICE      ## 停止RAID设备
   
componet-device: 
    -n # 和 -x # 所指定的所有磁盘块对应的设备文件名,支持命令行展开{f,b}_{d,c}
    分区(在同一个磁盘不同的分区(单个分区坏了整个磁盘坏了,没有磁盘的冗余。建议使用不同磁
    盘的不同分区))
    整个磁盘
    
cat /proc/mdstat       ## 观察md设备的状态
watch -n# 'COMMAND'    ## 由#指定的秒数进行每#秒运行一次COMMAND,实现动态观察命令的结果。
   # watch -n1 'cat /proc/mdstat'
   # watch -n1 'date'
   # watch -n1 'ifconfig'

  3、对选项的注释

1、完成分区,调整为fd
[root@localhost ~]# fdisk  /dev/sdb
显示分区表: p
添加/删除分区:n/d
  主分区p,扩展分区e
调整id号: t

n,1, ,+5G,t,1,fd
n,2, ,+5G,t,2,fd
n,3, ,+5G,t,3,fd
w
[root@localhost ~]# partx -a /dev/sdb
[root@localhost ~]# partx -a /dev/sdb

2、创建RAID:
[root@localhost ~]# mdadm -C /dev/md0 -a yes -l 5 -n 3 /dev/sdb{1,2,3}

3、查看状态
[root@localhost ~]# watch -n1 'cat /proc/mdstat'
    逐位对齐,异或运算

Personalities : [raid0] [raid6] [raid5] [raid4] 
md0 : active raid5 sdb3[3] sdb2[1] sdb1[0]
      10498048 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
      
unused devices: <none>

4、查看RAID状态 
[root@localhost ~]# mdadm -D /dev/md0
     Raid Level : raid5                           ## -l 对应的级别
     Array Size : 10498048 (10.01 GiB 10.75 GB)   ## 阵列大小
  Used Dev Size : 5249024 (5.01 GiB 5.38 GB)      ## 已用空间(校验盘的空间)
   Raid Devices : 3                               ## 创建时,-n # 指定RAID设备的个数
  Total Devices : 3                               ## 创建时,-n 和-x指定设备的个数

     Layout : left-symmetric                      ## 默认左对称
     Chunk Size : 512K                            ## 没有指定的默认大小为512K

[root@localhost ~]# 

5、创建ext3文件系统
[root@localhost ~]# mke2fs -j /dev/md0
mke2fs 1.41.12 (17-May-2010)
文件系统标签=
块大小=4096 (log=2)
131225 blocks (5.00%) reserved for the super user
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
[root@localhost ~]# 

6、查看设备属性信息
  [root@localhost ~]# blkid /dev/md0
/dev/md0: UUID="baf5e95b-fbb0-479a-9f69-97e890fdffbe" SEC_TYPE="ext2" TYPE="ext3" 

7、设定LABEL
[root@localhost ~]# tune2fs -L 'MY222' /dev/md0
[root@localhost ~]# e2label /dev/md0 ‘MY222'

8、查看LABEL
[root@localhost ~]# e2label /dev/md0
MY222
[root@localhost ~]# blkid /dev/md0
/dev/md0: UUID="baf5e95b-fbb0-479a-9f69-97e890fdffbe" SEC_TYPE="ext2" TYPE="ext3" LABEL="MY222" 

9、查看默认挂载属性
[root@localhost ~]# tune2fs -l /dev/md0
[root@localhost ~]# dumpe2fs -h /dev/md0
Default mount options:    (none)
Filesystem features:      has_journal 文件系统 为日志型文件系统

10、挂载文件系统至根文件系统下的某个空目录中,(如果有文件会被暂时隐藏)
1)创建目录
[root@localhost ~]# install -d -m 700 /mydata

2)查看目录是否存在
[root@localhost ~]# [ -d /mydata ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# find / -maxdepth 1 -type d -perm 700 -ls
 -maxdepth levels ## 查看指定路径下的由Levels指定级别的目录

3)挂载文件系统至目录
1)、按设备名挂载
[root@localhost ~]# mount /dev/md0 /mydata
[root@localhost ~]# mount | fgrep /mydata
/dev/md0 on /mydata type ext3 (rw)
 ## 按设备卸载: [root@localhost ~]# umount /dev/md0

 2)、按UUID挂载
[root@localhost ~]# blkid /dev/md0
[root@localhost ~]# mount -U "baf5e95b-fbb0-479a-9f69-97e890fdffbe" /mydata
[root@localhost ~]# mount | fgrep /mydata
/dev/md0 on /mydata type ext3 (rw)
 ## 按目录卸载[root@localhost ~]# umount /mydata

 3)、按LABEL挂载  
 # mount | fgrep /mydata
 
 4)改变为降级模式
[root@localhost ~]# install -m 640 /etc/fstab /mydata/not_exist  ## 目标文件不存在,复制重命名
[root@localhost ~]# ls -l /mydata/not_exist
-rw-r----- 1 root root 1093 8月  12 08:34 /mydata/not_exist

[root@localhost ~]# mdadm /dev/md0 -f /dev/sdb1
mdadm: set /dev/sdb1 faulty in /dev/md0

5)查看状态
[root@localhost ~]# mdadm -D /dev/md0
    Number   Major   Minor   RaidDevice State
       0       0        0        0      removed
       1       8       18        1      active sync   /dev/sdb2
       3       8       19        2      active sync   /dev/sdb3

       0       8       17        -      faulty   /dev/sdb1  ## 设备标记为失败

6)测试降级模式是否能查看文件内容
[root@localhost ~]# cat /mydata/not_exist 

#
# /etc/fstab
# Created by anaconda on Thu Aug  3 08:30:25 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/myvg-lv_root /                       ext4    defaults        1 1
UUID=5009dc18-28f5-4b32-8c7c-0ea1328ea224 /boot                   ext4    defaults        1 2

7)拆除坏的设备
[root@localhost ~]# mdadm /dev/md0 -r /dev/sdb1
mdadm: hot removed /dev/sdb1 from /dev/md0

8)换新设备,设备id: fd
[root@localhost ~]# mdadm /dev/md0 -a /dev/sdb1

9)观察状态
1)、恢复模式
[root@localhost ~]# watch -n1 'cat /proc/mdstat'
[root@localhost ~]# mdadm -D /dev/md0
 State :   clean, degraded, recovering  # 降级和恢复模式
 Active Devices : 2           ## 活动设备2
Working Devices : 3           ## 工作设备3
 Failed Devices : 0
  Spare Devices : 1

 Rebuild Status : 34% complete         ##  恢复34%
       4       8       17        0      spare rebuilding   /dev/sdb1  ## 根据异或运算,对位重建/dev/sdb1
       1       8       18        1      active sync   /dev/sdb2
       3       8       19        2      active sync   /dev/sdb3

2)、恢复完毕   
[root@localhost ~]# mdadm -D /dev/md0
          State : clean 
 Active Devices : 3
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 512K
    Number   Major   Minor   RaidDevice State
       4       8       17        0      active sync   /dev/sdb1
       1       8       18        1      active sync   /dev/sdb2
       3       8       19        2      active sync   /dev/sdb3
       
10)卸载
[root@localhost ~]# umount /mydata

11)停止设备
[root@localhost ~]# mdadm -S /dev/md0
mdadm: stopped /dev/md0