RAID 独立磁盘冗余阵列

RAID 独立磁盘冗余阵列

RAID

计算机发展初期,”大容量”硬盘相当昂贵,1988年加州大学伯克利分校的工程师们提出了使用多块廉价硬盘组合成”大容量”硬盘的解决方案,这便是RAID,所以早期RIAD称作Redundant Array of Inexpensive Disks,中文名:廉价冗余磁盘阵列。而随着后期的发展,将硬盘组合起来的RAID阵列卡并不便宜,甚至比硬盘本身还贵,所以RAID改名为Redundant Array of Independent Disks, 中文名:独立冗余磁盘阵列

RAID通过硬件的阵列卡(也有使用软件模拟,但一般情况不会这么做,性能太差)将多块容量相同的硬盘组合成一块逻辑的大硬盘。然后再在RAID盘上进行分区,装文件系统。这样做的目的是,配合不同的RAID级别,数据存储时,RAID先将数据分解成chunk(大小可以指定),然后并行的将chunk并行写入各个硬盘,读取也是并行的从各个硬盘中读取,提高了硬盘的I/O性能。其次还能实现存储数据的时候生成校验位,存储于某块或全部硬盘中,这样模块硬盘损坏,其上的数据也能通过其它硬盘计算而来,这是自动进行的,提高了硬盘的容错能力。总之使用RAID,配合不同的运行级别,将提高硬盘总体的I/O性能和容错能力。

RAID实现方式

  • 外接RAID卡
  • 主板集成RAID控制器
  • 通过软件模拟
    对于有硬件的RAID卡,可以在启动BIOS时按照硬件厂商提供的配置界面对RAID进行配置,然后再在RAID盘上安装操作系统。也可以先安装操作系统再配置RAID。

RAID级别

目前常用的RAID级别: RAID-0, RAID-1, RAID-5, RAID-6, RAID-10, RAID-01

RAID-0
条带卷 strip, 将数据分割成chunk, 存在不同的硬盘中,写入和读取时并行进行。

  • 提升读写能力
  • 无容错能力
  • 最少磁盘数2
  • 可用空间: n*min(disk1,disk2 …)

Alt text

RAID-1
镜像卷 mirror, 存储数据时,将数据复制一份存在另一块硬盘中。读取时并行进行。

  • 降低写入能力,提升读取能力
  • 可以同时坏一块硬盘
  • 最少两块磁盘
  • 可用磁盘空间: 0.5*n*min(disk1,disk2,disk3 … )

Alt text
   
RAID-4
存储数据的时候,并行进行,并生成校验位, 其中一块磁盘做校验盘,通过计算可算出任意一块磁盘的数据,读取数据也是并行进行。RAID-4有一个天生的缺陷,由于该级别使用一块硬盘来存储校验位,实际生产经验得到,这块存储校验位的硬盘总比其它硬盘更容易损坏,可能是其I/O次数比其它硬盘多所致。

  • 提高读写能力
  • 可以同时坏一块磁盘
  • 至少三块磁盘
  • 可以空间: (n-1)*min(disk1,disk2 … )

Alt text

RAID-5
为了改进RAID-4的缺陷,RAID-5各磁盘轮循做校验盘。

  • 提高读写能力
  • 可以同时坏一块磁盘
  • 至少三块磁盘
  • 可以空间: (n-1)*min(disk1,disk2 … )

Alt text

RAID-6
RAID-6在RAID-5的基础上,存储数据的时候计算两份校验只,将校验验值存在不同磁盘中,各磁盘轮循做校验盘

  • 提升读写能力
  • 可以同时坏两块磁盘
  • 至少4块磁盘
  • 可用空间: (n-2)*min(disk1,disk2 … )

Alt text

RAID-10
先将硬盘分成每两块一组,每一组做RAID-1,然后再将各组硬盘做RAID-0。其容错能力比RAID-01高。

  • 提升读写能力
  • 最多可同时坏一半磁盘
  • 至少4块磁盘
  • 可用空间: n*min(disk1,disk2, … )/2

