Chinaunix首页 | 论坛 | 博客
  • 博客访问: 244643
  • 博文数量: 21
  • 博客积分: 493
  • 博客等级: 下士
  • 技术积分: 308
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-05 12:21
文章分类

全部博文(21)

文章存档

2013年(1)

2012年(20)

分类: LINUX

2012-10-20 12:52:03

      磁盘阵列(Redundant Arrays of Inexpensive Disks,RAID),有“价格便宜且多余的磁盘阵列”之意。原理是利用数组方式来作磁盘组,配合数据分散排列的设计,提升数据的安全性。磁盘阵列是由很多便宜、容量较小、稳定性较高、速度较慢磁盘,组合成一个大型的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能。同时利用这项技术,将数据切割成许多区段,分别存放在各个硬盘上。磁盘阵列还能利用同位检查(Parity Check)的观念,在数组中任一颗硬盘故障时,仍可读出数据,在数据重构时,将数据经计算后重新置入新硬盘中。
 
RAID-0(等量,stripe):效能最佳
      使用等量的两块磁盘,将磁盘先切出等量的区块(4KB),然后当一个文件要写入raid时,该文件会依据区块的大小切割好,之后再依序放到各个磁盘中去,由于每个磁盘会交错的存放数据,因此当你的数据要写入RAID时,数据会被等量的放置在各个磁盘上面.比如:你有两块磁盘组成RAID-0,当你有100MB数据要写入时,每个磁盘会各被分配到50MB的存储量.RAID-0示意图如下:
优点:越多块磁盘组成的RAID-0效能会越好,因为每块负责的文件读写量少了,文件读写会很快。此外磁盘总容量也变大了.为所有磁盘的总和。
 
缺点:RAID-0没有提供安全的保证,由上图可知,文件是被切割成适合每块磁盘分区区块的大小,然后在依序放置到各个磁盘中。如果其中一块硬盘坏了,那么文件数据就会缺一块,此时这个文件就损毁了.所以,RAID-0只要有任何一块磁盘损毁,RAID上的所有数据都会丢失而无法读取。
 
RAID-1(印像模式,mirror):完整备份
      这种模式也需要等量的磁盘,如果不是等量的磁盘组成RAID-1时,那么总容量将以最小的那一块磁盘为主,此模式主要是让同一份数据,完整的保存在两块磁盘上。如果有一个100MB的文件,且我仅有两块磁盘组成RAID-1时,那么这两块磁盘将会同步写入100MB,因此,整体RAID的容量只是实际容量的一半.
缺点:由于同一份数据会被分别写入到其他不同磁盘,因此如果要写入100MB,数据传送到I/O总先后会被复制多分到各个磁盘,结果数据量就大了,因此写入的效能会变得很差,但是读取效果还可以。如果使用硬件RAID(磁盘阵列卡)时,磁盘阵列卡会主动复制一份而不适用系统的I/O总线,效能方面还行.磁盘的容量有一半用在备份,因此容量是全部容量的一半。
优点:由于两块磁盘数据一模一样,所以任何一块磁盘损坏时,资料还是可以完整的保留下来,所以,RAID-1最大的优点在于数据的备份。
 
RAID0+1,RAID1+0
RAID-0效能佳但是数据不安全,RAID-1数据安全但是效能不佳,RAID0+1,RAID1+0就刚好将两者整合起来.
RAID0+1:(1)想让两块磁盘组成RAID-0,并且这样的设定有两组;(2)将这两组RAID-0组成一组RAID-1。
RAID1+0:就是先组成RAID1,再组成RAID0
缺点:RAID1的缺点,总容量会少一半用来做备份。
优点:具有RAID0的优点,效能得以提高,RAID1的优点,数据得以备份。
 
RAID5
首先,RAID-5至少需要三块以上的磁盘才能组成这种类型的磁盘阵列.这种磁盘阵列的数据写入类似RAID-0,不过每个循环写入的过程中,每块磁盘还加入一个同位检查数据(Parity),这个数据会记录其他磁盘的备份数据,用于当有磁盘损毁时的救援.
      如上图,每个循环写入时,都会有部分的同位检查码被记录下来,并且记录的同位检查码每次都记录在不同的磁盘,因此,任何一个磁盘损坏时都能由其他的磁盘检查码来重建原本磁盘内的数据,不过由于有同位检查码,相当于一块磁盘用来放检查码,所以总容量就会使整体磁盘容量减去一块磁盘容量,原本3块磁盘剩下两块磁盘的容量。而且当损坏的磁盘数量大于等于两块时,这整组RAID5的资料就损坏了。因此RAID5 仅能允许一块磁盘的损坏。

