Chinaunix首页 | 论坛 | 博客
  • 博客访问: 181414
  • 博文数量: 39
  • 博客积分: 2604
  • 博客等级: 少校
  • 技术积分: 430
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-24 13:32
文章分类

全部博文(39)

文章存档

2010年(1)

2009年(16)

2008年(22)

分类: LINUX

2009-10-27 16:28:51

用mdadm构建软RAID(基础篇)
                                       
基于网上的一些资料,整理了一下,其中不妥之处欢迎指正,在此希望能抛砖引玉:

1. RAID 简介
RAID是英文Redundant Array of Inexpensive Disks的缩写,中文名字为磁盘冗余阵列,顾名思义它是由磁盘组成阵列而成的。
简单地说,RAID就是一种把多块独立的硬盘(物理硬盘)按不同方式组合起来的一个硬盘组(逻辑硬盘),提供比单个硬盘更高的存储性能和数据冗余的技术,既保证了存取数据的快捷方便和管理客户端的简捷,也解决了存储海量数据的问题,同时提供了容错性(Fault Tolerant)。它可以在不须停机的情况下自动检测故障硬盘、进行硬盘替换,还可以扩充硬盘容量、重建故障硬盘上的数据。
目前最流行的是RAID 0,RAID 1,RAID 5。其中RAID1和RAID 5过多的用于保证数据的安全,最大程度的防止磁盘意外坏掉而丢失数据情况的发生。


RAID0 : 是最早的RAID。Level 0即RAID 0级,通常称为带区,是利用带区数据映射技巧的特定性能。也就是说,当数据写入磁盘组的时候,被分成带区,交错写入磁盘组的磁盘中。这带来了高I/O性能,低开销,但不提供魏稳哂唷4排套榈拇娲⒘康扔谧艿母鞔排倘萘恐 汀?br />特征:并行读写数据,性能高,但没有数据冗余,阵列中任何一个硬盘坏掉,意味着所有数据丢失
容量:所有硬盘容量之和
条件:至少两块硬盘,做为RAID的分区大小必须是几乎相同的.

RAID1: Level 1即RAID 1级,它就是常常提到的镜像RAID,相比其它各级别RAID来说,这个级别使用的时间较长。RAID 1通过把同样的数据写到磁盘组的每一个磁盘上,将"镜像"复制到每个磁盘上,来提供数据冗余。镜像由于它的简单实现和数据的高可信度而一直很受欢迎。 1级在读数据操作时,并行处理2个或更多的磁盘,因此数据传输速率高, 但是其它的操作时无法提供高速的I/O传输速率。1级提供了非常好的数据的高可信度,并且改善了读数据操作的性能,但是耗费很大。要求组成磁盘组的各磁盘规格相同,而组成后磁盘组的容量仅仅等于一块磁盘的容量。

特征:数据冗余,可靠性强。任何一块硬盘坏掉,不会丢失数据。写入慢,读取快。
容量:所有硬盘容量之和/2。(冗余度 50%)
条件:至少两块硬盘,做为RAID的分区大小必须是几乎相同的.

RAID5: 服务器最常用的RAID级别,该级别的RAID是通过把奇偶校验分布到磁盘组中的一些或所有磁盘上,5级常使用缓冲技术来降低性能的不对称性。如果组成磁盘组的各磁盘规格相同,磁盘组容量等于磁盘的总容量,减去一块磁盘的容量。
如果出现两个以上硬盘出现问题时,数据是不能得到有效的保护的。也就是说RAID 5只能在其中一块硬盘出问题时保证数据完好。
特征:采用奇偶效验,可靠性强。只有当两块硬盘坏掉时才会丢失数据。并行读写数据,性能也很高。
容量:所有硬盘容量-1个硬盘容量
条件:至少三块硬盘,做为RAID的分区大小必须是几乎相同的。
   

RAID 0+1: RAID 0和RAID 1的组合
特征:数据冗余,可靠性强。任何一块硬盘坏掉,不会丢失数据。写入慢,读取快。
容量:所有硬盘容量之和/2。(冗余度 50%)
条件:至少四块硬盘,做为RAID的分区大小必须是几乎相同的.

