现在的位置: 首页 > 综合 > 正文

安全动态磁盘策略

2018年04月22日 ⁄ 综合 ⁄ 共 12423字 ⁄ 字号 评论关闭

一、软件RAID技术  (RAID 0 / RAID 1 / RAID 5)
二、LVM逻辑卷管理技术 (PV / VG / LV )
三、整合RAID和LVM的磁盘存储策略

RAID技术产生的背景
1、普通的IDE硬盘速度不够快,性能不稳定,不能应用于企业级的关键任务中;
2、高效并且稳定可靠的SCSI硬盘的价格昂贵,中小企业又很难承担得起;
3、RAID(Redundant Array of Inexpensive / Independent Disk),即廉价/独立磁盘冗余阵列或简称磁盘阵列,它的出现可以让我们把普通的IDE硬盘组成快速安全可靠的存储设备。

RAID的原理
1、RAID是一种把多块独立的硬盘按不同的方式组合起来形成一个磁盘组,从而提供比单个硬盘更高的存储性能和提供数据冗余的技术,不同的组织方式成为RAID级别(Raid levels)
2、数据冗余的功能是在用户数据一旦发生损坏后,利用冗余信息可以使损坏的数据得以恢复,从而保障了用户数据的安全性
3、在用户看起来,组成的磁盘组就像一个硬盘,对磁盘阵列的操作与单个硬盘是一模一样的。

RAID级别
1、目前共有0-6共7种基本的RAID级别;
2、常用的RAID级别是level 0 , level 1 和level 5 ;
3、需要RAID控制器(一种PC适配器)来管理硬盘;
4、Linux内核可以模拟RAID控制器,用来管理硬盘,但只支持级别 0 , 1 , 4 , 5 这四种级别。

RAID 0
RAID 0 又称为Striping , Raid 0 通过把连续的数据访问分散到多个磁盘上来提高存储性能,这样,数据请求就可以被多个磁盘执行属于它自己的那部分数据请求,这种数据上的并行操作可以充分利用总路线的带宽,显著提高磁盘整体存取。

RAID 1                        
RAID 1 又称为Mirror或Mirroring,它的宗旨是最大限度的保证用户数据的可用性和可修复性,RAID 1 的操作方式是把用户写入硬盘的数据百分之百地自动复制到另外的一个硬盘上,磁盘的利用率为(n-1)/n

RAID 5
RAID 5 不对存储的数据进行备份,而是把数据和相对应的奇偶校验信息存储到组成RAID5的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上。当RAID5的一个磁盘数据发生损坏后,利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。

RAID 0+1
是RAID 0 和RAID 1 的组合形式,也称为Raid 10 . 可以先做RAID 0 ,再做RAID 1 。

Linux 中的软件RAID
1、使用linux内核实现的软件Raid控制器
2、需要内核支持(一般都支持软件Raid)
3、需要相应的应用软件(raidtools)创建管理raid设备
4、软件RAID设备文件名:   /dev/mdN  (N=0,1,2,3…………)
5、软RAID设备可以当分区来看待,需要格式化后,挂载:

#mkfs.ext3 /dev/md0
#mount /dev/md0 /opt

参考文献:http://blog.163.com/leekwen@126/blog/static/33166229200952105318806/

mdadm工具介绍:
  描述:
    mdadm(multiple devices admin)是 linux下标准的的软raid管理工具,是一个模式化工具(在不同的模式下);程序工作在内存用户程序区,为用户提供RAID接口来操作内核的模块,实现各种功能;
RedHat已经内置了该工具;官方最新的版本应该是3.2,需要最新版本可以到官方网站下载或http://www.kernel.org/pub/linux/utils/raid/mdadm/下载源码包进行编译安装(官网一直打不开o(╯□╰)o).
 

 实验环境:RedHhat5.4 ;mdadm版本为v2.6.9 ;

   可能不同的版本选项等略有变动,使用时请注意对照自己版本的man文档;

基本语法:
  # mdadm [mode] <raid-device> [options] <component-devices>