Alt text

RAID-01
先将硬盘分成两组,每组做RAID-0,然后再将这两组硬盘做RAID-1,两组的硬盘不能同时坏。

RAID 实验

  • mdadm [mode] {raiddevice} [options] {component-devices}

使用软件mdadm 模拟RAID的实现方式
我们使用3块磁盘做RAID-5,再使用1块硬盘做热备盘,模拟RAID-5的容错能力

  1. 创建分区,并指定分区类型为fd(Linux raid auto)
    实际做RAID都是使用硬盘而不是分区,此处为了演示的方便使用分区代替硬盘。
#使用/sdev/sdb硬盘,将其分为4个主分区,每个分区大小为1G,并将分区类型调整为fd.
[root-~] $ lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 12G 0 disk

# 用fdisk分区
[root-~] $ fdisk /dev/sdb

。。。

Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-25165823, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-25165823, default 25165823): +1G
Partition 1 of type Linux and of size 1 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: 12.9 GB, 12884901888 bytes, 25165824 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: 0xaca06bc9

Device Boot Start End Blocks Id System
/dev/sdb1 2048 2099199 1048576 fd Linux raid autodetect
/dev/sdb2 2099200 4196351 1048576 fd Linux raid autodetect
/dev/sdb3 4196352 6293503 1048576 fd Linux raid autodetect
/dev/sdb4 6293504 8390655 1048576 fd Linux raid autodetect

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

# CentOS7中使用partprobe同步信息,CentOS6中使用partx
[root-~] $ partprobe
  1. 使用mdadm创建RAID-5
# 先查看磁盘分区
[root-~] $ lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 12G 0 disk
├─sdb1 8:17 0 1G 0 part
├─sdb2 8:18 0 1G 0 part
├─sdb3 8:19 0 1G 0 part
└─sdb4 8:20 0 1G 0 part

# 创建RAID-5
# mdadm -C RAID设备文件 -l 运行级别 -n RAID硬盘数量 -x 热备盘数量 -c chunck大小 硬盘设备文件
[root-~] $ mdadm -C /dev/md0 -l 5 -n 3 -x 1 -c 1024 /dev/sdb{1,2,3,4}
mdadm: /dev/sdb1 appears to contain an ext2fs file system
size=10485760K mtime=Fri Aug 11 19:43:13 2017
Continue creating array? y <=输入y确认创建
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
  1. 查看RAID-5信息
    当创建好RAID后就可以使用mdadm -D /dev/md# 查看RAID的信息,/dev/md#为RAID设备文件
[root-~] $ mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sat Aug 12 11:12:58 2017
Raid Level : raid5 <=运行级别
Array Size : 2093056 (2044.00 MiB 2143.29 MB)
Used Dev Size : 1046528 (1022.00 MiB 1071.64 MB)
Raid Devices : 3 <=参与RAID硬盘数量
Total Devices : 4 <=硬盘总数量,有一块做热备盘使用喔
Persistence : Superblock is persistent

Update Time : Sat Aug 12 11:13:04 2017
State : clean
Active Devices : 3
Working Devices : 4
Failed Devices : 0
Spare Devices : 1

Layout : left-symmetric
Chunk Size : 1024K <=Chunk大小,默认是512

Name : centos7.zhubiao.science:0 (local to host centos7.zhubiao.science)
UUID : 8f39dd0c:3aa36d59:544e63ad:f0623ef5
Events : 18

Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 18 1 active sync /dev/sdb2
4 8 19 2 active sync /dev/sdb3

3 8 20 - spare /dev/sdb4 <=热备盘
  1. 创建文件系统,并挂载
    当RAID创建好,并检查没问题,就可以在上面创建文件系统,挂载使用,这里我们在上面创建xfs文件系统,并在/etc/fstab中添加记录,让其开机自动挂载
