zoukankan      html  css  js  c++  java
  • 十二、 RAID

     https://blog.51cto.com/sonlich

     http://note.youdao.com/noteshare?id=17083150f38dd19343f82ea6cc0e0e62&sub=3378C27029BD400E909110E76C2667E5

    https://blog.51cto.com/sonlich/1955665

    一、raid概念

    独立硬盘冗余阵列(RAID, Redundant Array of Independent Disks),旧称廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks),简称磁盘阵列。其基本思想就是把多个相对便宜的硬盘组合起来,成为一个硬盘阵列组,使性能达到甚至超过一个价格昂贵、容量巨大的硬盘。根据选择的版本不同,RAID比单颗硬盘有以下一个或多个方面的好处:增强数据集成度,增强容错功能,增加处理量或容量。另外,磁盘阵列对于计算机来说,看起来就像一个单独的硬盘或逻辑存储单元。分为RAID-0,RAID-1,RAID-5,RAID-6,RAID-7,RAID-01,RAID-10,RAID-50,RAID-60。

    其中,RAID0、RAID1、RAID5、RAID10和RAID01是五种最常见的方案。

    RAID功用

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

            提升IO能力 :磁盘并行读写

            提升耐用性:磁盘冗余来实现

    RAID实现的方式:

      外界式磁盘阵列: 通过扩展卡提供适配能力

      内接式RAID:主板集成RAID控制器

      Software RAID

    二、raid的几种常用方案

    2.1 raid0  (重点)

    RAID 0亦称为条带卷(striping)。它将两个以上的磁盘并联起来,成为一个大容量的磁盘。在存放数据时,分段后分散存储在这些磁盘中,因为读写时都可以并行处理,所以在所有的级别中,RAID 0的速度是最快的。但是RAID 0既没有冗余功能,也不具备容错能力,如果一个磁盘(物理)损坏,所有数据都会丢失。

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

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

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

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

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

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

    如图所示:
    raid0

    2.2 raid1--mirror (重点)

    RAID0技术虽然提高了存储设备的IO读写速度,但RAID0中数据是被分开存放的,也就是说其中任何一块硬盘出现问题都会破坏数据完整性。因此追求数据安全性的时候就不应该使用RAID0,而是使用RAID1。

    raid1 是将两组以上的N个磁盘相互作镜像,在一些多线程操作系统中能有很好的读取速度,理论上读取速度等于硬盘数量的倍数,与RAID 0相同。另外写入速度有微小的降低。只要一个磁盘正常即可维持运作,可靠性最高。其原理为在主硬盘上存放数据的同时也在镜像硬盘上写一样的数据。当主硬盘(物理)损坏时,镜像硬盘则代替主硬盘的工作。因为有镜像硬盘做数据备份,所以RAID 1的数据安全性在所有的RAID级别上来说是最好的。

    但是raid1方案的磁盘利用率理论上只有50%,是所有raid方案中磁盘利用率最低的一个。

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

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

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

    如图所示
    raid1

     

    2.3、RAID4(了解)

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

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

      优点:兼具RAID1,RAID0的特性

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

      

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

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

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

     

    2.4 raid5

    RAID 5是一种储存性能、数据安全和存储成本兼顾的存储解决方案。

    RAID 5至少需要三个硬盘,RAID 5不是对存储的数据进行备份,而是把数据和相对应的奇偶校验信息存储到组成RAID5的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上。当RAID5的一个磁盘数据发生损坏后,可以利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。

     

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

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

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

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

    raid5

    2.5 raid 6(了解)

    与RAID 5相比,RAID 6增加第二个独立的奇偶校验信息块。两个独立的奇偶系统使用不同的算法,数据的可靠性非常高,任意两块磁盘同时失效时不会影响数据完整性。

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

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

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

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

    raid6

    2.6 raid 10(重点)

    RAID10是对RAID1+RAID0的一个"组合体"。

    RAID10的最大好处就是对数据价值进行了保障。

     

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

      1、有冗余能力,每组镜像最多只能坏一个盘

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

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

    raid10

    如图所示,raid10是先对磁盘进行raid1分组,形成镜像,保障数据安全,再对已经分好组的raid1 进行raid0方案的组合,提升磁盘读写性能

    2.7 raid 01(了解)

    raid01与raid10相反,是将磁盘先进行raid0的方案组合,再进行raid1组合。

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

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

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

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

    raid01

    如果RAID0组中的一块磁盘坏了,对于这一个RAID0组来说,它已经失效了,并不是还可以从该组中的另一块磁盘中读取一半数据。

    也就是说,RAID01只要坏了一块盘后,该RAID0组就失效,IO的压力就只在另一个RAID0组上,这很容易导致这一个raid0组也损坏磁盘,只要这时再坏一块盘,所有数据就丢失了。

    所以RAID01基本无人使用,太不安全。

    2.8 raid 50(了解)

    多块磁盘先实现RAID5,再组合成RAID0
    raid50

    由于RAID 50是以RAID 5为基础,而RAID 5至少需要3颗硬盘,因此要以多组RAID 5构成RAID 50,至少需要6颗硬盘。

    2.9、RAID7(昂贵)

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

     2.10、 JBOD(Just a Bunch of Disks)

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

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

    补充链接raid数据安全

    三、软件raid的实现(生产环境不常用)

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

    RAID设备可命名为/dev/md0、/dev/md1、/dev/md2、/dev/md3等

    3.1 mdadm命令

    mdadm - manage MD devices aka Linux Software RAID

    mdadm [mode]  <raiddevice> [options]  <component-devices>
    
    【创建模式】
    -C:创建(create a new array)
      -l #:指定要创建的raid级别(Set RAID level,0,1,5,10)
      -c:指定chunk大小(Specify chunk size of kibibytes,default 512KB)
      -a:检测设备名称(--auto=yes),yes表示自动创建设备文件/dev/mdN
      -n #: 使用#个块设备来创建此RAID(--raid-devices:Specify the number of active devices in the array)
      -x #:空闲盘的个数,RAID0没有冗余能力不需要空闲盘
    指定备用设备数量(--spare-devices:Specify the number of spare (eXtra) devices in the initial array)
    
    -v:显示过程 -f:强制行为 -r:移除设备(remove listed devices) -S:停止阵列(--stop:deactivate array, releasing all resources) -A:装配阵列,将停止状态的阵列重新启动起来 【监控模式】 -Q:查看摘要信息(query) -D:查看详细信息(Print details of one or more md devices) mdadm -D --scan >/etc/mdadm.conf,以后可以直接mdadm -A进行装配这些阵列 【管理模式】 mdadm --manage /dev/md[0-9] [--add 设备名] [--remove 设备名] [--fail 设备名] --manage :mdadm使用manage模式,此模式下可以做--add/--remove/--fail/--replace动作 -a (-add ) :将后面列出的设备加入到这个md -r (--remove) :将后面列出的设备从md中移除,相当于硬件raid的拔出动作 -f (--fail) :将后面列出的设备设定为错误状态,即人为损坏,损坏后该设备放在raid中已经是无意义状态的

    3.2 实现raid10

    3.2.1 创建分区

    首先需在虚拟机中创建4块磁盘设备,如果是以分区做实验,在用fdisk分区时注意要将分区表示符改为raid即fd模式

    fdisk /dev/sdb    # 在sdb这块磁盘上划分2G分区实验raid
    Welcome to fdisk (util-linux 2.23.2).
    
    Changes will remain in memory only, until you decide to write them.
    Be careful before using the write command.
    
    
    Command (m for help): n
    Partition type:
       p   primary (0 primary, 0 extended, 4 free)
       e   extended
    Select (default p): 
    Using default response p
    Partition number (1-4, default 1): 
    First sector (2048-41943039, default 2048): 
    Using default value 2048
    Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +2G
    Partition 1 of type Linux and of size 2 GiB is set
    
    Command (m for help): t
    Selected partition 1
    Hex code (type L to list all codes): fd
    Changed type of partition 'Linux' to 'Linux raid autodetect'
    
    Command (m for help): p
    
    Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x1d3bcd2a
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sdb1            2048     4196351     2097152   fd  Linux raid autodetect
    
    Command (m for help): w
    The partition table has been altered!
    
    Calling ioctl() to re-read partition table.
    Syncing disks.
    
    
    # 同理,sdc、sdd、sde也同样操作,因为我们前边学过文件系统和mbr分区,所以我们直接利用dd命令将sdb磁盘上的前512字节直接复制进入其他三块磁盘的头部即可。
    dd if=/dev/sdb  of=/dev/sdc bs=1 count=512
    dd if=/dev/sdb  of=/dev/sdd bs=1 count=512
    dd if=/dev/sdb  of=/dev/sde bs=1 count=512
    # 这样一共四块磁盘,每块磁盘都划出2G的分区。
    
    
    lsblk
    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda      8:0    0  200G  0 disk 
    ├─sda1   8:1    0    1G  0 part /boot
    ├─sda2   8:2    0   50G  0 part /
    ├─sda3   8:3    0   30G  0 part /data
    ├─sda4   8:4    0    1K  0 part 
    └─sda5   8:5    0    4G  0 part [SWAP]
    sdb      8:16   0   20G  0 disk 
    └─sdb1   8:17   0    2G  0 part 
    sdc      8:32   0   40G  0 disk 
    └─sdc1   8:33   0    2G  0 part 
    sdd      8:48   0   60G  0 disk 
    └─sdd1   8:49   0    2G  0 part 
    sde      8:64   0   80G  0 disk 
    └─sde1   8:65   0    2G  0 part 
    sr0     11:0    1  8.8G  0 rom  /run/media/root/CentOS 7 x86_64

    3.2.2 使用mdadm创建raid10

    mdadm  -C  /dev/md0  -n 4  -l 10  -a yes  /dev/sd{b,c,d,e}1    # -C 表示创建md0的raid阵列卡;-n 4 表示由四块磁盘组成;-l 10表示组成raid10方案;-a yes 表示自动创建设备文件;最后再加上4块设备。
    
    
    mdadm -C /dev/md0 -n 4 -l 10 -a yes /dev/sd{b,c,d,e}1
    mdadm: /dev/sdb1 appears to contain an ext2fs file system
           size=10485760K  mtime=Tue Dec 18 17:17:11 2018
    mdadm: /dev/sdc1 appears to contain an ext2fs file system
           size=5242880K  mtime=Thu Jan  1 08:00:00 1970
    Continue creating array? y
    mdadm: Defaulting to version 1.2 metadata
    mdadm: array /dev/md0 started.   
    # /dev/md0 raid10创建完成

    查看/dev/md0 的信息:

    mdadm -D /dev/md0 
    /dev/md0:
               Version : 1.2
         Creation Time : Wed Dec 19 16:26:49 2018
            Raid Level : raid10
            Array Size : 4188160 (3.99 GiB 4.29 GB)   # 总空间
         Used Dev Size : 2094080 (2045.00 MiB 2144.34 MB)  # 可用空间
          Raid Devices : 4   
         Total Devices : 4   
           Persistence : Superblock is persistent 
    
           Update Time : Wed Dec 19 16:27:09 2018
                 State : clean 
        Active Devices : 4
       Working Devices : 4
        Failed Devices : 0
         Spare Devices : 0
    
                Layout : near=2
            Chunk Size : 512K   # chunk可理解为block,大小可以通过-c选项设置
    
    Consistency Policy : resync
    
                  Name : CentOS7.songtai:0  (local to host CentOS7.songtai)
                  UUID : d73acb7a:969432a5:eb51cbdc:af034d4c
                Events : 17
    
        Number   Major   Minor   RaidDevice State
           0       8       17        0      active sync set-A   /dev/sdb1
           1       8       33        1      active sync set-B   /dev/sdc1
           2       8       49        2      active sync set-A   /dev/sdd1
           3       8       65        3      active sync set-B   /dev/sde1
    
    
    cat /proc/mdstat    # raid10 创建好后,存储于内存中的md信息
    Personalities : [raid10] 
    md0 : active raid10 sde1[3] sdd1[2] sdc1[1] sdb1[0]
          4188160 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]
          
    unused devices: <none>

    再通过lsblk -f 和 blkid查看设备号

    3.2.3 给md0创建文件系统

    mke2fs -t ext4 /dev/md0

    3.2.4 挂载md0

    mount /dev/md0  /data/md0mnt/df -hT
    Filesystem     Type      Size  Used Avail Use% Mounted on
    /dev/sda2      xfs        50G  4.0G   47G   8% /
    /dev/sda1      xfs      1014M  219M  796M  22% /boot
    /dev/sda3      xfs        30G   64M   30G   1% /data
    /dev/md0       ext4      3.9G   16M  3.7G   1% /data/md0mnt   
    
    # 如果要开机自动挂载md0,修改/etc/fstab 文件

    四、练习

    1:创建一个可用空间为1G的RAID1设备,文件系统为ext4,有一个空闲盘,开机可自动挂载至/backup目录
    2:创建由三块硬盘组成的可用空间为2G的RAID5设备,要求其chunk大小为256k,文件系统为ext4,开机可自动挂载至/mydata目录

     
    在CentOS 6上软件实现RAID5

    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{7,8,9} 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/sdb8 3 8 19 2 active sync /dev/sdb9 0 8 17 - faulty /dev/sdb7 ## 设备标记为失败 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
     
     
  • 相关阅读:
    page1
    CodeForces
    树、递归————二叉树的所有路径
    树(未完)
    树、递归、遍历————二叉搜索树的最近公共祖先
    树、递归————翻转二叉树
    树、递归————路径总和
    树、递归、广度优先搜索(BFS)————二叉树的最小深度
    树————平衡二叉树
    平衡二叉树AVL
  • 原文地址:https://www.cnblogs.com/liuzhiyun/p/11351031.html
Copyright © 2011-2022 走看看