目前支持的模式:
  LINEAR(线性模式)、RAID0(striping条带模式)、RAID1(mirroring)、 RAID-4、RAID-5、 RAID-6、 RAID-10、 MULTIPATH和FAULTY
  LINEAR:线性模式,该模式不是raid的标准模式,其主要作用是可以实现将几块小的硬盘组合为一块大硬盘来使用;数组存储时一次存满一个硬盘在使用下一个硬盘;对上层来说操作的是一个大硬盘

模式(7种):
   Assemble:装配模式:加入一个以前定义的阵列;可以使挺值得阵列或从其他主机移出的阵列
   Build:  创建:创建一个没有超级块的阵列
   Create: 创建一个新的阵列,每个设备具有超级块
   Follow or Monitor: 监控RAID的状态,一般只对RAID-1/4/5/6/10等有冗余功能的模式来使用
   Grow:(Grow or shrink) 改变RAID的容量或阵列中的设备数目;收缩一般指的是数据收缩或重建;
   Manage: 管理阵列(如添加spare盘和删除故障盘)
   Incremental Assembly:添加一个设备到一个适当的阵列。
   Misc:  允许单独对阵列中的某个设备进行操作(如抹去superblocks 或停止阵列)
   Auto-detect: 此模式不作用于特定的设备或阵列,而是要求在Linux内核启动任何自动检测到的阵列。

OPTIONS:

 

选择一个模式的选项:(Options for selecting a mode)
-A, --assemble:
 加入并开启一个以前定义的阵列
-B, --build:   创建一个没有超级块的阵列(Build a legacy array without superblocks.)
-C, --create:  创建一个新的阵列
-F, --follow, --monitor:选择监控(Monitor)模式
-G, --grow:   改变激活阵列的大小或形态
-I, --incremental: 添加一个单独的设备到合适的阵列,并可能启动阵列
--auto-detect:   请求内核启动任何自动检测到的阵列

不特定于一个模式的选项:(Options that are not mode-specific)
-c, --config=:
 指定配置文件,缺省为 /etc/mdadm.conf
-s, --scan:  扫描配置文件或 /proc/mdstat以搜寻丢失的信息。默认配置文件:/etc/mdadm.conf
-h, --help:  帮助信息,用在以上选项后,则显示该选项信息
-v, --verbose: 显示细节,一般只能跟 --detile 或 --examine一起使用,显示中级的信息;
-b, --brief:  较少的细节。用于 --detail 和 --examine 选项
--help-options: 显示更详细的帮助
-V, --version: 版本信息
-q,--quit:   安静模式;加上该选项能使mdadm不显示纯消息性的信息,除非那是一个重要的报告;

create build 或grow时使用的选项:
-n, --raid-devices=: 
指定阵列中活动的device数目,不包括spare磁盘,这个数目只能由--grow修改
-x, --spare-devices=:指定初始阵列的冗余device 数目即spare device数目;
-c, --chunk=:  Specify chunk size of kibibytes. 缺省为 64. chunk-size是一个重要的参数,决定了一次向阵列中每个磁盘写入数据的量

  (Chunk :,可以理解为raid分储数据时每个数据段的大小(通常为32/64/128等这类数字大小);合理的选择chunk大小非常重要,若chunk过大可能一块磁盘上的带区空间就可以满足大部分的I/O操作,使得数据的读写只局限于一块硬盘上,这便不能充分发挥RAID并发的优势;如果chunk设置过小,任何很小的I/O指令都
可能引发大量的读写操作,不能良好发挥并发性能,占用过多的控制器总线带宽,也影响了阵列的整体性能。所以,在创建带区时,我们应该根据实际应用的需要,合理的选择带区大小。)


