Chinaunix首页 | 论坛 | 博客
  • 博客访问: 511168
  • 博文数量: 119
  • 博客积分: 5054
  • 博客等级: 大校
  • 技术积分: 1305
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-03 13:13
文章分类

全部博文(119)

文章存档

2011年(4)

2010年(115)

我的朋友

分类: 服务器与存储

2010-01-04 13:06:41

摘自《LINUX系统管理技术手册》

硬盘会频繁出现故障,即便当前有备份,在服务器上出现硬盘故障造成的后果也是灾难性的。RAID(独立磁盘的冗余阵列,Redundant Array of Independent Disk)是一个使用多个硬盘,在几块硬盘上分散存储或者重复存储数据的系统。RAID不仅有助于避免数据丢失,还能把因为硬件故障造成的停机时间减少到最小(通常降低到0),同时还有可能提高性能。RAID系统可以由硬件实现,但是Linux系统用软件也实现了RAID所有必要组件。
第二个同样有用的工具叫做LVM(逻辑卷管理,logical volume managerment),它帮助系统管理员高效地在多个分区之间分配可用的硬盘空间。设想一下这样的情形:管理员没有准确地掌握一个分区确实需要多大,在创建分区半年之后发现这个分区太大了,可是相邻的分区却没有足够的空间。听上去是不是有点熟悉?LVM把空间动态地从富余的分区重新分配给不足的分区。
虽然这两种工具单独使用起来功能强大,但将它们组合使用尤其有效。本文将介绍这两种系统的概念,并且举例说明具体的配置。

linux的软RAID

RAID能够做两件基本的事情。首先,RAID通过把数据分散到多个硬盘上,因而能让多个硬盘同时工作提供或者读取一条数据流,所以可以提高性能。其次,RAID在多个硬盘上复制或者“镜像”数据,降低了由于一块硬盘发生故障带来的危险。linux的RAID和传统的RAID有些细微的不同之处,但是它在逻辑上仍然要分成几级。

  • 线性模式没有提供数据冗余性或者提高性能。这个模式仅仅把多个硬盘的块地址连到一起创建一个(更大的)虚拟硬盘。
  • RAID 0 只能提高性能。这个模式使用两个或者多个容量相同的硬盘来缩短写数据和访问时间。
  • RAID 1 是第一个能提供冗余性的级别。它同时在两个或者多个硬盘上复制数据。这个模式镜像数据却降低了性能,因为不止一次写数据。
  • RAID 4 能和RAID 5 竞争,但一贯不如RAID 5。这个模式把数据分片存储,但是需要用一个硬盘保存校验信息,因此会花时间等待写校验硬盘。除非有非常正当的理由使用RAID 4,否则不要管它,先选RAID 5。
  • RAID 5 是RAID的“世外桃源”。通过把数据和校验信息都分片存储,这个模式既创建了一种冗余结构,又同时降低了读写时间。RAID 5 需要至少3块硬盘。

RAID 5 的原理简而言之就是它依靠数据的校验码,而不是镜像文件来保证数据的可靠性。由于是多组数据对应于一组校验码,所以磁盘使用率高于Raid1,但可靠性比Raid1要差。RAID 5 的读写性能接近单盘性能。RAID 5 的校验码生成是依靠逻辑运算XOR(异或)。XOR有个特点,被称为循环对称性:如果 a XOR b XOR c = d,那么a = b XOR c XOR d;b = a XOR c XOR d;c = a XOR b XOR d。这也就是RAID 5 需要至少3块硬盘的原因了。

RAID0、RAID1、RAID0+1、RAID5原理介绍 (摘自网络,原作者不详)

RAID 0又称为Stripe或Striping,它代表了所有RAID级别中最高的存储性能。RAID 0提高存储性能的原理是把连续的数据分散到多个磁盘上存取,这样,系统有数据请求就可以被多个磁盘并行的执行,每个磁盘执行属于它自己的那部分数据请求。这种数据上的并行操作可以充分利用总线的带宽,显著提高磁盘整体存取性能

