【linux相识相知】独立硬盘冗余阵列-RAID
独立硬盘冗余阵列(RAID,Redundant Array of Independant Disks),旧称为廉价磁盘冗余阵列(Redundant Array of Inexpensive Disks)。1987年美国加州伯克利分校的一篇名为《A Case for Redundant Arrays of Inexpensive Disk(RAID)》论文诞生,这标志着RAID技术的开始。
RAID的实现模式
Software RAID:
软件磁盘阵列,由CPU处理和协调一个RAID里面各个硬盘的作业,这样就会给CPU带来较多的运算压力,分为3种:
1)基于主板的的磁盘阵列:通常上是由主板上的芯片组提供RAID功能。
2)硬件辅助磁盘阵列:需要RAID卡和相关厂商提供的驱动程序,RAID功能是由驱动程序和CPU运算来提供
3)操作系统的RAID功能:Linux、windows Server等操作系统内置的RAID功能
虽然软RAID实现的有多种,但是在生产环境还是不建议使用的。
Hardware RAID:
硬件磁盘阵列,在RAID卡上内置了CPU处理器,这样就不占用服务器的CPU了。一般硬件磁盘阵列都会有备份的电源模块和NVRAM(非易失性内存),当系统断掉后,备份电源开始供电,将硬盘读写的日志保存在内存中,当系统恢复,备份电源关闭供电,再在NVRAM读取日志数据,继续完成上次断电前没有完成的作业。
常用RAID介绍
常用的RAID有:RAID0,RAID-1,RAID-5,RAID6,RAID-10,RAID50。
RAID0,也称条带卷(striping)。在RAID0中,数据会被切成片,按一定顺序会被写到所有的磁盘里面,如下图:
若一片数据被切割成了A1-A8,将存储在一个由2块Disk组成的RAID0,那么第一段数据块A1会被存储在Disk0中,第二段数据块A2会被存储在Disk1中,第三段数据块会被存储在Disk0中,以此类推,这一片数据会被均分到2块磁盘上。

RAID0的优缺点:
1)速度快,写和读的能力得到了提高;
2)RAID0没有冗余的能力,一旦一块磁盘出现了故障,则所有的数据都将不会恢复;
3)RAID0需要N块磁盘才能实现(N>=2);
4)能够存储数据的大小为N*min(S1,S2,S3,S4....)
在RAID0中有两个重要的参数:
条带宽度:stripe width,它指的是可以被并行写入的数据块的个数,也就是实现RAID0中磁盘的个数;
条带大小:stripe size,它指的是每次写入磁盘的数据块的大小,大小一般为2KB或者512KB甚至更大,size越小,数据被分割的次数就越多。stripe size对性能是有一定的影响的,在生产环境中,需要调整好。
RAID1,镜像化,在RAID1中,数据会被复制成多份,存储在多个磁盘上,如下图:
若一片数据将要被存储,数据会被复制成多份(取决RAID1的磁盘个数),然后存储到每一个磁盘上。

RAID1的优缺点:
1)冗余性和数据的可靠性最高,只要不是磁盘同时损坏了,一般都不会带来数据丢失的问题;
2)RAID1的容量取决容量最小的那个磁盘,写入速度也是取决于最小的那个磁盘,较大的磁盘的剩余空间可 以分区使用,不会造成浪费;
3)RAID1的读取速度理论上来说是磁盘个数的倍数;
4)RAID1需要N块磁盘才能实现(N>=2)
5)能够存储数据的大小为min(S1,S2,S3...)
RAID3,数据类似于RAID0,被条带化的存储在多个磁盘中,数据以字节为单位,与RAID0不同的是,RAID3单独使用了一块独立的磁盘用来存储数据的奇偶校验值,如下图所示:
数据被切片存储在Disk0-2上,同时计算处奇偶校验值存储在Disk3上,这样即使Disk0-2中损坏一块磁盘,也能根据奇偶校验值得到损坏磁盘的数据。

RAID3的优缺点:
1.较高的容错能力;
2.不适合写入操作较多的情景,会给校验盘带来一定的负载,适合读取操作较多的应用环境;
3.RAID3需要N块磁盘(N>=3);
4.能够存储数据的大小为(N-1)*min(S1,S2,S3,S4....)。
和RAID3类似,RAID4不是以字节为存取单位,RAID4的数据以块(一般为512字节)为单位,如下图:
以块为单位带来的好处就是,减少了奇偶检验的次数,比如,如果一段数据的大小为10个字节,在RAID3上可能需要计算2次奇偶检验值了,但是在RAID4上,10个字节都会被放在第一个磁盘上,并不需要计算。