# 创建xfs文件系统
[root-~] $ mkfs.xfs /dev/md0
meta-data=/dev/md0 isize=512 agcount=8, agsize=65280 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=522240, imaxpct=25
= sunit=256 swidth=512 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

# 查看UUID
[root-~] $ blkid /dev/md0
/dev/md0: UUID="a68d35b8-7340-4f8b-b8cb-7d41386e94cd" TYPE="xfs"

# 创建挂载点
[root-~] $ mkdir /mnt/md0

# 将挂载信息添加到/etc/fstab
[root-~] $ grep "md0" /etc/fstab
UUID=a68d35b8-7340-4f8b-b8cb-7d41386e94cd /mnt/md0 xfs defaults 0 0

# 根据fstab文件自动挂载
[root-~] $ mount -a

# 查看挂载信息
[root-~] $ df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda2 xfs 50G 3.6G 47G 8% /
devtmpfs devtmpfs 474M 0 474M 0% /dev
tmpfs tmpfs 489M 88K 489M 1% /dev/shm
tmpfs tmpfs 489M 7.2M 482M 2% /run
tmpfs tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda3 xfs 50G 995M 50G 2% /app
/dev/sda1 xfs 1014M 169M 846M 17% /boot
tmpfs tmpfs 98M 12K 98M 1% /run/user/0
/dev/sr0 iso9660 7.8G 7.8G 0 100% /run/media/root/CentOS 7 x86_64
/dev/md0 xfs 2.0G 33M 2.0G 2% /mnt/md0 <=已经挂载
  1. 增加新硬盘
    向RAID-5中添加新硬盘,称为RAID阵列的一员
# 卸载/dev/md0
[root-~] $ umount /dev/md0

# 创建新分区/dev/sda6
[root-~] $ fdisk /dev/sda
。。。

# 当前md0中的硬盘组成如下
[root-~] $ mdadm -D /dev/md0
。。。
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 18 1 active sync /dev/sdb2
4 8 19 2 active sync /dev/sdb3

3 8 20 - spare /dev/sdb4

# 将sda6加入到RAID-5中,/dev/md0
[root-~] $ mdadm -G /dev/md0 -n 4 -a /dev/sda6
mdadm: added /dev/sda6
mdadm: Need to backup 6144K of critical section..

# 加入后查看md0的信息
[root-~] $ mdadm -G /dev/md0 -n 4 -a /dev/sda6
mdadm: added /dev/sda6
mdadm: Need to backup 6144K of critical section..
[root-~] $ mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sat Aug 12 11:37:15 2017
Raid Level : raid5
Array Size : 3139584 (2.99 GiB 3.21 GB)
Used Dev Size : 1046528 (1022.00 MiB 1071.64 MB)
Raid Devices : 4
Total Devices : 5
Persistence : Superblock is persistent

Update Time : Sat Aug 12 11:51:37 2017
State : clean
Active Devices : 4
Working Devices : 5
Failed Devices : 0
Spare Devices : 1

Layout : left-symmetric
Chunk Size : 1024K

Name : centos7.zhubiao.science:0 (local to host centos7.zhubiao.science)
UUID : 8916024a:01b4cc10:2a4190e9:b6eac336
Events : 42

Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 18 1 active sync /dev/sdb2
4 8 19 2 active sync /dev/sdb3
5 8 6 3 active sync /dev/sda6 <=新加入的硬盘

3 8 20 - spare /dev/sdb4

  1. 模拟磁盘故障
    将sda6 设置为faild,查看RAID-5硬盘的变化

磁盘正常情况下硬盘的组成如下

    Number   Major   Minor   RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 18 1 active sync /dev/sdb2
4 8 19 2 active sync /dev/sdb3
5 8 6 3 active sync /dev/sda6 <=新加入的硬盘

3 8 20 - spare /dev/sdb4

a. 将sda6设置为faulty状态,原来的备用硬盘将自动加入RAID阵列中