RAID 1又称为Mirror或Mirroring,它的宗旨是最大限度的保证用户数据的可用性和可修复性。 RAID 1的操作方式是把用户写入硬盘的数据百分之百地自动复制到另外一个硬盘上。由于对存储的数据进行百分之百的备份,在所有RAID级别中,RAID 1提供最高的数据安全保障。同样,由于数据的百分之百备份,备份数据占了总存储空间的一半,因而,Mirror的磁盘空间利用率低,存储成本高。

Mirror虽不能提高存储性能,但由于其具有的高数据安全性,使其尤其适用于存放重要数据,如服务器和数据库存储等领域。

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

RAID 5可以理解为是RAID 0和RAID 1的折衷方案。RAID 5可以为系统提供数据安全保障,但保障程度要比Mirror低而磁盘空间利用率要比Mirror高。RAID 5具有和RAID 0相近似的数据读取速度,只是多了一个奇偶校验信息,写入数据的速度比对单个磁盘进行写入操作稍慢。同时由于多个数据对应一个奇偶校验信息,RAID 5的磁盘空间利用率要比RAID 1高,存储成本相对较低。

RAID 0+1:正如其名字一样RAID 0+1是RAID 0和RAID 1的组合形式,也称为RAID 10。

RAID 0+1是存储性能和数据安全兼顾的方案。它在提供与RAID 1一样的数据安全保障的同时,也提供了与RAID 0近似的存储性能。

由于RAID 0+1也通过数据的100%备份提供数据安全保障,因此RAID 0+1的磁盘空间利用率与RAID 1相同,存储成本高。

RAID 0+1的特点使其特别适用于既有大量数据需要存取,同时又对数据安全性要求严格的领域,如银行、金融、商业超市、仓储库房、各种档案管理等。

RAID是通过磁盘阵列与数据条块化方法相结合, 以提高数据可用率的一种结构。IBM早于1970年就开始研究此项技术 。RAID 可分为RAID级别1到RAID级别6, 通常称为: RAID 0, RAID 1, RAID 2, RAID 3,RAID 4,RAID 5,RAID6。每一个RAID级别都有自己的强项和弱项. “奇偶校验”定义为用户数据的冗余信息, 当硬盘失效时, 可以重新产生数据。

RAID 0: RAID 0 并不是真正的RAID结构, 没有数据冗余。 RAID 0 连续地分割数据并并行地读/写于多个磁盘上。 因此具有很高的数据传输率。 但RAID 0在提高性能的同时,并没有提供数据可靠性,如果一个磁盘失效, 将影响整个数据.因此RAID 0 不可应用于需要数据高可用性的关键应用。

RAID 1: RAID 1通过数据镜像实现数据冗余, 在两对分离的磁盘上产生互为备份的数据。 RAID 1可以提高读的性能,当原始数据繁忙时, 可直接从镜像拷贝中读取数据.RAID 1是磁盘阵列中费用最高的, 但提供了最高的数据可用率。当一个磁盘失效, 系统可以自动地交换到镜像磁盘上, 而不需要重组失效的数据。

RAID 2: 从概念上讲, RAID 2 同RAID 3类似, 两者都是将数据条块化分布于不同的硬盘上, 条块单位为位或字节。然而RAID 2 使用称为“加重平均纠错码”的编码技术来提供错误检查及恢复。这种编码技术需要多个磁盘存放检查及恢复信息, 使得RAID 2技术实施更复杂。因此,在商业环境中很少使用。

RAID 3:不同于RAID 2, RAID 3使用单块磁盘存放奇偶校验信息。如果一块磁盘失效, 奇偶盘及其他数据盘可以重新产生数据。 如果奇偶盘失效,则不影响数据使用。RAID 3对于大量的连续数据可提供很好的传输率, 但对于随机数据, 奇偶盘会成为写操作的瓶颈。

RAID 4: 同RAID 2, RAID 3一样, RAID 4, RAID 5也同样将数据条块化并分布于不同的磁盘上, 但条块单位为块或记录。 RAID 4使用一块磁盘作为奇偶校验盘, 每次写操作都需要访问奇偶盘, 成为写操作的瓶颈。 在商业应用中很少使用。

