Linux RAID 简介

简介

RAID早先的意思是廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks),本意为使用多块硬件中较为廉价且效能增长较慢的磁盘组成阵列,用来提升计算机性能,同时实现容错、逻辑数据备份的功能。但后来发现,大量便宜磁盘组合并不能适用于现实的生产环境,而该技术得到了越来越广泛的应用后,各种生产环境的实现方案并不便宜。所以后来 Inexpensive 被改为 Independent,意为独立磁盘冗余阵列(Redundant Array of Independent Drives)。

目的

  • 提高 IO 能力:磁盘并行读写;
  • 提高耐用性:磁盘冗余来实现。

RAID级别

RAID 的级别并不是说等级越高越好,而是表示多块磁盘组织在一起工作的不同方式。

RAID 级别的实现方式主要有以下三种:

  1. 外接式磁盘阵列:通过扩展卡提供适配能力。(生产环境主要实现方式。)
  2. 内接式 RAID:主板集成RAID控制器。(BIOS。)
  3. 软件实现 RAID:通过系统自带模块或软件方式实现。(现网环境不推荐使用。)

由于 RAID 的级别众多,下面只介绍几个常用的 RAID 级别。

RAID-0:条带卷

至少两块磁盘组成,将数据切割后,分别存入两个磁盘,读取时再从两个磁盘同时读取,提高了整体 IO 性能。

容量计算为:硬盘容量*硬盘个数。

优点:

  1. 读写新能提升。

缺点:

  1. 无容错能力。

磁盘容错:0。

RAID-1:镜像卷

至少两块硬盘组成,将数据分别存入两个磁盘,读取时分别从两个磁盘读取,提高了容错能力。

容量计算为:最小硬盘容量。

优点:

  1. 读取性能提升;
  2. 良好的容错能力;
  3. 重建会更快。

缺点:

  1. 写入性能下降;
  2. 总容量减半;

磁盘容错:1。

RAID-4:奇偶校验

针对 RAID-0 的优化,至少三块硬盘组成,数据分别存入两块盘,第三块盘存校验码,以便进行数据恢复。

容量计算为:最小硬盘容量*(硬盘个数-1)。

优点:

  1. 读写性能提升;
  2. 有一定的容错能力。

缺点:

  1. 单块盘作为校验盘,访问压力较大,比较容易坏的同时,可能会影响性能。
  2. 目前不常用。

磁盘容错:1。

RAID-5:单磁盘分布式奇偶校验

针对 RAID-4 的提升,至少三块硬盘组成,三块硬盘轮流当校验盘,减轻了校验盘的压力。

容量计算为:最小硬盘容量*(硬盘个数-1)。

优点:

  1. 读写性能提升;
  2. 容错能力提升。

缺点:

  1. 暂未发现。

磁盘容错:1。

RAID-6:双磁盘分布式奇偶校验

至少由四块硬盘组成,相对于 RAID-5,增加1个磁盘作校验盘,大大提高了容错能力。

容量计算为:最小硬盘容量*(硬盘个数-2)。

优点:

  1. 读写性能提升;
  2. 容错能力提升。

缺点:

  1. 暂未发现。

磁盘容错:2。

RAID-10:镜像+条带

混合型用法,至少四块硬盘,先把硬盘两两 RAID-1,然后再整体 RAID-0

容量计算为:Raid-1 容量++。

优点:

  1. 读写性能提升;
  2. 有一定的容错能力。

缺点:

  1. RAID-1 中的两块磁盘同时坏掉,整个组合将不可用。

磁盘容错:最小容错1,最大容错视 Raid-1 的个数而定。

RAID-01: 条带+镜像

混合型用法,至少四块硬盘,先把硬盘两两 RAID-0,然后再整体 RAID-1

容量计算为:最小容量的 Raid-0。

优点:

  1. 读写性能提升;
  2. 有一定的容错能力。

缺点:

  1. 任意一块磁盘坏点,都将导致 RAID-0 不可用,只剩下其他组的硬盘在运行,可靠性较低。
  2. RAID-1 下的 RAID-0 中各有一块磁盘坏掉,整合组合将不可用。

磁盘容错:1-2。

RAID-50:单磁盘分布式奇偶校验+条带

至少六块硬盘,先把每三块硬盘组成 RAID-5,再结合成 RAID-0,相当于在 RAID-5 的基础上再次提升了性能。

容量计算为:Raid-5 容量++。

优点:

  1. 读写性能提升;
  2. 容错能力更佳。

缺点:

  1. 容量利用率稍低。

磁盘容错:最小容错1,最大容错视 Raid-5 个数而定。

RAID-60:双磁盘分布式奇偶校验+条带

至少八块硬盘,和 RAID-50 相似,容错能力进一步提升,但容量利用率也进一步降低。

JBOD

不是标准的 RAID 级别,但也属于磁盘阵列的一种。

JBOD 把各磁盘进行串联,虚拟成一个大容量的磁盘,读写能力由各磁盘分别决定。

容量计算为:磁盘容量++

优点:

  1. 将小容量磁盘结合成大容量磁盘,适用于某些特殊情景。

缺点:

  1. 无容错能力。

磁盘容错:0。

实现方式