RAID4的优缺点:
1.较高的容错能力;
2.提高了小量数据的I/O能力;
3.RAID4需要N块磁盘(N>=3);
4.能够存储数据的大小为(N-1)*min(S1,S2,S3,S4....)。
RAID5可以理解成是RAID0和RAID1的折中方案,把数据条带化后存储,并且将数据奇偶检验值存储在所有的硬盘上,如下图:
数据被条带化存储到了磁盘上,并且每个磁盘上都能够存储奇偶检验值,其读写速度和RAID0差不多,可能写的时候要慢一点,比较要计算奇偶检验,这样,即使坏掉一块磁盘,只需要更换上好的磁盘,RAID会利用剩下奇偶检验去重建磁盘上的数据。

RAID5的优缺点:
1)较高的容错能力;
2)读写速度快;
3)RAID4需要N块磁盘(N>=3);
4)能够存储数据的大小为(N-1)*min(S1,S2,S3,S4....)。
与RAID5类似,只是增加了第二个独立的奇偶检验信息块,使用了两种不同的奇偶检验算法,如下图所示:
数据仍然是被条带化得存储在磁盘上,但是会计算出两个独立的奇偶检验值,相对于RAID5来说有更多的I/O操作和计算量,所以RAID6通常不会以软件来实现,一般会使用硬件实现,RAID6也是最常见的磁盘阵列。

RAID6的优缺点:
1)较高的容错能力
2)同一RAID6中最多运行同时损坏2块磁盘,更换磁盘后,数据将被重新计算写入;
3)RAID6需要N个磁盘(N>=4);
4)RAID容量为(N-2)*min(s1,s2,s3,...)
RAID 01是一种混合的磁盘阵列,即是RAID0和RAID1的混合,先做条带,再做镜像:
RAID01中,同组RAID0只要出现一个磁盘损坏,那么这个RAID 0就不能你使用了,值剩下其他组的磁盘运作,可靠性较低。

RAID01的优缺点:
1)数据可靠性低
2)RAID01需要N个磁盘(N>=4)
和RAID 01相反,RAID10是先做RAID1,再做RAID0,如下图所示:
RAID10和RAID01在读写速度上没有什么太大的差别,但是RAID10的数据安全性比较高,若下图左边那组RAID1中磁盘损坏了一个,另外一个也能用,右边那组RAID1再损坏一个数据也是恢复的,除非一组RAID1中的磁盘都坏掉了。