-z, --size=:
组建RAID1/4/5/6后从每个device获取的空间总数;但是大小必须为chunk的倍数,还需要在每个设备最后给RAID的superblock留至少128KB的大小。
--rounding=: Specify rounding factor for linear array (==chunk size)
-l, --level=: 设定 raid level.raid的几倍
--create:   可用:linear, raid0, 0, stripe, raid1,1, mirror, raid4, 4, raid5, 5, raid6, 6, multipath, mp.
--build:   可用:linear, raid0, 0, stripe.
-p, --layout=:设定raid5 和raid10的奇偶校验规则;并且控制故障的故障模式;其中RAID-5的奇偶校验可以在设置为::eft-asymmetric, left-symmetric, right-asymmetric, right-symmetric, la, ra, ls, rs.缺省为left-symmetric
--parity:   类似于--layout=
--assume-clean:目前仅用于 --build 选项
-R, --run:  阵列中的某一部分出现在其他阵列或文件系统中时,mdadm会确认该阵列。此选项将不作确认。
-f, --force: 通常mdadm不允许只用一个device 创建阵列,而且此时创建raid5时会使用一个device作为missing drive。此选项正相反
-N,--name=: 设定阵列的名称

管理模式选项(For Manage mode):
-a, --add:
 添加列出的设备到一个工作的阵列中;当阵列处于降级状态(故障状态),你添加一个设备,该设备将作为备用设备并且在该备用设备上开始数据重建。
-r, --remove:从阵列中移除列出的设备,并且该设备不能处于活动状态(是冗余盘或故障盘);
-f,--fail:将列出的设备标记为faulty状态,标记后就可以移除设备;(可以作为故障恢复的测试手段)
--set-faulty:同上


监控模式选项(For Monitor mode):
-m, --mail:
 设置一个mail地址,在报警时给该mail发信;该地址可写入conf文件,在启动阵列是生效
-p, --program, --alert:当检测到一个事件时运行一个指定的程序
-y, --syslog: 设置所有的事件记录于syslog中
-t, --test:  给启动时发现的每个阵列生成test警告信息;该信息传递给mail或报警程序;(以此来测试报警信息是否能正确接收)
    
MISC模式选项:
  Usage: mdadm options ...  devices ...
-Q, --query: 查看一个device,判断它为一个 md device 或是 一个 md 阵列的一部分
-D, --detail: 打印一个或多个md device 的详细信息
-E, --examine:打印 device 上的 md superblock 的内容


创建一个软RAID的基本过程:

(以三个分区模拟创建一个raid5为操作示例,对于level0/1的How-To不再写出,如果理解原理,配置真的很简单;)
1.  生成raid组成:
  linux中阵列组成单元是分区,分区可以是整个设备也可以是设备多个分区中的一个;在fdisk分区后需要将分区标志改为Linux raid auto类型;

  1. # 分区后如下:
  2. Device  Boot      Start         End      Blocks   Id  System 
  3. /dev/sdb1               1         609     4891761   fd  Linux raid autodetect 
  4. /dev/sdc1               1         609     4891761   fd  Linux raid autodetect 
  5. /dev/sdd1               1         609     4891761   fd  Linux raid autodetect 

2.  建立磁盘阵列

  1. # mdadm -C /dev/md0 -a yes -l 5 -n 3 /dev/sd{b,c,d}1 
  2. mdadm: array /dev/md0 started. 
  3.  
  4. -C :创建一个阵列,后跟阵列名称
  5. -l :指定阵列的级别;
  6. -n :指定阵列中活动devices的数目
  7.  

3.  查看阵列状态

  1. [root@bogon ~]# cat /proc/mdstat  
  2. Personalities : [raid6] [raid5] [raid4]  
  3. md0 : active raid5 sdd1[2] sdc1[1] sdb1[0] 
  4.       9783296 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU] 
  5. unused devices: <none> 
  6.  

  通过cat /proc/mdstat信息查看所有运行的RAID阵列的状态,在第一行中首先是MD的设备名md0,active和inactive选项表示阵列是否能读/写,接着是阵列的RAID级别raid5,后面是属于阵列的块设备,方括号[]里的数字表示设备在阵列中的序号,(S)表示其是热备盘,(F)表示这个磁盘是 faulty状态。下一行中首先是阵列的大小,用块数来表示;后面有chunk-size的大小,然后是layout类型,不同RAID级别的