优缺点:读取性能还不错,与RAID0有的比,但写的效果没有好多少,因为写入还要计算同位检查码的关系,所以写入效能与系统的硬件关系较大,尤其当使用软件磁盘阵列时,同位检查码是通过CPU计算而非专门的磁盘阵列卡上的处理芯片,因此,效能远不及硬件RAID.

      另外,由于RAID5仅能支持一块磁盘损坏,因此进来还有发展出另外一种等级,就是RAID6,这个RAID6则使用两块磁盘的容量作为parity的存储,因此整体的磁盘容量会减少两颗,但是允许出错的盘数就达到两块了。

预备磁盘(Spare Disk)的功能:
所谓的spare disk 就是一颗或多可没有包含在原本磁盘阵列等级中的磁盘,这块磁盘品是并不会被磁盘阵列所使用,当磁盘阵列有任何磁盘损毁时,则这颗spare disk 会主动的拉进磁盘阵列中,并将那块坏掉的磁盘移出磁盘阵列,磁盘阵列就会开始主动重建(rebuild)原本坏掉的那块磁盘上的数据。然后磁盘阵列上的数据就复原了。不过,我们还是要手动插拔硬盘,此时通常要关机才能这么做。如果磁盘阵列支持热插拔就可以直接将坏掉的那块磁盘拔除,换一块新的,再将那块新的设定成spare disk 就完成了。

RAID磁盘阵列的优点
  • 数据安全与可靠性:指的并非信息安全,而是当磁盘损坏时,数据是否还能安全的救援,使用的意思。
  • 读写效能:如RAID0可以加强读写效能。
  • 容量:可以让多可磁盘组合起来,故单一文件系统可以有相当大的容量。
软件磁盘阵列:mdadm软件
因为硬件磁盘阵列卡很贵,所以可用软件来模拟硬件磁盘阵列,只是会消耗些cpu的运算和I/O总线资源,但是现在的cpu和总线资源已经很充裕了。

mdadm软件会以分区(partition)或磁盘(disk)为单位,也就是说,不需要两块以上的磁盘,只要有两个以上的分区就能够组建磁盘阵列了.支持RAID0,RAID1,RAID5,spare disk等.有类似热插拔的功能。

先创建用于做RAID的分区

点击(此处)折叠或打开

  1. [root@yanjerry ~]# fdisk -l
  2. Disk /dev/sda: 21.5 GB, 21474836480 bytes
  3. 255 heads, 63 sectors/track, 2610 cylinders
  4. Units = cylinders of 16065 * 512 = 8225280 bytes
  5. Sector size (logical/physical): 512 bytes / 512 bytes
  6. I/O size (minimum/optimal): 512 bytes / 512 bytes
  7. Disk identifier: 0x0003f7a6
  8. Device Boot Start End Blocks Id System
  9. /dev/sda1 * 1 26 204800 83 Linux
  10. /dev/sda2 26 91 524288 82 Linux swap / Solaris
  11. /dev/sda3 91 2611 20241408 83 Linux
  12. Disk /dev/sdb: 2147 MB, 2147483648 bytes
  13. 255 heads, 63 sectors/track, 261 cylinders
  14. Units = cylinders of 16065 * 512 = 8225280 bytes
  15. Sector size (logical/physical): 512 bytes / 512 bytes
  16. I/O size (minimum/optimal): 512 bytes / 512 bytes
  17. Disk identifier: 0x31378d68
  18. Device Boot Start End Blocks Id System
  19. /dev/sdb1 1 261 2096451 5 Extended
  20. /dev/sdb5 1 65 522049+ 83 Linux
  21. /dev/sdb6 66 130 522081 83 Linux
  22. /dev/sdb7 131 195 522081 83 Linux
  23. /dev/sdb8 196 261 530113+ 83 Linux
创建RAID
  1. [root@yanjerry ~]# mdadm --create --auto=yes /dev/md0 --level=5 --raid-devices=3 --spare-devices=1 /dev/sdb{5,6,7,8}
参数说明
#mdadm --detail /dev/md0
#mdadm --create --auto=yes /dev/md[0-9] --raid-devices=N --level=[015] --spare-devices=N /dev/sdx /dev/hdx...
--create :建立RIAD
--auto=yes:决定建立后的软件磁盘阵列设备,即/dev/md0...
--raid-devices=N:使用几个磁盘(partition)作为磁盘阵列
--spare -devices=N:使用几个磁盘做给备用盘
--level=[015]:设定这组磁盘阵列等级。支持很多,不过建议只用0,1,5即可
--detail:显示后面接的那个磁盘的详细信息

