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
     
     
  • 相关阅读:
    Unix命令大全
    vs2008 与 IE8出现的兼容性问题
    Java 创建文件、文件夹以及临时文件
    如何修改Wamp中mysql默认空密码
    PAT 乙级真题 1003.数素数
    Tags support in htmlText flash as3
    DelphiXE4 FireMonkey 试玩记录,开发IOS应用 还是移植
    10 Great iphone App Review sites to Promote your Apps!
    HTML tags in textfield
    Delphi XE4 IOS 开发, "No eligible applications were found“
  • 原文地址:https://www.cnblogs.com/liuzhiyun/p/11351031.html
Copyright © 2011-2022 走看看