layout类型不同,[3/3] [UUU]表示阵列有3个磁盘并且3个磁盘都是正常运行的,而[2/3]和[_UU] 表示阵列有3个磁盘中2个是正常运行的,下划线对应的那个位置的磁盘是faulty状态的。

  1. 查看阵列的详细信息:
  2. [root@bogon ~]# mdadm --detail /dev/md0 
  3. /dev/md0: 
  4.         Version : 0.90 
  5.   Creation Time : Tue Mar 15 08:17:52 2011 
  6.      Raid Level : raid5 
  7.      Array Size : 9783296 (9.33 GiB 10.02 GB) 
  8.   Used Dev Size : 4891648 (4.67 GiB 5.01 GB) 
  9.    Raid Devices : 3 
  10.   Total Devices : 3 
  11. Preferred Minor : 0 
  12.     Persistence : Superblock is persistent 
  13.  
  14.     Update Time : Tue Mar 15 08:20:25 2011 
  15.           State : clean 
  16.  Active Devices : 3 
  17. Working Devices : 3 
  18.  Failed Devices : 0 
  19.   Spare Devices : 0 
  20.  
  21.          Layout : left-symmetric  校验规则
  22.      Chunk Size : 64K 
  23.  
  24.            UUID : e0d929d1:69d7aacd:5ffcdf9b:c1aaf02d 
  25.          Events : 0.2 
  26.  
  27.     Number   Major   Minor   RaidDevice State 
  28.        0       8       17        0      active sync   /dev/sdb1 
  29.        1       8       33        1      active sync   /dev/sdc1 
  30.        2       8       49        2      active sync   /dev/sdd1 
  31.  

4. mdadm.conf配置:
   mdadm.conf是该软件的默认配置文件,主要作用是方便跟踪软RAID的配置,尤其是可以配置监视和事件上报选项。其中写入每一个阵列组成的详细情况,用于在下次开启阵列后依据此文件重新装配(assemble)开启阵列,否则就需要在开启时手动定义阵列中的成员;当然是推荐创建该文件,防止出现意外情况,具体的详细配置及示例可以参看man文档# man mdadm.conf 
 

  1. [root@bogon ~]# echo "DEVICE /dev/sdb1 /dev/sdc1 /dev/sdd1 " >> /etc/mdadm.conf  
  2. [root@bogon ~]# mdadm -Ds >> /etc/mdadm.conf   
  3. [root@bogon ~]# echo "MAILADDR mospiral@gmail.com" >> /etc/mdadm.conf   
  4.  MAILADDR指定出问题时监控系统发邮件的地址 
  5.  
  6. # 格式如下: 
  7. DEVICE /dev/sdb1 /dev/sdc1 /dev/sdd1  
  8. ARRAY /dev/md0 level=raid5 num-devices=3 metadata=0.90 UUID=e0d929d1:69d7aacd:5ffcdf9b:c1aaf02d 
  9. MAILADDR mospiral@gmail.com 
  10. #DEVICE行指明:依据该配置文件开启阵列时,去查找那些设备的超级快信息;若没有该行,
  11. 就去搜索mtab中所有设备分区的超级快信息;所以改行可以不写,但是只要写上,以后添加spare
  12. 设备时就需要同时修改改行信息;
  13. #ARRAY 行指明raid的名称,级别uuid等基本信息
  14. #可以添加诸如MAILADDR及PROGRAM等指定monitor状态下的监控报警信息;

 

磁盘阵列的管理:
  可以在manage模式下对磁盘进行各种管理工作;
 

给raid-5新增一个spare盘:

  1. [root@bogon ~]# mdadm -a /dev/md0 /dev/sda5  
  2. mdadm: added /dev/sda5 
  3.  
  4. 此时查看状态: 
  5. [root@bogon ~]# cat /proc/mdstat  
  6. Personalities : [raid6] [raid5] [raid4]  
  7. md0 : active raid5 sda5[3](S) sdd1[2] sdc1[1] sdb1[0] 
  8.       9783296 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU] 
  9.        
  10. unused devices: <none> 
  11.  