RAID 5:RAID 5没有单独指定的奇偶盘, 而是交叉地存取数据及奇偶校验信息于所有磁盘上。 在RAID5 上, 读/写指针可同时对阵列设备进行操作, 提供了更高的数据流量。 RAID 5更适合于小数据块,随机读写的数据.RAID 3与RAID 5相比, 重要的区别在于RAID 3每进行一次数据传输,需涉及到所有的阵列盘。而对于RAID 5来说, 大部分数据传输只对一块磁盘操作, 可进行并行操作。在RAID 5中有“写损失”, 即每一次写操作,将产生四个实际的读/写操作, 其中两次读旧的数据及奇偶信息, 两次写新的数据及奇偶信息。

RAID 6:RAID 6 与RAID 5相比,增加了第二个独立的奇偶校验信息块。两个独立的奇偶系统使用不同的算法, 数据的可靠性非常高. 即使两块磁盘同时失效,也不会影响数据的使用。但需要分配给奇偶校验信息更大的磁盘空间,相对于RAID 5有更大的“写损失”。RAID 6 的写性能非常差, 较差的性能和复杂的实施使得RAID 6很少使用。

管理逻辑卷

LVM(Logical Volume Manager,逻辑卷管理)是一种可选的子系统,它提供了硬盘分区的一种超强版本。它能让你将多个单独的硬盘组成“卷组(volume group)”。卷组的总容量接着可以分配给逻辑卷(logical volume)后者按照普通的块设备来访问。逻辑卷的管理机制能让你:

  • 更高效地使用和分配硬盘存储空间;
  • 在不同的物理设备之间移动逻辑卷;
  • 随时扩大和缩小逻辑卷的大小;
  • 保持这个文件系统的快照;
  • 不用中断设备就能替换联机设备。

一个逻辑卷的各个组成部分能够以不同的方式组合在一起。连接方式(Concatenation)把每个设备的物理块放到一起,然后一个接一个的连起来。条带方式(Striping)将各个部分交错分布,相邻的虚拟块实际上散布在多个物理硬盘上。条带方式通过降低单硬盘的瓶颈,往往可以提供更高的宽带、更低的延迟。

配置LVM和RAID的例子

下面的例子是在3个空硬盘上创建一个RAID 5盘阵,并在这个RAID盘阵上划定两个LVM分区:web1和web2。比起传统的系统,这样的结构有一下几个优势。

  • RAID 5有冗余性,如果硬盘发生故障,数据仍然能够访问。RAID 5和RAID 4不一样,硬盘发生故障没关系。
  • 有了LVM,分区的大小可以改变。当一个热衷于网站的Web管理员用完了web2之后,我们可以方便的从web1多借一些空间。
  • 两个分区最终还是会要更多的硬盘空间。这样的设计能向RAID 5盘阵再添加硬盘。一旦完成这样的设置,现有的LVM组就可以扩展包括进来更多的空间,完全不需要再创建任何分区。

在给出初始的配置之后,我们再介绍如何处理一块硬盘发生故障的情况,以及如何改变LVM分区的大小。
在我们举例的系统上,有四块大小相等的SCSI硬盘:

[root@myhost ~]# fdisk -l

Disk /dev/sda: 16.1 GB, 16106127360 bytes
255 heads, 63 sectors/track, 1958 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1           7       56227   83  Linux
/dev/sda2               8         138     1052257+  82  Linux swap / Solaris
/dev/sda3             139        1413    10241437+  83  Linux
/dev/sda4            1414        1958     4377712+  83  Linux

Disk /dev/sdb: 16.1 GB, 16106127360 bytes
255 heads, 63 sectors/track, 1958 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000

Disk /dev/sdb doesn't contain a valid partition table

Disk /dev/sdc: 16.1 GB, 16106127360 bytes
255 heads, 63 sectors/track, 1958 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000

Disk /dev/sdc doesn't contain a valid partition table