RAID 10的优缺点:
1)较高的容错能力
2)RAID10需要N个磁盘(N>=4)
RAID 50是RAID5和RAID0的组合,先做RAID5,再做RAID0,RAID 5至少需要3颗硬盘,因此要以多组RAID 5构成RAID 50,至少需要6颗硬盘,如下图。
在底层的任意一组或者多组的RAID5中出现了一个磁盘的损坏是可以接受的,但是若出现了2个或者以上的磁盘损坏,整个RAID50就会损坏。
RAID50的优缺点:
1)较高的容错能力
2)RAID10需要N个磁盘(N>=6)
Just a Bunch of Disks,能够将多块磁盘的空间合并起来的一个连续的空间,可靠性较低。
在Linux系统上实现Software RAID
在centos中,使用模块化得工具mdadm,如果没有可以使用:
- yum -y install mdadm
- 命令的语法格式:mdadm [mode] <raiddevice> [options] <component-devices>
- -C:创建模式
- -n #: 使用#个块设备来创建此RAID;
- -l #:指明要创建的RAID的级别;
- -a {yes|no}:自动创建目标RAID设备的设备文件;
- -c CHUNK_SIZE: 指明块大小;
- -x #: 指明空闲盘的个数;
- -D:显示raid的详细信息
- mdadm -D /dev/md#
- 管理模式:
- -f:标记指定磁盘为损坏
- -a:添加磁盘
- -r:移除磁盘
- 停止md设备:
- mdadm -S /dev/md#
举例:创建一个可用空间为10G的RAID1设备,文件系统为ext4,有一个空闲盘,开机可自动挂载至/backup目录。
先来分析一下:RAID1为镜像磁盘阵列,最少需要2个磁盘,可用空间为10G,即磁盘最小大小为10G即可,我们这里就使用1块硬盘的不同分区来模拟各个磁盘,每个10G:
- [root@localhost ~]# fdisk -l /dev/sdb
- Disk /dev/sdb: 128.8 GB, bytes
- heads, sectors/track, cylinders
- Units = cylinders of * = bytes
- Sector size (logical/physical): bytes / bytes
- I/O size (minimum/optimal): bytes / bytes
- Disk identifier: 0xf9b59c0f
- Device Boot Start End Blocks Id System
- /dev/sdb1 + Linux
- /dev/sdb2 Linux
- /dev/sdb3 Linux
使用以下命令创建RAID1系统,-C为创建模式,/dev/md0设备文件名,-n 2:使用2个块设备创建此RAID,-x 1:指定1个空闲盘的,-l:指定硬盘RAID等级,-a yes:自动创建RAID的设备文件,/dev/adb{1,2,3}:指定磁盘位置
- [root@localhost ~]# mdadm -C /dev/md0 -n -x -l -c -a yes /dev/sdb{,,}
- 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.
使用 cat /proc/mdstat 查看RAID构建的进度和预期完成的时间:
- unused devices: <none>
- [root@localhost ~]# cat /proc/mdstat
- Personalities : [raid1]
- md0 : active raid1 sdb3[](S) sdb2[] sdb1[]
- blocks super 1.2 [/] [UU]
- [=============>.......] resync = 68.6% (/) finish=.2min speed=200001K/sec
- unused devices: <none>
- [root@localhost ~]# cat /proc/mdstat
- Personalities : [raid1]
- md0 : active raid1 sdb3[](S) sdb2[] sdb1[]
- blocks super 1.2 [/] [UU]
- unused devices: <none>
- [root@localhost ~]# mdadm -D /dev/md0
- /dev/md0:
- Version : 1.2
- Creation Time : Sun Jul ::
- Raid Level : raid1
- Array Size : (10.00 GiB 10.73 GB)
- Used Dev Size : (10.00 GiB 10.73 GB)
- Raid Devices :
- Total Devices :
- Persistence : Superblock is persistent
- Update Time : Sun Jul ::
- State : clean
- Active Devices :
- Working Devices :
- Failed Devices :
- Spare Devices :
- Name : localhost.localdomain: (local to host localhost.localdomain)
- UUID : a46c7642:a46e274a:05923aeb:4c1ae0e9
- Events :
- Number Major Minor RaidDevice State
- active sync /dev/sdb1
- active sync /dev/sdb2
- - spare /dev/sdb3
格式化RAID1为ext4文件系统:
- [root@localhost ~]# mkfs.ext4 /dev/md0
- mke2fs 1.41. (-May-)
- 文件系统标签=
- 操作系统:Linux
- 块大小= (log=)
- 分块大小= (log=)
- Stride= blocks, Stripe width= blocks
- inodes, blocks
- blocks (5.00%) reserved for the super user
- 第一个数据块=
- Maximum filesystem blocks=
- block groups
- blocks per group, fragments per group
- inodes per group
- Superblock backups stored on blocks:
- , , , , , , ,
- 正在写入inode表: 完成
- Creating journal ( blocks): 完成
- Writing superblocks and filesystem accounting information: 完成
- This filesystem will be automatically checked every mounts or
- days, whichever comes first. Use tune2fs -c or -i to override.
- [root@localhost ~]# mount /dev/md0 /backup/
- [root@localhost ~]#
- [root@localhost ~]# df
- Filesystem 1K-blocks Used Available Use% Mounted on
- /dev/mapper/VolGroup-lv_root % /
- tmpfs % /dev/shm
- /dev/sda1 % /boot
- /dev/mapper/VolGroup-lv_home % /home
- /dev/md0 % /backup
可以使用 -f 将其中的某个磁盘模拟为坏的故障硬盘
- [root@localhost backup]# mdadm /dev/md0 -f /dev/sdb1
- mdadm: set /dev/sdb1 faulty in /dev/md0
- [root@localhost backup]# mdadm -D /dev/md0
- /dev/md0:
- Version : 1.2
- Creation Time : Sun Jul ::
- Raid Level : raid1
- Array Size : (10.00 GiB 10.73 GB)
- Used Dev Size : (10.00 GiB 10.73 GB)
- Raid Devices :
- Total Devices :
- Persistence : Superblock is persistent
- Update Time : Sun Jul ::
- State : clean
- Active Devices :
- Working Devices :
- Failed Devices :
- Spare Devices :
- Name : localhost.localdomain: (local to host localhost.localdomain)
- UUID : a46c7642:a46e274a:05923aeb:4c1ae0e9
- Events :
- Number Major Minor RaidDevice State
- active sync /dev/sdb3
- active sync /dev/sdb2
- - faulty /dev/sdb1
使用 -r 选项能够移除坏的硬盘
- [root@localhost backup]# mdadm /dev/md0 -r /dev/sdb1
- mdadm: hot removed /dev/sdb1 from /dev/md0
- [root@localhost backup]# fdisk /dev/sdb
- WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
- switch off the mode (command 'c') and change display units to
- sectors (command 'u').
- Command (m for help): n
- Command action
- e extended
- p primary partition (-)
- p
- Selected partition
- First cylinder (-, default ):
- Using default value
- Last cylinder, +cylinders or +size{K,M,G} (-, default ): +10G
- Command (m for help): w
- The partition table has been altered!
- Calling ioctl() to re-read partition table.
- WARNING: Re-reading the partition table failed with error : 设备或资源忙.
- The kernel still uses the old table. The new table will be used at
- the next reboot or after you run partprobe() or kpartx()
咦,有告警!因为当前的磁盘已经有分区被挂载当根文件系统的目录上了,内核没有识别,我们来查看/proc/parttions,果真没有识别
- [root@localhost backup]# cat /proc/partitions
- major minor #blocks name
- sdb
- sdb1
- sdb2
- sdb3
- sda
- sda1
- sda2
- dm-
- dm-
- dm-
- md0
- [root@localhost backup]# partx -a /dev/sdb
添加/dev/sdb4到RAID1
- [root@localhost backup]# mdadm /dev/md0 -a /dev/sdb4
- mdadm: added /dev/sdb4
- [root@localhost backup]# mdadm -D /dev/md0
- /dev/md0:
- Version : 1.2
- Creation Time : Sun Jul ::
- Raid Level : raid1
- Array Size : (10.00 GiB 10.73 GB)
- Used Dev Size : (10.00 GiB 10.73 GB)
- Raid Devices :
- Total Devices :
- Persistence : Superblock is persistent
- Update Time : Sun Jul ::
- State : clean
- Active Devices :
- Working Devices :
- Failed Devices :
- Spare Devices :
- Name : localhost.localdomain: (local to host localhost.localdomain)
- UUID : a46c7642:a46e274a:05923aeb:4c1ae0e9
- Events :
- Number Major Minor RaidDevice State
- active sync /dev/sdb3
- active sync /dev/sdb2
- - spare /dev/sdb4
设置开机可以自动挂载只/backup目录下,修改配置文件/etc/fstab即可
- #
- # /etc/fstab
- # Created by anaconda on Fri Jul ::
- #
- # Accessible filesystems, by reference, are maintained under '/dev/disk'
- # See man pages fstab(), findfs(), mount() and/or blkid() for more info
- #
- /dev/mapper/VolGroup-lv_root / ext4 defaults
- UUID=bc67ad74-46b3-4abc-b8a7-c4fb7cd6552a /boot ext4 defaults
- /dev/mapper/VolGroup-lv_home /home ext4 defaults
- /dev/mapper/VolGroup-lv_swap swap swap defaults
- tmpfs /dev/shm tmpfs defaults
- devpts /dev/pts devpts gid=,mode=
- sysfs /sys sysfs defaults
- proc /proc proc defaults
- /dev/md0 /backup ext4 defaults
- watch -n1 'cat /proc/mdstat'
【linux相识相知】独立硬盘冗余阵列-RAID的更多相关文章
- 独立硬盘冗余阵列与HDFS
http://zh.wikipedia.org/wiki/RAID 独立硬盘冗余阵列(RAID, Redundant Array of Independent Disks),旧称廉价磁盘冗余阵列(Re ...
- 【linux相识相知】磁盘分区及文件系统管理详解
磁盘,提供持久的数据存储,它不像我们的内存,如果突然断电了,在内存中的数据一般都会被丢掉了,内存中的数据在保存的时候,会被写到硬盘里面,磁盘也是一种I/O设备. 我们都知道磁盘分区完成之后,还要进行格 ...
- 【Linux相识相知】计算机的组成、linux发行版和哲学思想、基础命令和目录结构(FHS)
从今天开始,Frank将开始在博客上记录自己学习linux的点点滴滴,F初来乍到,还望各位大佬多多指教.本次博客的主要内容如下: 计算机基础:简要的描述了计算机的组成及其功能: linux初识:介绍了 ...
- 【linux相识相知】压缩与打包
我们日常使用window的时候,经常会用到压缩与解压缩,如果要压缩一个文件,右击选择[添加到压缩文件],解压缩则右击选择[解压到当前文件夹],“点点点”就能完成.但是在一个没有装图形化界面的linux ...
- 【linux相识相知】用户及权限管理
linux系统是多用户(Multi-users)和多任务(Multi-tasks)的,这样的目的是为了一台linux主机可以给很多用户提供服务同时运行多种服务,但是我们是怎么区分每个用户呢?作为一个管 ...
- 【linux相识相知】网络属性配置
当我们拥有一个崭新的计算机的时候,第一步恐怕都是迫不及待的下载各种软件,看视频,听音乐等,这里的关键的一点是要有网络.现在的个人计算机大部分都是windows操作系统的,接入网络网络很简单,插上网线也 ...
- 【Linux相识相知】rpm包管理
我们日常在使用Windows的时候,如果要安装某个软件,最简单的方法就是在程序包的官网直接下载软件包到本地,一般是以.exe或者.msi格式的文件,然后一直下一步下一步就能安装成功了,但是在使用lin ...
- 【Linux相识相知】任务计划和周期性任务
在我们的生活中,有的工作是例行的,例如每年一次加薪.每年给女朋友过一次生日.每天上班都要打卡等,有的工作是临时发生的,例如明天朋友要来访,你需要准备午餐等等. 像很多例行的工作,你一旦忙起来就很容易忘 ...
- 【linux相识相知】VIM编辑器
Vim是一个类似Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了许多的功能,VIM是自由软件,今天我们就来讲讲VIM的使用方法. 本文是基于centos7上的vim编辑器演示的 ...
随机推荐
- Autofac的Autofac.Core.Activators.Reflection.DefaultConstructorFinder错误解决方案。
在使用Autofac的时候,不给力,看着例子来的,人家没问题,我就报了Autofac.Core.Activators.Reflection.DefaultConstructorFinder错误. 百般 ...
- MS SQL Server计算间隔时间
开始需要,写了一个计算时间间隔的函数,可以参考: 得到的结果: 再列举一个例子:
- 【leetcode 5040. 边框着色】解题报告
方法一:dfs的非递归形式 using ll=long long; const ll MAXN=50LL; unordered_set<ll> vis,mark; vector<ve ...
- node.js安装以及git 的使用说明
第一步:安装node.js: Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高 ...
- spark-2.2.1在centos7安装
前言 在安装Spark之前,我们需要安装Scala语言的支持.在此我选择的是scala-2.11.12版本.jdk8也要保证已经安装好并且配置好环境变量 scala-2.11.12下载 为了方便,我先 ...
- 【解决】Linux Tomcat启动慢--Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [236,325] milliseconds
一.背景 今天部署项目到tomcat,执行./startup.sh命令之后,访问项目迟迟加载不出来,查看日志又没报错(其实是我粗心了,当时tomcat日志还没打印完),一开始怀疑是阿里云主机出现问题, ...
- office 2013 破解工具 及 软件下载
win7/win8/win10 office2013 破解工具 下载地址: https://pan.baidu.com/s/1sZeJOCWq1fZ3KIOWvmrAQQ office2013 ...
- SpringBoot 入门 Demo
SpringBoot 入门 Demo Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从 ...
- Qt 学习之路 2(59):使用流处理 XML
Qt 学习之路 2(59):使用流处理 XML 豆子 2013年7月25日 Qt 学习之路 2 18条评论 本章开始我们将了解到如何使用 Qt 处理 XML 格式的文档. XML(eXtensible ...
- C# 函数参数object sender, EventArgs e
object sender:表示触发事件的控件对象EventArgs e:表示事件数据的类的基类 Windows程序有一个事件机制.用于处理用户事件. 在WinForm中我们经常需要给控件添加事件.例 ...