这里有个的flash做的比较直观形象,大家可以look一下:)


2.首要条件:
2.1 编译mdadm:
mdadm是linux下用于管理软件 RAID 的工具, 可以到这里下载最新的mdadm源码包;值得一提的是,它是基于分区级的,而非是硬盘级的;也就是说如果要建RAID1,你只需两个容量相等的分区就可以了,而不一定是两个容量相等的硬盘,同样这两个分区可以存在于同一硬盘上,不过这样做的意义不大,但用于练练手,还是可以的:)
# tar xvzf mdadm-2.4.tgz
# cd mdadm-2.4
# make
# make install ( or cp -R mdadm /usr/sbin)

2.2 编译kernel:
在编译kernel时,选中对RAID的支持,可以编译成模块或直接编进kernel:
# cd kernel-source-dir
# make menuconfig
Device Drivers --->
      Multi-device support (RAID and LVM)     --->
          [*] Multiple devices driver support (RAID and LVM)   
             <*>     RAID support                                                 
                 Linear (append) mode                                        
                 RAID-0 (striping) mode                                    
                  RAID-1 (mirroring) mode      
                 RAID-10 (mirrored striping) mode (EXPERIMENTAL)   
                 RAID-4/RAID-5 mode     
                 RAID-6 mode        
                 Multipath I/O support    
# make  
# make modules_install
# make install

3.mdadm用法
基本语法 : mdadm [mode] [options]

mode     有7种:
      Assemble:将以前定义的某个阵列加入当前在用阵列。
      Build:Build a legacy array ,每个device 没有 superblocks
     Create:创建一个新的阵列,每个device 具有 superblocks
     Manage: 管理阵列,比如 add 或 remove
     Misc:允许单独对阵列中的某个 device 做操作,比如抹去superblocks 或 终止在用的阵列。
     Follow or Monitor:监控 raid 1,4,5,6 和 multipath 的状态
     Grow:改变raid 容量或 阵列中的 device 数目
可用的 [options]:
-A, --assemble:加入一个以前定义的阵列
-B, --build:Build a legacy array without superblocks.
-C, --create:创建一个新的阵列
-Q, --query:查看一个device,判断它为一个 md device 或是 一个 md 阵列的一部分
-D, --detail:打印一个或多个 md device 的详细信息
-E, --examine:打印 device 上的 md superblock 的内容
-F, --follow, --monitor:选择 Monitor 模式
-G, --grow:改变在用阵列的大小或形态
-h, --help:帮助信息,用在以上选项后,则显示该选项信息
--help-options
-V, --version
-v, --verbose:显示细节
-b, --brief:较少的细节。用于 --detail 和 --examine 选项
-f, --force
-c, --config= :指定配置文件,缺省为 /etc/mdadm.conf
-s, --scan:扫描配置文件或 /proc/mdstat以搜寻丢失的信息。配置文件/etc/mdadm.conf

mdadm.conf 格式:
DEVICE     所用到的设备分区列表(在mdadm扫描时,将扫描这些分区)
ARRAY      定义实际的磁盘阵列
简单实例:
DEVICE /dev/sda10 /dev/sda11 /dev/sdb10 /dev/sdb11
ARRAY /dev/md0 devices=/dev/sda11, /dev/sda10

4.实战RAID
下面将通过实际操作,创建一个RAID1:
4.1 格式化待做软RAID的分区:
准备两个待做RAID1的分区/dev/sda10, /dev/sdb10:
要求: 大小近乎相等,格式为Linux raid autodetect (即:fd);
# fdisk /dev/sda
The number of cylinders for this disk is set to 9964.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
      (e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): n
Command action
      l      logical (5 or over)
      p      primary partition (1-4)
l
First cylinder (1012-9964, default 1012):
Using default value 1012
Last cylinder or +size or +sizeM or +sizeK (1012-1039, default 1012): 1025
Command (m for help): p
Disk /dev/sda: 81.9 GB, 81964302336 bytes
255 heads, 63 sectors/track, 9964 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
      Device Boot       Start          End       Blocks      Id     System
