RAID 学习及Linux软RAID实现

2018-01-03  本文已影响165人  chenzhong_

我写的不一定是正确的,但我是这么理解的(知识体量有限,错了望提醒)

RAID 是什么

基本思想就是把多个硬盘组合起来,成为一个硬盘阵列组,使性能达到甚至超过一个价格昂贵、容量巨大的硬盘

简单说就是把多个硬盘组成一个逻辑扇区来使用,在操作系统层面这就是一个硬盘,能够动态的完成硬盘的增大跟缩减通常有硬件RAID跟软件之分

RAID 的优势

硬件RAID

软件RAID

为什么要组建RAID

类型接口传输速率

以上都是理论速度,cpu跟内存的数据交互两都是按GB计算,硬盘的速度有时确实是服务器的瓶颈,不考虑现在的 USB3.1和雷电3接口,这个时候就需要组建RAID了

RAID 的级别

RAID 0 (条带)

基本原理
raid0.png

如上图,有disk0,1两块磁盘,在组建RAID 0 之后,RAID 控制器将一个文件一分为多分,比如1G 大小的文件,分成30MB大小的N个文件,分别放入两个磁盘中,以STAT口最大传输速率为例,单个传输在600M/s,两个一起就是1GB/s 左右每秒的数据传输。同样也可以三块硬盘组建RAID 0,那时这个RAID 0 的速率就是接近单块硬盘的3倍,但至少是2块硬盘组建RAID 0

RAID 0特性

RAID 1 (镜像)

基本原理
raid1.png

如上图:在存储文件的时候在DISK 0 中存储一份,然后还在DISK 1 中存储一份,写速度不变,不过在读取数据的时候可以交叉读取,提高读速度。这种RAID组合通常是为了数据安全性,两块硬盘同时坏的几率肯定比一块硬盘坏的几率小太多了

RAID 1特性

RAID 4 (校验码)

基本原理
raid4.png

如上图:在存储数据的时候会被依次分片存入DISK 0,1,2 中,DISK 3 不存放数据,存放DISK 0,1,2的校验码。如一个90M的文件被被分别存入A1,A2,A3位置,Ap就是存放着A1,A2,A3的校验码;在读取数据的时候如果A1,A2,A3的数据取出后校验码不能跟Ap相同,那就数据出现问题。这种情况,校验码盘DISK 3是RAID的瓶颈,所以用的比较少,如果RAID 3 出现问题,就要重新换盘或重新计算校验码,影响线上业务

特性

RAID 5 (循环冗余校验码)

基本原理
raid5.png

如上图:跟RAID 4 差不多,只是每个盘都参与当校验码盘,这种情况如果两块硬盘挂了,那数据就没了

特性

RAID 01 (条带+镜像)

基本原理
RAID01.png

如图:先将4块硬盘分成两个为组共两组,每组各做成RAID 0 然后将每组连接起来在组成RAID 1,也就是先条带(RAID 0),然后镜像(RAID 1),RAID 在存储数据的时候先左右各存一份也就是DISK 0,1跟DISK 2,3存的东西是一模一样的,然后数据到每组的时候在以条带的方式分批存入两个硬盘,如果其中一组RAID 0 挂了,那不会影响业务,因为另一组的跟挂掉的那组数据一样。如果不同组同一个数据位的硬盘挂了那就真挂了

特性

RAID 10 (镜像+条带)

基本原理
RAID10.png

如图:跟上面RAID 01 差不多,不解析了,大概理解下也就是先分组做RAID 1 然后将每组做成RAID 0

JBOD(磁盘簇)

基本原理
JBOD.svg.png

如上图:将多个硬盘组成一个逻辑盘,可以自由扩大或缩小,扩大或缩小不损坏数据,RAID就不一定,一般硬盘需要分区、格式化、挂载才能用。JBOD能够动态增减硬盘容量

特性

至于RAID 3、RAID 4、RAID 50啥特性的自行搜索下

RAID 的级别差异