Disk /dev/sdd: 16.1 GB, 16106127360 bytes
255 heads, 63 sectors/track, 1958 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000000

Disk /dev/sdd doesn't contain a valid partition table

第一块SCSI硬盘/dev/sda上有我们的系统分区。其他3块硬盘(sdb、sdc和sdd)都没有分区表。
首先,我们在每块SCSI硬盘上创建分区。因为硬盘都是一样的,所以在每块硬盘上执行的命令都一样。

[root@myhost ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x5a238a32.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

The number of cylinders for this disk is set to 1958.
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)
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1958, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-1958, default 1958):
Using default value 1958

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)

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

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

再写好另外两块硬盘的分区卷标后,就要开始建立RAID盘阵了。大多数现代的linux发行版都使用mdadm命令来管理RAID。
下面的命令使用3个SCSI分区建立一个RAID 5盘阵:

[root@myhost ~]# mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: array /dev/md0 started.

在建盘的时候,/proc/mdstat文件显示出的进度信息如下:

[root@myhost ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdd1[3] sdc1[1] sdb1[0]
      31454976 blocks level 5, 64k chunk, algorithm 2 [3/2] [UU_]
      [=========>...........]  recovery = 45.5% (7168664/15727488) finish=14.2min speed=9981K/sec

unused devices:

创建完成的状态信息:

[root@myhost ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdd1[2] sdc1[1] sdb1[0]
      31454976 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]

unused devices:

(ps:好像有点不对劲,仔细看sdd1那里)

这个文件总是反映着内核的RAID系统当前的状态。在添加新硬盘或者替换故障硬盘的时候,观察这个文件非常有用(watch cat /proc/mdstat命令就是一个方便的方法)。
盘阵的组建工作完成之后,我们会在/var/log/messages.log文件里看到下面的通知消息:

RAID5 conf printout:
--- rd:3 wd:3
disk 0, o:1, dev:sdb1
disk 1, o:1, dev:sdc1
disk 2, o:1, dev:sdd1

刚开始创建盘阵的命令也会“启动”盘阵(让它能够使用),但是以后重启系统的时候我们需要单独有一步启动盘阵,通常这一步放在启动脚本里。RHEL、fedora和SUSE都带有RAID启动脚本的例子。
虽然给mdadm命令一个配置文件它也会用(一般是/etc/mdadm.conf),但是就技术而言,它并不要求有一个配置文件。我们强烈建议使用一个配置文件。它按一种标准方式说明了RAID的配置,因而给了系统管理员一个在出现问题的时候可以查看的明确的地方。另一种使用配置文件的方法是在每次启动盘阵的时候在命令行指定配置文件。
mdadm --detail --scan 命令把当前的RAID设置存储到一个配置文件里。遗憾的是,该命令打印出的配置不是非常完整。下面的命令能为我们举例的设置提供一个完整的配置文件:

[root@myhost ~]# echo DEVICE /dev/sdb1 /dev/sdc1 /dev/sdd1 > /etc/mdadm.conf
[root@myhost ~]# mdadm -D --scan >> /etc/mdadm.conf
[root@myhost ~]# cat /etc/mdadm.conf
DEVICE /dev/sdb1 /dev/sdc1 /dev/sdd1
ARRAY /dev/md0 level=raid5 num-devices=3 metadata=0.90 UUID=74aaaea0:e5398d97:6ce5f76a:58326812

ps:其实使用mdadm --detail --scan --verbose命令的输出信息更为详细点

[root@myhost ~]# mdadm --detail --scan --verbose
ARRAY /dev/md0 level=raid5 num-devices=3 metadata=0.90 UUID=74aaaea0:e5398d97:6ce5f76a:58326812
   devices=/dev/sdb1,/dev/sdc1,/dev/sdd1

mdadm命令现在在启动或者停止的时候都会读取这个文件,这样一来就可以方便的管理盘阵。为了用新建的/etc/mdadm.conf文件在系统启动的时候启动盘阵,我们执行:

# mdadm -As /dev/md0

要手工停止盘阵,我们使用下面的命令:

# mdadm -S /dev/md0

示例:

[root@myhost ~]# mdadm -As /dev/md0
mdadm: device /dev/md0 already active - cannot assemble it
[root@myhost ~]# mdadm -S /dev/md0
mdadm: stopped /dev/md0
[root@myhost ~]# mdadm -As /dev/md0
mdadm: /dev/md0 has been started with 3 drives.

现在我们已经把3块硬盘组建成了一个逻辑上的RAID硬盘。现在就可以在我们创建的可扩大(也可以缩小)的文件系统上划定逻辑卷组了。配置LVM有几个清楚的步骤:

  • 创建(实际上是划定)和初始化物理卷;
  • 把物理卷加入一个卷组;
  • 在卷组上创建逻辑卷。

LVM2工具软件能解决所有这些任务,而且能方便以后管理卷。man lvm很好的介绍了这个系统及其工具。
按照LVM的术语,物理卷是聚集在一起形成存储池(逻辑卷)的东西。不过,物理卷是个有点误导性的术语,因为物理卷不需要直接对应物理设备。它们可以是硬盘,但它们也可以是硬盘分区(本例就是),或者是有自己的底层结构的高级RAID对象。
LVM命令以字母开头,字母反映了它们在哪个抽象层面上执行操作:pv命令操作物理卷,vg命令操作卷组,lv命令操作逻辑卷。
LVM比较老的版本要求第一步先执行vgscan命令,但是现在不必要了。代之以直接用pvcreate命令初始化每个物理设备。对于本例来说,我们使用刚创建的RAID 5设备/dev/md0。

[root@myhost ~]# pvcreate /dev/md0
  Physical volume "/dev/md0" successfully created

这个操作会破坏设备或者分区上的所有数据,所以我们要特别小心!虽然我们在这个例子中只用了一个物理设备,但是LVM允许我们向一个卷组增加多个不同类型的设备。
我们的物理设备现在准备好了被加入到一个卷组:

[root@myhost ~]# vgcreate LVM1 /dev/md0
  /proc/devices: No entry for device-mapper found (注:这里出现了一点小问题,但是不影响创建卷组,不过还是有影响的)
  Volume group "LVM1" successfully created

要回头检查一下我们的手艺,使用vgdisplay命令:

[root@myhost ~]# vgdisplay LVM1
  --- Volume group ---
  VG Name               LVM1
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               30.00 GB
  PE Size               4.00 MB
  Total PE              7679
  Alloc PE / Size       0 / 0
  Free  PE / Size       7679 / 30.00 GB
  VG UUID               lWrq2l-JqIq-fYCj-8mz3-KEcQ-Oi4F-tQ4ZhL

最后几步要在卷组LVM1里创建逻辑卷,再在卷上创建分区。我们让两个逻辑卷都10GB大:

[root@myhost ~]# lvcreate -L 10G -n web1 LVM1
  /proc/misc: No entry for device-mapper found
  Is device-mapper driver missing from kernel?
  Failure to communicate with kernel device-mapper driver.
  striped: Required device-mapper target(s) not detected in your kernel
  Run `lvcreate --help' for more information.
(之前出现的问题提示到这里终于有影响了,解决方法见下面的这条命令)
[root@myhost ~]# modprobe dm-mod (加载dm-mod内核模块)
[root@myhost ~]# lvcreate -L 10G -n web1 LVM1
  Logical volume "web1" created
[root@myhost ~]# lvcreate -L 10G -n web2 LVM1
  Logical volume "web2" created

既然我们已经在卷组LVM1中创建了两个逻辑卷web1和web2,我们就能创建并安装我们的文件系统。

[root@myhost archive]# mkfs.ext3 /dev/LVM1/web1
mke2fs 1.41.5 (23-Apr-2009)
文件系统标签=
操作系统:Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=2684354560
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

正在写入inode表: done
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

This filesystem will be automatically checked every 38 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@myhost archive]# mkfs.ext3 /dev/LVM1/web2
	......
[root@myhost ~]# mkdir /mnt/web1 /mnt/web2
[root@myhost ~]# mount /dev/LVM1/web1 /mnt/web1
[root@myhost ~]# mount /dev/LVM1/web2 /mnt/web2
[root@myhost ~]# df -h
文件系统              容量  已用 可用 已用% 挂载点
/dev/sda3             9.7G  2.8G  6.5G  30% /
none                  252M     0  252M   0% /dev/shm
/dev/sda4             4.2G  174M  3.8G   5% /home
/dev/sda1              54M  9.5M   41M  19% /boot
/dev/mapper/LVM1-web1
                      9.9G  151M  9.2G   2% /mnt/web1
/dev/mapper/LVM1-web2
                      9.9G  151M  9.2G   2% /mnt/web2

文件系统最后准备就绪,可以投入使用。我们把新文件系统添加到/etc/fstab文件,重启系统以保证所有配置都能运行不误。

处理故障硬盘

考虑一个硬盘发生故障的情况,因为RAID 5 提供了某种程度的数据冗余性,RAID 5盘阵在一块硬盘发生故障的时候仍能继续工作,用户不必知道任何问题。管理员则需要仔细检查系统日志,及早发现问题(或者让一个程序替你做这件事情)
mdadm命令提供了一个方便的选项能模拟一个硬盘发生故障:

[root@myhost archive]# mdadm /dev/md0 -f /dev/sdc1
mdadm: set /dev/sdc1 faulty in /dev/md0
[root@myhost archive]# tail /var/log/messages.log
May 16 13:43:38 myhost -- MARK --
May 16 13:57:30 myhost kernel: RAID5 conf printout:
May 16 13:57:30 myhost kernel: --- rd:3 wd:2
May 16 13:57:30 myhost kernel: disk 0, o:1, dev:sdb1
May 16 13:57:30 myhost kernel: disk 1, o:0, dev:sdc1
May 16 13:57:30 myhost kernel: disk 2, o:1, dev:sdd1
May 16 13:57:30 myhost kernel: RAID5 conf printout:
May 16 13:57:30 myhost kernel: --- rd:3 wd:2
May 16 13:57:30 myhost kernel: disk 0, o:1, dev:sdb1
May 16 13:57:30 myhost kernel: disk 2, o:1, dev:sdd1

如上所示,一旦发生(模拟的)故障,系统日志/var/log/messages.log里马上就有相关信息。从RAID的状态文件/proc/mdstat也能得到类似信息。

[root@myhost archive]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdb1[0] sdd1[2] sdc1[3](F)
      31454976 blocks level 5, 64k chunk, algorithm 2 [3/2] [U_U]

unused devices:

(注:sdc1后面有一个F的标志)
此刻系统管理员应该采取如下措施:

  • 从RAID盘阵中删除硬盘;
  • 安排停运时间,关闭计算机(如果必要的话)
  • 更换物理硬盘;
  • 向盘阵加入新硬盘。

要从RAID的配置里删除设备,使用mdadm:

[root@myhost archive]# mdadm /dev/md0 -r /dev/sdc1
mdadm: hot removed /dev/sdc1

硬盘一旦在逻辑上被删除了,就可以更换硬盘。支持热交换(插拔)的硬件让用户可以不必关闭系统或者重启就能更换硬盘。
如果直接用硬盘组建RAID,那么应该只用相同的硬盘更换它们。用分区组建的RAID(本例就是)可以用相同大小的分区来替换,虽然为了带宽匹配的缘故,如果硬件上能采用相似的硬盘那就最好了。(如果RAID的配置是在分区上组建的,在向盘阵加入替换的硬盘之前,必须运行fdisk正确地划定分区。)
在我们的例子中,只是模拟的故障,所以我们不必更换任何硬件就能直接把硬盘加回盘阵:

[root@myhost archive]# mdadm /dev/md0 -a /dev/sdc1
mdadm: re-added /dev/sdc1

Linux重建盘阵,并且还会一如既往在/proc/mdstat文件里反映重建的进度。

[root@myhost archive]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdc1[3] sdb1[0] sdd1[2]
      31454976 blocks level 5, 64k chunk, algorithm 2 [3/2] [U_U]
      [>....................]  recovery =  4.8% (760248/15727488) finish=22.0min speed=11334K/sec

unused devices:

用户或日志文件填满了分区是比硬盘故障更常见的情况。假如我们所举例子的/web1增长超出了我们的预期,它需要更多的空间。只要简短几步,就可以调整LVM分区的大小。到底用什么样的命令取决于所用的文件系统。下面这个例子里采用的步骤针对的是ext3文件系统。这些步骤包括:

  • 研究当前的LVM配置;
  • 用lvextend和resize2fs命令调整分区的大小;
  • 核实是否到位。

幸好我们的卷组里多留了一些空间,让/mnt/web1能用这些空间扩展,所以我们用不着从别的卷搜刮空间。我们用vgdisplay查看一下卷组里的可用空间,用df判断如何重新分配空间:

[root@myhost archive]# vgdisplay
  --- Volume group ---
  VG Name               LVM1
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  6
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               30.00 GB
  PE Size               4.00 MB
  Total PE              7679
  Alloc PE / Size       5120 / 20.00 GB
  Free  PE / Size       2559 / 10.00 GB
  VG UUID               lWrq2l-JqIq-fYCj-8mz3-KEcQ-Oi4F-tQ4ZhL

[root@myhost archive]# df -h /mnt/web1
文件系统              容量  已用 可用 已用% 挂载点
/dev/mapper/LVM1-web1
                      9.9G  151M  9.2G   2% /mnt/web1

这些命令显示出卷组里还有10GB的空闲空间,/mnt/web1的使用率是2%(这里我假设/mnt/web1不满足业务增长的需要)。我们给/mnt/web1加上5GB。
首先,我们用lvextend把空间加入逻辑卷,然后再用ext2online(注:现在已经由resize2fs工具替代了)扩大文件系统结构,把增加的空间包括进来。

[root@myhost archive]# lvextend -L+5G /dev/LVM1/web1
  Extending logical volume web1 to 15.00 GB
  Logical volume web1 successfully resized
[root@myhost archive]# df -h /mnt/web1
文件系统              容量  已用 可用 已用% 挂载点
/dev/mapper/LVM1-web1
                      9.9G  151M  9.2G   2% /mnt/web1
[root@myhost archive]# lvdisplay
  --- Logical volume ---
  LV Name                /dev/LVM1/web1
  VG Name                LVM1
  LV UUID                2OubTa-vQfK-1L7j-1GhY-3oat-dtP4-dwIobY
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                15.00 GB
  Current LE             3840
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

  --- Logical volume ---
  LV Name                /dev/LVM1/web2
  VG Name                LVM1
  LV UUID                11kUkq-1Xqr-fL2x-UlF6-SpKr-kkKL-3syTfK
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                10.00 GB
  Current LE             2560
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1
[root@myhost archive]# resize2fs -p /dev/LVM1/web1
resize2fs 1.41.5 (23-Apr-2009)
Filesystem at /dev/LVM1/web1 is mounted on /mnt/web1; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/LVM1/web1 to 3932160 (4k) blocks.
The filesystem on /dev/LVM1/web1 is now 3932160 blocks long.

[root@myhost archive]# df -h /mnt/web1
文件系统              容量  已用 可用 已用% 挂载点
/dev/mapper/LVM1-web1
                       15G  154M   14G   2% /mnt/web1

仔细看上面命令的执行过程,你会发现:在执行lvextend命令扩大逻辑卷/dev/LVM1/web1后,文件系统并没有能够识别出来,然而逻辑卷/dev/LVM1/web1的大小确实已经变为15GB了,直到执行了resize2fs命令后,文件系统才能识别出新增的空间大小。

ReiserFS的用户必须在运行lvextend命令前先卸载分区。此外,用一个名为resize_reiserfs的工具代替ext2online改变文件系统的大小。

更多的知识可参考
ps:后半部分是俺(fhc2007)翻译的,嘿嘿。

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