软件实现 RAID

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

实现工具:mdadm

命令语法格式:

mdadm [mode]  [options] (设备分区模式必须为「fd  Linux raid」)`。

:分配的设备文件名。
:磁盘分区。

支持的 RAID 级别:LINEAR(类似JBOD)RAID-0RAID-1RAID-4RAID-5RAID-6RAID10

模式(mode):

  • 创建:-C
  • 装配:-A(扫描磁盘原有的RAID模式,并重新合并成RAID使用);
  • 监控:-F
  • 管理:-f, -r, -a

-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 

更多信息请参考man mdadm

示例:创建一个5G的 RAID-1,并指定一块空闲硬盘容灾。

这里使用的是三块磁盘进行测试。

给三块磁盘分别进行分区(设备分区模式必须为「fd Linux raid」)。

[hzz@magedu ~]$ sudo fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0x4b641fab 创建新的 DOS 磁盘标签。

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.

命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p):
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-10485759,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-10485759,默认为 10485759):
将使用默认值 10485759
分区 1 已设置为 Linux 类型,大小设为 5 GiB

命令(输入 m 获取帮助):t
已选择分区 1
Hex 代码(输入 L 列出所有代码):fd
已将分区“Linux”的类型更改为“Linux raid autodetect”

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
[hzz@magedu ~]$ sudo fdisk /dev/sdc
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0x252be28b 创建新的 DOS 磁盘标签。

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.

命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p):
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-10485759,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-10485759,默认为 10485759):
将使用默认值 10485759
分区 1 已设置为 Linux 类型,大小设为 5 GiB

命令(输入 m 获取帮助):t
已选择分区 1
Hex 代码(输入 L 列出所有代码):fd
已将分区“Linux”的类型更改为“Linux raid autodetect”

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
[hzz@magedu ~]$ sudo fdisk /dev/sdd
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0xc69b9099 创建新的 DOS 磁盘标签。

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.

命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p):
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-10485759,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-10485759,默认为 10485759):
将使用默认值 10485759
分区 1 已设置为 Linux 类型,大小设为 5 GiB

命令(输入 m 获取帮助):t
已选择分区 1
Hex 代码(输入 L 列出所有代码):fd
已将分区“Linux”的类型更改为“Linux raid autodetect”

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
[hzz@magedu ~]$

创建RAID-1,并指定一块空闲硬盘容灾。

[hzz@magedu ~]$ sudo mdadm -C /dev/md0 -l 1 -n 2 -x 1 /dev/sd[bcd]1
mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[hzz@magedu ~]$ cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdd1[2](S) sdc1[1] sdb1[0]
      5237760 blocks super 1.2 [2/2] [UU]

unused devices: 
[hzz@magedu ~]$ sudo mdadm -D /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Wed Apr 19 21:33:56 2017
     Raid Level : raid1
     Array Size : 5237760 (5.00 GiB 5.36 GB)
  Used Dev Size : 5237760 (5.00 GiB 5.36 GB)
   Raid Devices : 2
  Total Devices : 3
    Persistence : Superblock is persistent

    Update Time : Wed Apr 19 21:43:46 2017
          State : clean
 Active Devices : 2
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 1

           Name : magedu:0  (local to host magedu)
           UUID : edd36aaa:07f77b23:98d9bcf6:88a1db83
         Events : 21

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1

       2       8       49        -      spare   /dev/sdd1
[hzz@magedu ~]$

可以看到 RAID-1 创建成功了,sdc1sdb1 组成 RAID-1sdd1 作为空闲磁盘备用。

使用 mdadm /dev/md0 -r /dev/sdd1mdadm /dev/md0 -a /dev/sdd1 可以移除或添加磁盘。

下面要做的,就是格式化并挂载分区了。

[hzz@magedu ~]$ sudo mkfs.xfs /dev/md0
meta-data=/dev/md0               isize=512    agcount=4, agsize=327360 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=1309440, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[hzz@magedu ~]$ mkdir -p /tmp/myRaidTest
[hzz@magedu ~]$ sudo mount /dev/md0 /tmp/myRaidTest
[hzz@magedu ~]$ cat /proc/mounts |grep myRaid
/dev/md0 /tmp/myRaidTest xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0
[hzz@magedu ~]$

删除软RAID

软 RAID 创建后,如果不按顺序删除卸载,则磁盘在以后的使用中可能会遇到各种问题,下面说说怎么卸载软 RAID。

使磁盘实效并卸载:

mdadm/dev/md0 --fail /dev/sdb --remove /dev/sdb
mdadm/dev/md0 --fail /dev/sdc --remove /dev/sdc
mdadm/dev/md0 --fail /dev/sdc --remove /dev/sdd

停止并删除 RAID:

mdadm --stop /dev/md0
mdadm --remove /dev/md0

清空超级块信息:

mdadm --misc --zero-superblock /dev/sdb
mdadm --misc --zero-superblock /dev/sdc
mdadm --misc --zero-superblock /dev/sdd

清除其他配置:

rm -f /etc/mdadm.conf
rm -f /etc/raidtab

了解更多:RAID技术的发展及应用

消息盒子

# 暂无消息 #

只显示最新10条未读和已读信息