/dev/sda1            1           9964       80035798+      5     Extended
/dev/sda5          917            927          88326       7     HPFS/NTFS
/dev/sda6          928            996         554211       b     Win95 FAT32
/dev/sda7          997           1011         120456       7     HPFS/NTFS
/dev/sda8         1040           9964       71690031      83     Linux
/dev/sda9            1            916        7357707      83     Linux
/dev/sda10        1012           1025         112423+     83     Linux
Partition table entries are not in disk order
Command (m for help): t       (更改分区类型)
Partition number (1-10): 10   
Hex code (type L to list codes): fd     (分区类型为 Linux raid autodetect)
Command (m for help): w       (保存退出)
# fdisk -l /dev/sda
Disk /dev/sda: 81.9 GB, 81964302336 bytes
255 heads, 63 sectors/track, 9964 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
      Device Boot       Start          End       Blocks      Id     System
/dev/sda1            1           9964       80035798+      5     Extended
/dev/sda5            917            927          88326       7     HPFS/NTFS
/dev/sda6            928            996         554211       b     Win95 FAT32
/dev/sda7            997           1011         120456       7     HPFS/NTFS
/dev/sda8           1040           9964       71690031      83     Linux
/dev/sda9             1            916        7357707      83     Linux
/dev/sda10         1012      1025        112423+     fd     Linux raid autodetect

Partition table entries are not in disk order
同样创建另一分区/dev/sdb10
# fdisk -l /dev/sdb
Disk /dev/sdb: 81.9 GB, 81964302336 bytes
255 heads, 63 sectors/track, 9964 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
      Device Boot       Start          End       Blocks      Id     System
/dev/sdb2         4501           9964       43889580       5     Extended
/dev/sdb3          667           4500       30796605      83     Linux
/dev/sdb4          658            666          72292+     83     Linux
/dev/sdb5         5114           5362        2000061      83     Linux
/dev/sdb6         5751           5878        1028128+     83     Linux
/dev/sdb7         5721           5750         240943+     83     Linux
/dev/sdb8         5620           5720         811251      83     Linux
/dev/sdb9         6261           9964       29752348+     83     Linux
/dev/sdb10        4501           4514     112423+     fd     Linux raid autodetect

Partition table entries are not in disk order
4.2 创建RAID 1:
#modprobe raid1.ko
#mdadm -C --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sda10 /dev/sdb10
#或 mdadm -Cv /dev/md0 -l1 -n2 /dev/sda10 /dev/sdb10
mdadm: chunk size defaults to 64K
mdadm: /dev/sda10 appears to contain an ext2fs file system
       size=112320K     mtime=Sat Jan     1 06:39:59 2000
mdadm: /dev/sdb10 appears to be part of a raid array:
       size=112320K ctime=Sat Jan     1 02:45:14 2000
Continue creating array? y
mdadm: array /dev/md0 started.
# mkfs.ext3 /dev/md0     (格式化raid)
      mke2fs 1.37 (21-Mar-2005)
Filesystem label=
OS type: Linuxmk
Block size=1024 (log=0)
Fragment size=1024 (log=0)
28112 inodes, 112320 blocks
5616 blocks (5.00%) reserved for the super user
First data block=1
14 block groups
8192 blocks per group, 8192 fragments per group
2008 inodes per group
Superblock backups stored on blocks:
           8193, 24577, 40961, 57345, 73729
Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first.     Use tune2fs -c or -i to override.

# mdadm -D /dev/md0 (查看raid信息)
/dev/md0:
           Version : 00.90.01
     Creation Time : Sat Jan     1 02:45:14 2000
        Raid Level : raid1
        Array Size : 112320 (109.71 MiB 115.02 MB)
       Device Size : 112320 (109.71 MiB 115.02 MB)
      Raid Devices : 2
     Total Devices : 2
Preferred Minor : 0
       Persistence : Superblock is persistent

       Update Time : Sat Jan     1 05:08:27 2000
             State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
     Spare Devices : 0

              UUID : 797b80d8:4b70e2d1:7e427c7e:c9546d1b
            Events : 0.10

       Number      Major      Minor      RaidDevice State
          0          8          10           0         active sync      /dev/sda10
          1          8          26           1         active sync      /dev/sdb10

# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sda10[0] sdb10[1]
         112320 blocks [2/2] [UU] raid autodetect
unused devices:

# mount /dev/md0     /share/raid     (挂载raid)
# cp /share/partitionA2 /share/raid
# ls /share/raid
lost+found                       asdf.asf
netatalk.tar
# umount /share/raid
# mdadm     /dev/md0 -r /dev/sda10     (将sda10从raid中移除)
# mdadm -D /dev/md0
/dev/md0:
           Version : 00.90.01
     Creation Time : Sat Jan     1 02:45:14 2000
        Raid Level : raid1
        Array Size : 112320 (109.71 MiB 115.02 MB)
       Device Size : 112320 (109.71 MiB 115.02 MB)
      Raid Devices : 2
     Total Devices : 1
Preferred Minor : 0
       Persistence : Superblock is persistent

       Update Time : Sat Jan     1 05:30:28 2000
             State : clean, degraded
Active Devices : 1
Working Devices : 1
Failed Devices : 0
     Spare Devices : 0

              UUID : 797b80d8:4b70e2d1:7e427c7e:c9546d1b
            Events : 0.52

       Number      Major      Minor      RaidDevice State
          0          0           0           0         removed
          1          8          26           1         active sync      /dev/sdb10

# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb10[1]
         112320 blocks [2/1] [_U]
      
unused devices:
将sda10的分区类型改为linux (即83),然后重启,重新挂载,查看分区里的文件:
# fdisk /dev/sda
t-->11 --> 83 --> w
# reboot
# mount /dev/sda10 /share/partition
# ls /share/partition
lost+found                       asdf.asf
netatalk.tar
和原来作为raid时的内容完全一样,说明raid1 的确是在每个硬盘都写入数据,有较高的可靠性。
4.3 数据恢复:
下面在sda上新建另一分区,sda11,并把它作为raid1的一个分区,即替代原来的sda10;
# mdadm /dev/md0 -a /dev/sda11
mdadm: hot added /dev/sda1
# mdadm -D /dev/md0
/dev/md0:
           Version : 00.90.01
     Creation Time : Sat Jan     1 02:45:14 2000
        Raid Level : raid1
        Array Size : 112320 (109.71 MiB 115.02 MB)
       Device Size : 112320 (109.71 MiB 115.02 MB)
      Raid Devices : 2
     Total Devices : 3
Preferred Minor : 0
       Persistence : Superblock is persistent

       Update Time : Sat Jan     1 05:50:00 2000
             State : clean
Active Devices : 2
Working Devices : 3
Failed Devices : 0
     Spare Devices : 1

              UUID : 797b80d8:4b70e2d1:7e427c7e:c9546d1b
            Events : 0.111

       Number      Major      Minor      RaidDevice State
          0          8          11           0         active sync      /dev/sda11
          1          8          26           1         active sync      /dev/sdb10

# mount /dev/md0 /share/raid
# ls /share/raid
lost+found                       asdf.asf
netatalk.tar

4.4 其他操作:
# mdadm -S /dev/md0 (停止raid)
# mdadm ?As /dev/md0 (根据mdadm.conf文件启动raid)
# modprobe raid0.ko
# lsmod
raid0 5984 0 - Live 0xbf000000

# mdadm -C --verbose /dev/md0 -l0 -n2 /dev/sda11 /dev/sdb11 (raid0)

# modprobe xor.ko
# modprobe raid5.ko
# lsmod
Module                     Size     Used by       Not tainted
raid5 20544 0 - Live 0xbf006000
xor 5544 1 raid5, Live 0xbf003000
raid0 5984 0 - Live 0xbf000000
# mdadm -C --verbose /dev/md0 -l5 -n3 /dev/sda10 /dev/sda11 /dev/sdb11         (raid5)


 

转自:http://hi.baidu.com/administratorroot/blog/item/dc7742f3bce09fca0a46e0c2.html

阅读(1298) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~