模拟硬盘故障:

 
  1. [root@bogon ~]# mdadm -f /dev/md0  /dev/sdd1 
  2. mdadm: set /dev/sdd1 faulty in /dev/md0 
  3.  
  4. # 此时查看状态,发现概念刚才的热备盘已经顶替了故障盘的位置,
  5. # 并且进度条显示数据重建过程: 
  6. [root@bogon ~]# cat /proc/mdstat  
  7. Personalities : [raid6] [raid5] [raid4]  
  8. md0 : active raid5 sda5[3] sdd1[4](F) sdc1[1] sdb1[0] 
  9.       9783296 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_] 
  10.       [>....................]  recovery =  1.3% (66912/4891648) finish=6.0min speed=13382K/sec 
  11.        
  12. unused devices: <none> 
  13.  

 

热移除故障的硬盘:

  1. [root@bogon ~]# mdadm -r /dev/md0  /dev/sdd1 
  2. mdadm: hot removed /dev/sdd1 
  3. [root@bogon ~]# cat /proc/mdstat  
  4. Personalities : [raid6] [raid5] [raid4]  
  5. md0 : active raid5 sda5[3] sdc1[1] sdb1[0] 
  6.       9783296 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_] 
  7.       [===>.................]  recovery = 16.1% (792136/4891648) finish=4.6min speed=14828K/sec 
  8.        
  9. unused devices: <none> 
  10.  

  对于有冗余的raid形式,在单一磁盘故障时一般能在一段时间内重建数据;但是数据量非常大时,重建会非常缓慢,且重建过程系统压力比较大,此时需要多关注系统负载,防止重建过程出现错误;在热移除故障盘一户,也需要尽快的换上新硬盘,并且添加spare盘;在故障修复,重建重建之后,需要重新生成配置文件,防止在下次开启时,按照最初的定义模式开启;
 

停止RAID:

  1. # 指定停止某个阵列 
  2. [root@bogon ~]# mdadm -S /dev/md0  
  3.          
  4. # 停止配置文件中定义的所有阵列 
  5. [root@bogon ~]# mdadm -Ss 
  6. mdadm: stopped /dev/md0 
  7. # -s –scan去查询配置文件或没有配置文件时查询mdstat中的所有阵列
  8.  

 

开启RAID:

  1. [root@bogon ~]# mdadm -As  
  2. mdadm: /dev/md0 has been started with 2 drives (out of 3). 
  3. # -s –scan:根据配置文件开启所有的阵列,此时由于故障恢复过,
  4. # 但是由于未重建配置文件,阵列我不能加载上新添加的硬盘;(需要停掉,重新手动指定) 
  5.  
  6. [root@bogon ~]# cat /proc/mdstat  
  7. Personalities : [raid6] [raid5] [raid4]  
  8. md0 : active raid5 sdb1[0] sdc1[1] 
  9.       9783296 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_] 
  10. unused devices: <none> 
  11.  
  12. 若此时没有配置文件,就需要手动指定设备名称: 
  13. [root@bogon ~]# mdadm -A  /dev/md0 /dev/sdb1 /dev/sdc1  /dev/sda5  
  14. mdadm: /dev/md0 has been started with 3 drives. 
  15. # 注:将一个raid设备添加入md阵列后,md的信息会写入到该设备分区的superblock中;
  16. # 在手动装配时;mdadm工具会自动验证阵列配置是否合法,并且做出相应的动作;

  若新接手一个raid,没有配置文件,或忘记设备的准确组成,就需要按分区逐个检查是否是raid设备及其他信息,然后根据信息装配阵列:

  1. [root@bogon ~]# mdadm -E /dev/sdb1 
  2. /dev/sdb1: 
  3.           Magic : a92b4efc 
  4.         Version : 0.90.00 
  5.            UUID : e0d929d1:69d7aacd:5ffcdf9b:c1aaf02d 
  6.   Creation Time : Tue Mar 15 08:17:52 2011 
  7.      Raid Level : raid5 
  8.   Used Dev Size : 4891648 (4.67 GiB 5.01 GB) 
  9.      Array Size : 9783296 (9.33 GiB 10.02 GB) 
  10.    Raid Devices : 3 
  11.   Total Devices : 3 
  12. Preferred Minor : 0 
  13.  
  14.     Update Time : Tue Mar 15 09:25:10 2011 
  15.           State : clean 
  16.  Active Devices : 3 
  17. Working Devices : 3 
  18.  Failed Devices : 0 
  19.   Spare Devices : 0 
  20.        Checksum : b0cd088f - correct 
  21.          Events : 8 
  22.  
  23.          Layout : left-symmetric 
  24.      Chunk Size : 64K 
  25.  
  26.       Number   Major   Minor   RaidDevice State 
  27. this     0       8       17        0      active sync   /dev/sdb1 
  28.  
  29.    0     0       8       17        0      active sync   /dev/sdb1 
  30.    1     1       8       33        1      active sync   /dev/sdc1 
  31.    2     2       8        5        2      active sync   /dev/sda5 
  32. # 该处显示出的是该分区superblock中包含的md信息;没有配置文件时,可以依据该信息装配md;

 