点击(此处)折叠或打开

  1. [root@yanjerry ~]# mdadm --detail /dev/md0|more
  2. /dev/md0: RAID设备名
  3. Version : 1.2
  4. Creation Time : Sat Oct 20 11:35:45 2012 建立RAID时间
  5. Raid Level : raid5 RAID等级5
  6. Array Size : 1043456 (1019.17 MiB 1068.50 MB) 此RAID可用磁盘容量
  7. Used Dev Size : 521728 (509.59 MiB 534.25 MB) 每个设备可用容量
  8. Raid Devices : 3 作为RAID的设备数
  9. Total Devices : 4 全部设备数
  10. Persistence : Superblock is persistent
  11. Update Time : Sat Oct 20 11:36:26 2012
  12. State : clean
  13. Active Devices : 3 启动的(active)装置数量
  14. Working Devices : 4 可工作的设备数量
  15. Failed Devices : 0 出现错误的设备数
  16. Spare Devices : 1 预备磁盘数
  17. Layout : left-symmetric
  18. Chunk Size : 512K 就是分区区块大小
  19. Name : yanjerry:0 (local to host yanjerry)
  20. UUID : b273035a:42ee81c0:99c88526:f65e700e 此RAID的UUID
  21. Events : 20
  22. Number Major Minor RaidDevice State
  23. 0 8 21 0 active sync /dev/sdb5
  24. 1 8 22 1 active sync /dev/sdb6
  25. 4 8 23 2 active sync /dev/sdb7
  26. 3 8 24 - spare /dev/sdb8
或者通过这个查看这个文件
  1. [root@yanjerry ~]# cat /proc/mdstat
  2. Personalities : [raid6] [raid5] [raid4]
  3. md0 : active raid5 sdb7[4] sdb8[3](S) sdb6[1] sdb5[0]
  4. 1043456 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
  5. unused devices:
第一行:指出 md0 为 raid5 ,使用了sdb5,sdb6,sdb7 三块磁盘装置。每个装置后面的中括号 [] 内的数字为此磁盘在 RAID 中的顺序 (RaidDevice);sdb8 后面的 [S] 则代表 spare盘
第二行:此磁盘阵列拥有  1043456 blocks(每个 block 单位为 1K),所以怪容量约为1GB, 使用 RAID 5 等级,写入磁盘的小区块 (chunk) 大小为 512K,使用 algorithm 2 磁盘阵列算法。 [m/n] 代表此数组需要 m 个设备, n 个设备正常运作。因此本 md0 需要 3个设备且这 3 个设备均正常运作。 后面的 [UUUU] 代表的是四个所需的设备 (就是 [m/n] 里面的 m) 的启动情况,U 代表正常运作,若为 _ 则代表不正常。
 
格式化,挂载md0
  1. [root@yanjerry ~]# mkfs -t ext4 /dev/md0 格式化md0
  2. [root@yanjerry ~]# mkdir /mnt/raid
  3. [root@yanjerry ~]# mount /dev/md0 /mnt/raid
  4. [root@yanjerry ~]# df -h
  5. Filesystem Size Used Avail Use% Mounted on
  6. /dev/sda3 20G 4.2G 14G 23% /
  7. tmpfs 122M 0 122M 0% /dev/shm
  8. /dev/sda1 194M 26M 158M 15% /boot
  9. /dev/md0 1003M 18M 935M 2% /mnt/raid Raid5 容量是总容量的一半
仿真RAID错误的救援模式

mdadm还提供模拟的阵列错误救援模式,我们就来模拟下当磁盘损坏了以后RAID是怎么处理的。

#mdadm --manage /dev/md[0-9] [--add 设备] [--remove 设备] [--fail 设备]
--add:会将后面的装置加入到这个md中
--remove:会将后面的装置由这个md中移除
--fail:会将后面的装置设定称为出错的状态

设定磁盘错误
先来看看怎么让一个磁盘变成错误的,然后让spare disk自动开始重建系统

先复制一些东西到这个RAID中去,这个RAID已经在使用了.

  1. [root@yanjerry ~]# cp -a /etc/ /var/log /mnt/raid
  2. [root@yanjerry ~]# df -h
  3. Filesystem Size Used Avail Use% Mounted on
  4. /dev/sda3 20G 4.2G 14G 23% /
  5. tmpfs 122M 0 122M 0% /dev/shm
  6. /dev/sda1 194M 26M 158M 15% /boot
  7. /dev/md0 1003M 48M 905M 6% /mnt/raid
  8. [root@yanjerry ~]# du -sm /mnt/raid/* 确实有东西在里面了
  9. 25 /mnt/raid/etc
  10. 4 /mnt/raid/log
  11. 1 /mnt/raid/lost+found