RAID级别 读性能 写性能 冗余能力 利用率% 硬盘数量
RAID 0 单盘N倍 单盘N倍 100 2
RAID 1 接近单盘N倍 低于单盘写能力 50 2
RAID 4 (N-1)/N * s倍 (N-1)/N * s倍 (N-1)/N 3
RAID 5 (N-1)/N * s倍 (N-1)/N * s倍 (N-1)/N 3
RAID 01 Ns/2倍 Ns/2倍 50 4
RAID 10 Ns/2倍 Ns/2倍 50 4
JBOD 100 2

Linux RAID实现

内核(kernel)中有个模块叫md(multi disk),这个是用来模拟软件RAID的,这个跟dm是两码事

linux是通过设备文件访问每个硬件的(/dev/目录下),软件RAID在/dev/ 目录下生成/dev/md# 开头的设备(逻辑RAID)让linux来实现软件RAID,实际底层还是存储到各个设备中(/dev/sd#)

RAID 基本操作

# mdadm
创建模式
  -c 设备名
    专用选项
      -l:RAID级别
      -n:#:指定设备个数
      -a {yes|no}:自动为其创建设备文件
      -c:CHUNK大小,默认是64k,每个条带大小
      -x #: 指定空闲盘个数 
    # mdadm -C /dev/md0 -l 0 -a yes -n 2 /dev/sda{0,1}
管理模式
  --add(-a):新增;--remove(-r):移除; --fail(-f):模拟损坏
  # mdadm /dev/md# --fail /dev/sda1 : 模拟硬盘损坏
监控模式
  -F 设备名
增长模式 
  -G 设备名  指定块设备
装饰模式
  注意:将现有做成RAID 的设备放置到别的主机,通过装配模式进行重新识别
  -A

查看RAID阵列的详细信息
  # mdadm -D /dev/md#: 显示设备详细信息
  # /proc/mdstat: 查看RAID信息

停止阵列
  # mdadm -S /dev/md#

将当前RAID信息保存至配置文件,以便以后进行装配
  # mdadm -D --scan > /etc/mdadm.conf

由于演示我就一块磁盘来模拟RAID各个级别,只要是块设备都能用来做RAID

Linux RAID实例

分区信息

这里使用一块20G磁盘进行模拟

RAID 0 实例

RAID 0 要保证至少需要两个设备这里用sdb{1,2}进行模拟
mdadm -C /dev/md0 -l 0 -a yes -n 2 /dev/sdb{1,2}

创建RAID 0
  1. 使用mdadm -C 指定创建逻辑RAID名称,-l指定RAID级别,-a同意自动为其创建设备文件,-n指定设备数量(不能小于块设备数量)

  2. 使用mdadm -D /dev/md0 查看详细信息(应该看得懂吧)

  3. mke2fs -j /dev/md0:格式化逻辑RAID

  4. 挂载(看到lost+found文件就标识成功了)


    挂载目录

RAID 1 实例

这里RAID 1 使用sdb{3,5}进行模拟

mdadm -C /dev/md1 -l 1 -a yes -n 2 /dev/sdb{3,5}

raid1

第二个红框在查看RAID设备的时候看到红框3的进度条,这是RAID 1的特性,盘1数据跟盘2保持一致也就是sdb3跟sdb5保持一致,之后会显示同步完成

同步完成
模拟磁盘损坏
  1. 先拷贝文件(我拷贝文件/etc/fstab)到挂载目录,我挂载的是/media目录,模拟mdadm /dev/md1 -f /dev/sdb5损坏(/dev/sdb5)

    模拟损坏
  2. 查看挂载目录fstab文件内容


    fstab内容

这就是RAID 0的特性,允许一块磁盘损坏,依然不影响数据

  1. 现在添加sdb6至md1(RAID 1)中,在模拟sdb3损坏,查看数据是否可以访问
# mdadm /dev/md1 -r /dev/sdb5:移除损坏盘
# mdadm /dev/md1 -a /dev/sdb6:新增盘
# mdadm /dev/md1 -f /dev/sdb3:模拟sdb3损坏
# cat /media/fstab
模拟损坏

cat /media/fstab

查看fstab内容

文件依然可用

mdadm命令的其他模式的用法自行搜索理解吧

总结

首先只要理解RAID是什么?然后用在什么地方?特性是什么?怎么用,就能大概了解跟理解他了

上一篇 下一篇

猜你喜欢

热点阅读