[root-~] $ mdadm /dev/md0 -f /dev/sda6
mdadm: set /dev/sda6 faulty in /dev/md0
[root-~] $ mdadm -D /dev/md0
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 18 1 active sync /dev/sdb2
4 8 19 2 active sync /dev/sdb3
3 8 20 3 active sync /dev/sdb4 <=原来的备用硬盘自动顶替了原sda6的位置

5 8 6 - faulty /dev/sda6 <=faulty状态

b. 模拟sd4的损坏,将sd4设置为faulty,并从阵列中移除,此时显示为降级状态,我们需尽快更换好的硬盘。这种情况下,硬盘负荷会增加,很容易导致其它硬盘的损坏,对于RAID-5再坏一块硬盘将无法启动。

#将sdb4设置为faulty,并移除
[root-~] $ mdadm /dev/md0 -f /dev/sdb4
mdadm: set /dev/sdb4 faulty in /dev/md0

[root-~] $ mdadm /dev/md0 -r /dev/sdb4
mdadm: hot removed /dev/sdb4 from /dev/md0

#查看RAID-5阵列的变化
[root-~] $ mdadm -D /dev/md0
。。。
State : clean, degraded <=显示为降级状态
Active Devices : 3
Working Devices : 3
Failed Devices : 1 <=损坏的硬盘数量
Spare Devices : 0

Layout : left-symmetric
Chunk Size : 1024K

Name : centos7.zhubiao.science:0 (local to host centos7.zhubiao.science)
UUID : 8916024a:01b4cc10:2a4190e9:b6eac336
Events : 64

Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 18 1 active sync /dev/sdb2
4 8 19 2 active sync /dev/sdb3
- 0 0 3 removed <=缺少一块硬盘

5 8 6 - faulty /dev/sda6

c. 加入新的硬盘,将自动顶替原损坏硬盘的位置

[root-~] $ mdadm /dev/md0 -a /dev/sdb4
mdadm: added /dev/sdb4

[root-~] $ mdadm /dev/md0 -a /dev/sdb4
mdadm: added /dev/sdb4
[root-~] $ clear
[root-~] $ mdadm -D /dev/md0
。。。
State : clean <=恢复正常
Active Devices : 4
Working Devices : 4
Failed Devices : 1
Spare Devices : 0

Layout : left-symmetric
Chunk Size : 1024K

Name : centos7.zhubiao.science:0 (local to host centos7.zhubiao.science)
UUID : 8916024a:01b4cc10:2a4190e9:b6eac336
Events : 83

Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 18 1 active sync /dev/sdb2
4 8 19 2 active sync /dev/sdb3
6 8 20 3 active sync /dev/sdb4 <=加入的硬盘自动顶替原来损坏硬盘的位置

5 8 6 - faulty /dev/sda6
  1. 停用/启用 RAID
    将RAID配置信息添加到/etc/下面,以便停用RAID后仍可以启动RAID
# 到处配置信息放到/etc/目录下
[root-~] $ mdadm -D -s /dev/md0 >> /etc/mdadm.conf
[root-~] $ cat /etc/mdadm.conf
ARRAY /dev/md0 metadata=1.2 name=centos7.zhubiao.science:0 UUID=8916024a:01b4cc10:2a4190e9:b6eac336

# 停用RAID
[root-~] $ mdadm -S /dev/md0
mdadm: stopped /dev/md0

# 启用RAID
[root-~] $ mdadm -A -s /dev/md0
mdadm: /dev/md0 has been started with 4 drives.
  1. 移除RAID
    实验做完后,我们不需要RAID,可以将其停用,并清除硬盘上的RAID信息
#停用RAID
[root-~] $ mdadm -S /dev/md0
mdadm: stopped /dev/md0

#移除硬盘上的RAID信息
[root-~] $ mdadm --zero-superblock /dev/sdb{1,2,3,4} /dev/sda6

# 删除分区
[root-~] $ fdisk /dev/sdb
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): d
Partition number (1-4, default 4): 1
Partition 1 is deleted