删除阵列:

   若需要彻底清除这个阵列:

  1. [root@bogon ~]# umount /dev/md0    
  2. mdadm -Ss /dev/md0    
  3. [root@bogon ~]# mdadm --zero-superblock /dev/sd{b,c,d}1    
  4. # --zero-superblock 加上该选项时,会判断如果该阵列是否包 
  5. # 含一个有效的阵列超级快,若有则将该超级块中阵列信息抹除。  
  6. [root@bogon ~]# rm /etc/mdadm.conf  

RAID优化:

 (1) 设置stride值

 

 The stride is the software RAID device's chunk-size in filesystem blocks.For example,with an ext3 filesystem that will have an 4KB block size on a RAID device with a chunk-size of 64KB, the stride should be set to 16:(翻译的很纠结,就贴上教材原文了。)

  1. mk2fs -j -b 4096 -E stride=16 /dev/md0 
  2. # 设置时,需要用-E选项进行扩展
  3.  

 设定良好的stride值,可以在后期使用时,减少写入数据时对数据块计算的负担,从而提高RAID性能;

附:RAID 1-0双层架构的方法:

 首先创建两个底层RAID-1

  1. [root@bogon ~]# mdadm -C /dev/md0 -a yes -l 1 -n 2 /dev/sd[bc]1  
  2. mdadm: array /dev/md0 started. 
  3. [root@bogon ~]# mdadm -C /dev/md1 -a yes -l 1 -n 2 /dev/sd[bc]2 
  4.  
  5. mdadm: array /dev/md1 started. 

 用两个RAID-1实现上层RAID-0:

  1. [root@bogon ~]# mdadm -C /dev/md2 -a yes -l 0 -n 2 /dev/md[01]   
  2. mdadm: array /dev/md2 started. 
  3.  

 查看阵列状态:

  1. [root@bogon ~]# cat /proc/mdstat  
  2. Personalities : [raid6] [raid5] [raid4] [raid0] [raid1]  
  3. md2 : active raid0 md0[0] md1[1] 
  4.       9783232 blocks 64k chunks 
  5.        
  6. md1 : active raid1 sdb2[0] sdc2[1] 
  7.       4891712 blocks [2/2] [UU] 
  8.        
  9. md0 : active raid1 sdb1[0] sdc1[1] 
  10.       4891648 blocks [2/2] [UU] 
  11.        
  12. unused devices: <none> 
  13.  

 创建配置文件:

  1. [root@bogon ~]# mdadm -Ds > /etc/mdadm.conf 

 停止与开启阵列:

  1. [root@bogon ~]# mdadm -Ss 
  2. mdadm: stopped /dev/md2 
  3. mdadm: stopped /dev/md1 
  4. mdadm: stopped /dev/md0 
  5. [root@bogon ~]# mdadm -As 
  6. mdadm: /dev/md0 has been started with 2 drives. 
  7. mdadm: /dev/md1 has been started with 2 drives. 
  8. mdadm: /dev/md2 has been started with 2 drives. 
  9. ##上述关闭与开启过程,系统能只能识别层级,关闭先关闭上层,
  10. ##后开启上层;防止了冲突;
  11.  

 

参考:

  软RAID0的技术概要及实现 : http://www.linuxsir.org/main/node/279

  维基百科--RAID :  http://zh.wikipedia.org/zh-cn/Raid 

    http://www.linuxidc.com/Linux/2009-12/23394p6.htm

抱歉!评论已关闭.