OK,现在开始让他出错,假设/dev/sdb5 这个设备出错了。

  1. [root@yanjerry ~]# mdadm --manage /dev/md0 --fail /dev/sdb5
  2. mdadm: set /dev/sdb5 faulty in /dev/md0

查看md0详细信息

点击(此处)折叠或打开

  1. [root@yanjerry ~]# mdadm --detail /dev/md0
  2. .....省略....
  3. Update Time : Sat Oct 20 12:05:04 2012
  4. State : clean, degraded, recovering
  5. Active Devices : 2
  6. Working Devices : 3
  7. Failed Devices : 1 有一个出错设备
  8. Spare Devices : 1
  9. .....省略....
  10. Number Major Minor RaidDevice State
  11. 3 8 24 0 spare rebuilding /dev/sdb8 原先的spare盘正在重建数据
  12. 1 8 22 1 active sync /dev/sdb6
  13. 4 8 23 2 active sync /dev/sdb7
  14. 0 8 21 - faulty spare /dev/sdb5
 
或者通过这个文件查看详细信息
  1. [root@yanjerry ~]# cat /proc/mdstat
  2. Personalities : [raid6] [raid5] [raid4]
  3. md0 : active raid5 sdb7[4] sdb8[3] sdb6[1] sdb5[0](F) 出错设备
  4. 1043456 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]
  5. unused devices:

rebuilding 后的详细信息

点击(此处)折叠或打开

  1. [root@yanjerry ~]# mdadm --detail /dev/md0
  2. .....省略....
  3. Update Time : Sat Oct 20 12:05:16 2012
  4. State : clean
  5. Active Devices : 3
  6. Working Devices : 3
  7. Failed Devices : 1
  8. Spare Devices : 0
  9. .....省略....
  10. Number Major Minor RaidDevice State
  11. 3 8 24 0 active sync /dev/sdb8 重建完成
  12. 1 8 22 1 active sync /dev/sdb6
  13. 4 8 23 2 active sync /dev/sdb7
  14. 0 8 21 - faulty spare /dev/sdb5 此磁盘坏了
此时再看磁盘中的文件依旧
 
将错误磁盘移除并加入新磁盘

  1. [root@yanjerry ~]# mdadm --manage /dev/md0 --add /dev/sdb9 --remove /dev/sdb5
开机自动启动RAID并自动加载
建议通过配置文件/etc/mdadm.conf,只要知道md0的UUID就行了,可以通过如下命令查看UUID

  1. [root@yanjerry ~]# mdadm --detail /dev/md0 |grep UUID
  2. UUID : b273035a:42ee81c0:99c88526:f65e700e
在/etc/mdadm.conf中添加

  1. [root@yanjerry ~]# echo "ARRAY /dev/md0 $(mdadm --detail /dev/md0 |grep UUID|sed 's/UUID : /UUID=/')"|tr -s ' ' ' ' > /etc/mdadm.conf
即在/etc/mdadm.conf 中写入如下内容
ARRAY /dev/md0 UUID=b273035a:42ee81c0:99c88526:f65e700e

在/etc/fstab中加入
/dev/md0 /mnt/raid ext4 defaults 1 2
 
重新挂载md0

  1. [root@yanjerry ~]# umount /dev/md0;mount -a
接下来就reboot吧~
至此实验也做完了。
 
 
     如果大家向我一样是在虚拟机上做的实验,以后不用md0的话,就可以将RAID关闭了,毕竟他还占磁盘分区了呀。接下来要说明一个重要的地方,就是关闭软件RAID(重要)
      这个/dev/md0用了/dev/sdb{5,6,7,8},如果只是将/dev/md0卸除,忘记将RAID关闭,结果以后再重新分割sdb时可能会出现莫名的错误,我就遇到过。
 
1.先卸除且删除配置文件内与这个/dev/md0 有关的设定:
umount /dev/md0
删除/etc/fstab 中md0启动那一行

2.关闭/dev/md0

  1. [root@yanjerry ~]# mdadm --stop /dev/md0
  2. mdadm: stopped /dev/md0

  1. [root@yanjerry ~]# cat /proc/mdstat
  2. Personalities : [raid6] [raid5] [raid4]
  3. unused devices: 这里就说明关闭了
将/etc/mdadm.conf 中的内容也删除或批注就行

至此删除RAID也完成了。
阅读(3339) | 评论(2) | 转发(2) |
0

上一篇:原码,反码,补码

下一篇:Cache与Buffer

给主人留下些什么吧!~~

yanjerry91332012-10-21 16:32:10

毛贼贼: 是否考虑到了俺的接受能力,.....
多谢这位网友的关注,与支持,你可以的。。。

毛贼贼2012-10-20 19:57:52

是否考虑到了俺的接受能力,