zoukankan      html  css  js  c++  java
  • Linux software RAID

    RAID 0: (Disk Striping)

    通过使用RAID 0,RAID Controller可以试图将数据平均的分布到RAID set中去进行存储。比喻来说,可以将Disk比作是装食物的盘子,而将数据比喻成蛋糕,比方说现在你用四种口味的蛋糕,分别为巧克力,香草,樱桃和草莓 。RAID 0的初始化过程就像是将蛋糕切片,并且把切片分别发到不同的盘子当中去。而RAID 0的driver使得operating System感觉起来像是这个蛋糕完整无缺地,没有被分割地放在一个大的盘子当中去。 比如说,有四块9GB的硬盘被配置到RAID 0的RAID set中去,这时,操作系统就仅会感觉它只拥有一块36GB的硬盘。

    RAID 0的目标是在多个存储设备上容纳一个大的文件系统,同时提供data redundancy. RAID 0的优点是数据访问速度。一个文件被平均存储在4个disk上,则最快读取该文件的速度可以提高四倍(多块硬盘同时读取4个block并发不用等待I/O)

    RAID 0可以容纳多个容量不相同的disk。当RAID在最新的disk上用尽striping 空间后, 它会在其他盘的剩余空间上进行striping。 当这种情况发生后,在这部分空间上进行数据访问的速度会降低,因为可用的RAID drive总量变少了。 如现在又四块盘做成RAID 0, 大小分别为5GB 5GB 5GB 6GB。 第四块盘的最后一个G的空间被striping 后, 如果访问其上的数据,则仅有一个drive可用,而之前的5GB可以从4个DRIVE同时读取。

    RAID 1: (Disk Mirroring)

    RAID 1, 简单来说,数据除了会被写入到目标盘,还会被clone到另一个 disk。当在RAID set中的一块盘fail时, 另外一块盘还可以正常工作。当坏盘被替换或修复后,数据会自动从当前正常工作的盘复制到新替换的盘。所以,RAID 1 使得热备空闲盘成为可能,当primary disk 出现错误的时候,热备空闲盘会被自动使用来替换损坏的盘。

    RAID 1提供了数据冗余,但是失去了RAID 0速度优势。RAID 1的一个缺点是每次OS想RAID 1的磁盘写数据的时候,都需要写两次。当然这是software RAID才会使用这种策略, 当使用hardware RAID的时候,OS仅写一次到RAID controller,由硬件RAID controller来完成写操作到mirror disks。

    RAID 1的一个局限是他所能使用的disk总量是两个disk中最小的disk的磁盘容量。

    image

    RAID 4:

    RAID 4和RAID 0 类似, 此外,RAID 4 通过将错误校正和奇偶校验信息写入另外一块盘parity disk。 所以 要组成RAID 4至少需要三块盘。而且自多仅允许一块盘损坏。如果损坏盘被替换掉以后,其上存储的原来的数据可以在parity disk帮助下恢复出来。

    RAID 4结合了RAID 0的速度优势和RAID 1的数据冗余特点,但是,它最主要的缺点是它上存储的数据时striping的,但是parity 信息不被striping。所以,每次数据被写入RAID set的数据部分的时候,都需要更新parity disk上的数据,所以parity disk很容易成为瓶颈。正是因为这个原因,RAID 4 没有被广泛使用。

    RAID 5:

    RAID 5是为了克服RAID 4的缺点而出现的, 对于数据部分它同RAID 4使用striping存储,同时和RAID4 不一样的是对于parity部分,将和数据部分一起,进行striping存储。因此,RAID 5很好的将RAID 0 和RAID 1的优点结合起来。

    RAID 5 最少需要三个disk或partition

    image

    开始之前

    对于SCSI或IDE的hardware RAID,有专门的hardware-based RAID controller。一般来说RAID controller有自己的BIOS,你可以在你的系统完成POST(Power on self test)自后来多RAID controller进行配置。Hareware-based RAID 对于操作系统来说完全透明,硬件controller会完成所有的工作而不需要操作系统的干预。

    如果Hardware-based RAID controller 不可用,可以使用software RAID。

    IDE Drives

    为了节省成本,许多小公司的系统会使用IDE disk,但是这会有很多限制。

    1 IDE cable的长度很受限,仅有几英尺长。

    2 IDE 不支持热交换。也就是说,不可以在系统运行时对IDE设备进行替换。

    3 一个IDE controller只能支持两个设备

    4 IDE 总线的性能会随着新的设备的连入而变差

    5 IDE总线的一个设备的failure会使得另外一个连在同一总线的设备工作不正常。这将是致命的当一个RAID set的两个设备连在同一个cable上。

    因此,在使用RAID的时候,构成RAID set的disk来自不同的controller。

    Serial ATA Drives

    SATA正在替换IDE disk,对于IDE来说,它拥有许多优点:

    1 数据cable最长1米

    2 SATA拥有更好的错误检错功能

    3 每个cable仅有一个SATA设备相连,可以进行热交换,也就是在系统运行的时候进行替换SATA设备

    4 没有类似于IDE设备的master和slave之分,更容易配置

    5 IDE设备的最高速率为133MB/s 而SATA的是150MB/s,并且在未来有望达到600MB/s

    SCSI Drives

    SCSI hard disk 拥有更多优点,使得其对于IDE和SATA硬盘来说,更适合来实现RAID。

    1 SCSI controller具有更强的容错功能,总线上的一个设备出错很少会影响到其他连着SCSI接口总线上的设备

    2 SCSI cable最长可以达到25米,使得SCSI设备更适合数据中心应用

    3 Much more than two devices may be connected to a SCSI cable bus. It can accommodate 7 (single-ended SCSI) or 15 (all other SCSI types) devices.

    4 一些SCSI设备支持热交换。.

    5 SCSI 支持高达 640 Mbytes/s 的传输速率。.

    对于software RAID来说,是使用partition还是使用整个disk?

    通常来说,在一个disk上的模型parition上做RAID,在另外一些parition作为正常的分区使用不是个好主意。显而易见,这样的话如果一个disk failure会导致整个该磁盘上的整个系统不可用。

    如果你决定使用software RAID,一个disk上的所有parition都应该被划到RAID set当中,通常简单的做法是对用于software RAID的disk来说,只建立一个parition。

    Disk /dev/sdb: 10.7 GB, 10737254400 bytes
    255 heads, 63 sectors/track, 1305 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Disk identifier: 0x00072406

       Device Boot      Start         End      Blocks   Id  System
    /dev/sdb1               1        1305    10482381   fd  Linux raid autodetect

    Disk /dev/sdc: 21.4 GB, 21474508800 bytes
    255 heads, 63 sectors/track, 2610 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Disk identifier: 0x000053ad

       Device Boot      Start         End      Blocks   Id  System
    /dev/sdc1               1        2610    20964793+  fd  Linux raid autodetect

    注意,建立software RAID之前备份好你原有的数据

    Software RAID 会建立一个虚拟的disk, 这个disk是由物理上一个或多个disk或partion组成。建立好的RAID disk要被使用,就首先要被格式化。所以其上的原有数据将会被破坏。

    在single user mode 下配置Software RAID

    因为你将要修改你的disk结构,所以为了防止在你修改的同时,有人使用你需要创建software RAID disk而使用的物理disk或partition,所以要使你的系统处于single user mode 来杜绝此类情况的放生。

    init 1 # runleve set to 1

    配置software RAID

    准备好你将在哪些disk或parition上建立software RAID。这里假设在如下三个分区上建立一个RAID 5

    /dev/hde1
    /dev/hdf2
    /dev/hdg1
    

    注意到这三个partition来自不同的disk,分别是hde, hdf和hdg.

    如果你需要查看系统上所有的可用的filesystem,包括已经mount的和unmount的。使用fdisk –l和df –k 来查看详情.

    [root@bigboy tmp]# fdisk -l
    
    Disk /dev/hda: 12.0 GB, 12072517632 bytes
    255 heads, 63 sectors/track, 1467 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
       Device Boot    Start       End    Blocks   Id  System
    /dev/hda1   *         1        13    104391   83  Linux
    /dev/hda2            14       144   1052257+  83  Linux
    /dev/hda3           145       209    522112+  82  Linux swap
    /dev/hda4           210      1467  10104885    5  Extended
    /dev/hda5           210       655   3582463+  83  Linux
    ...
    ...
    /dev/hda15         1455      1467    104391   83  Linux
    [root@bigboy tmp]#
    
    [root@bigboy tmp]# df -k
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/hda2              1035692    163916    819164  17% /
    /dev/hda1               101086      8357     87510   9% /boot
    /dev/hda15              101086      4127     91740   5% /data1
    ...
    ...
    ...
    /dev/hda7              5336664    464228   4601344  10% /var
    [root@bigboy tmp]#

    你不希望其他人使用你将要建立software RAID的disk或partition,所以先将你要是有的/dev/hde1 /dev/hdf2 /dev/hdg1  unmount掉。

    接下来,使用fdisk来设置你要使用的partition:

    [root@bigboy tmp]# fdisk /dev/hde
    The number of cylinders for this disk is set to 8355. 
    There is nothing wrong with that, but this is larger than 1024,
    and could in certain setups cause problems with:
    1) software that runs at boot time (e.g., old versions of LILO)
    2) booting and partitioning software from other OSs
      (e.g., DOS FDISK, OS/2 FDISK)
    
    Command (m for help):
    输入m命令来获取帮助。
    /dev/hde1 是/dev/hde上的第一个parition,使用fdisk的t命令来指定partition number和设置type code。如果不知道对应得type code是L命令来获取帮助。
    Command (m for help): t
    Partition number (1-5): 1
    Hex code (type L to list codes): L
    
    
    ...
    ...
    ...
    16  Hidden FAT16    61   SpeedStor       f2  DOS secondary
    17  Hidden HPFS/NTF 63  GNU HURD or Sys fd  Linux raid auto
    18  AST SmartSleep  64  Novell Netware  fe  LANstep
    1b  Hidden Win95 FA 65  Novell Netware  ff  BBT
    Hex code (type L to list codes): fd
    Changed system type of partition 1 to fd (Linux raid autodetect)
    
    Command (m for help):
    为了确保你上面所做的改动已经被保存下来,是fdisk p命令来查看当前的partition table。
    Command (m for help): p
    
    Disk /dev/hde: 4311 MB, 4311982080 bytes
    16 heads, 63 sectors/track, 8355 cylinders
    Units = cylinders of 1008 * 512 = 516096 bytes
    
       Device Boot    Start       End    Blocks   Id  System
    /dev/hde1             1      4088   2060320+  fd  Linux raid autodetect
    /dev/hde2          4089      5713    819000   83  Linux
    /dev/hde4          6608      8355    880992    5  Extended
    /dev/hde5          6608      7500    450040+  83  Linux
    /dev/hde6          7501      8355    430888+  83  Linux
    
    Command (m for help):

    最后使用fdisk 的w命令将partition table 存储在硬盘上。对于剩下的disk或partition做同样的操作。接下来,开始准备RAID set:因为所以需要的partition都已经准备完毕,需要将它们合并到一个新的RAID partition当中去,然后我们会对新的RAID partition进行格式化并且执行mount操作。

    创建RAID Set

    使用mdadm命令。

    [root@bigboy tmp]# mdadm --create --verbose /dev/md0 --level=5 /
       --raid-devices=3 /dev/hde1 /dev/hdf2 /dev/hdg1

    其中 –create 是创建一个RAID set, --level=5是RAID 5 --raid-device是我们刚才准备要做RAID的三个partition。

    确认RAID是否被正确初始化

    raid set创建完成后,可以通过查看/proc/mdstat 来查看其状态。

    root@bigboy tmp]# cat /proc/mdstat
    Personalities : [raid5]
    read_ahead 1024 sectors
    md0 : active raid5 hdg1[2] hde1[1] hdf2[0]
          4120448 blocks level 5, 32k chunk, algorithm 3 [3/3] [UUU]
    
    unused devices: 

    格式化新的RAID Set

    mkfs.ext3在new RAID set上创建ext3 文件系统

    [root@bigboy tmp]# mkfs.ext3 /dev/md0
    mke2fs 1.39 (29-May-2006)
    Filesystem label=
    OS type: Linux
    Block size=1024 (log=0)
    Fragment size=1024 (log=0)
    36144 inodes, 144192 blocks
    7209 blocks (5.00%) reserved for the super user
    First data block=1
    Maximum filesystem blocks=67371008
    18 block groups
    8192 blocks per group, 8192 fragments per group
    2008 inodes per group
    Superblock backups stored on blocks: 
            8193, 24577, 40961, 57345, 73729
    
    Writing inode tables: done                            
    Creating journal (4096 blocks): done
    Writing superblocks and filesystem accounting information: done
    
    This filesystem will be automatically checked every 33 mounts or
    180 days, whichever comes first.  Use tune2fs -c or -i to override.

    创建mdadm.conf 配置文件

    系统不会记住构成你RAID set的所有组件,所以你需要将这些信息记录到mdadm.conf 文件中去。使用mdadm –detail –scan –verbose > /etc/mdadm.conf

    为新的RAID set创建一个挂载点

    mkdir /mnt/raid

    编辑/ect/fstab 开机自动挂载

    /dev/md0      /mnt/raid     ext3    defaults    1 2

    mount RAID set

    mount –a or mount /dev/md0 /mnt/raid

    检查NEW RAID的状态:

    /proc/mdstat

  • 相关阅读:
    品尝阿里云容器服务:负载均衡与容器的关系
    基于微服务架构、运行于容器中的.NET Core示例应用eShopOnContainers
    基于VS2017的Docker Support体检ASP.NET Core站点的Docker部署
    用工厂模式解决ASP.NET Core中依赖注入的一个烦恼
    终于知道什么情况下需要实现.NET Core中的IOptions接口
    ASP.NET Core Web API处理HttpResponseMessage类型返回值的问题
    ASP.NET Core奇遇记:无用户访问,CPU却一直100%
    省一行是一行:在if语句中使用C# 7.0的模式匹配
    ASP.NET Core 2.0 Preview 1 中贴心的新特性
    .NET Core类库项目中如何读取appsettings.json中的配置
  • 原文地址:https://www.cnblogs.com/yuboyue/p/2109863.html
Copyright © 2011-2022 走看看