作者:Daniel Robbins
在生产环境中安装 RAID-1
新的 2.4 内核终于发布了,现在应该找一台空闲 PC,装上 Linux,看看它能做些什么。在这篇两篇系列文章中,Daniel Robbins 介绍了 Linux 2.4 软件 RAID ― 一种通过将数据分布于多个磁盘,从而增强磁盘性能和可靠性的技术。在本文中,Daniel 将说明软件 RAID-1、4 和 5 能做什么,不能做什么,以及应该如何在生产环境中实现这些 RAID 方案。在本文的第二部分,Daniel 将带领您体验更换 RAID-1 故障驱动器的模拟过程。
现实中的 RAID
在我的前一篇文章中,我介绍了 Linux 2.4 的软件 RAID 功能,并且说明了如何创建线性卷、RAID-0 卷和 RAID-1 卷。本文考察,为了在生产环境中利用 RAID-1 提高可用性,您需要了解哪些知识。与只是在测试服务器上或者在家中安装 RAID-1 相比,这要求您对 RAID 有更深入的理解,并掌握更多的知识 ― 尤其是,您需要准确知道 RAID-1 可以提供哪些保护,并要了解万一出现磁盘故障,如何使 RAID 卷保持在启动运行状态。本文将探讨这些内容,首先将概述 RAID-1、4 和 5 能做什么,不能做什么,最后模拟一个更换 RAID-1 故障驱动器的完整测试过程 ― 您应该尽可能实际体验一下这个过程(以本文为指南)。在完成此模拟过程之后,您将拥有在现实环境中处理 RAID-1 故障所需的全部经验。
RAID 不能做什么
RAID 的容错功能设计用于避免由偶发的驱动器故障所产生的负面影响。这种设计非常好。但是,对于各种各样的可靠性问题,RAID 并非总是理想的解决方案。在生产环境中,在实现具有容错功能的 RAID (1、4、5) 之前,准确了解 RAID 能做什么及不能做什么至关重要。当处于依赖 RAID 的境况中时,我们不希望对它的作用抱有错误的认识。我们首先要澄清对 RAID 1、4 和 5 的一些常见错误认识。
许多人认为,如果将所有重要数据保存在 RAID 1/4/5 卷上,就没有必要再对这些数据执行定期的备份。这是完全错误的 ― 理由如下。RAID 1/4/5 有助于避免由偶然的驱动器故障引起的意外停机。但是,它并不能防止意外或恶意的 数据损坏。如果读者在 RAID 卷上以 root 身份键入 "cd /; rm -rf *",那么顷刻之间您将丢失大量重要的数据,对于这种情况,就算拥有一个包含 10 个驱动器的 RAID-5 配置也无济于事。同样,如果您的服务器物理上失窃,或者建筑物失火,那么 RAID 也帮不上忙。毫无疑问,如果您没有实施备份策略,就不会拥有历史数据的档案文件 ― 如果某位同事删除了一批重要文件,您也无法将它们恢复。仅此一点就应该足以让您相信,在大多数情况下,即使是在考虑采用 RAID-1、4 和 5 之前,都应该规划并实施一种备份策略。
在由劣质硬件组成的系统上实施软件 RAID 是另一种错误认识。如果您正在装配一台要承担重要任务的服务器,那么在预算许可的范围之内购买质量最好的硬件是合理的。如果您的系统不稳定或者散热不良,那么将陷入一种 RAID 无能为力的困境。与此类似,如果停电,RAID 显然也不能提供更长的正常运行时间。如果服务器计划担负任何比较重要的任务,请确保已为它配备了不间断电源 (UPS)。
接下来,本文转向讨论文件系统问题。文件系统存在于软件 RAID 卷之上。这意味着,使用软件 RAID 并不能避开文件系统问题,例如,如果您恰好在使用一种非日志文件系统或者定期整理碎片的文件系统,则可能存在耗时且易出问题的文件系统检查。因此,软件 RAID 不会提高 ext2 文件系统的可靠性;这就是为什么在 Linux 阵营中仍然强调保留 ReiserFS、JFS 和 XFS 的原因。软件 RAID 和可靠的日志文件系统是一种理想的组合。
RAID ― 智能化实现
但愿上节已经澄清了您关于 RAID 的任何错误认识。在实现 RAID-1、4 和 5 时,将其视作一种延长正常运行时间的技术是非常重要的。一旦读者实现了其中的一种 RAID,您就可以避免一种非常特殊的情况 ― 意外的全面(单个或多个)驱动器故障。如果您遇到这种情况,软件 RAID 将允许系统继续运行,同时您可安排用一个新的驱动器更换故障驱动器。换言之,如果您实现 RAID 1、4 或 5,就会降低由于全面驱动器故障而导致长时间意外停机的风险。相反,您只须短时的有计划停机 ― 只需留出更换坏驱动器的时间即可。显然,这意味着,如果拥有一个高可用性系统并非您的首选,就不应该实现软件 RAID,除非您计划将它主要用作一种提高文件 I/O 性能的方法。
精明的系统管理员会将 RAID 用于一种特定的目的 ― 即提高已经相当可靠的服务器的可靠性。如果您是一位精明的系统管理员,则您已经知道这些基本内容了。您已经通过实施定期备份计划使您的组织免遭灾难。您已经将服务器连接在 UPS 上,并且 UPS 监视软件已在运行,这样,在长时间停电的情况下,您的服务器将安全关闭。也许您正在使用一种日志文件系统,如 ReiserFS,以便缩短文件系统检查时间,并增强文件系统的可靠性与性能。但愿您的服务器散热良好,并由高质量的硬件组成,而且您已经对安全问题给予了密切的关注。此时,也只有在此时,读者才应该考虑实现软件 RAID-1、4 或 5 ― 这样做以后,您就可以预防服务器出现全面驱动器故障,从而潜在地将服务器的正常运行时间延长了几个百分点。软件 RAID 是一层附加的保护,它使已经很稳定的服务器变得更强健。
RAID-1 预排
既然您已经了解了 RAID 能做什么和不能做什么,我希望您对它抱有合理的预期和正确的态度。在这一节,我将带您体验模拟磁盘故障的整个过程,随后使您的 RAID 卷退出降级模式。读者最好能够在一台测试机器上安装一个 RAID-1 卷,并且随我一起进行模拟,我强烈建议您这样做。这种模拟可以很有趣。请稍许放松一下,这样可以确保当驱动器真正出现故障时,您能够沉着冷静,知道具体如何处置。
好了,首先安装一个 RAID 卷;如果需要回顾一下如何实现这一点,请参阅我的前一篇文章。为了执行这个测试,您必须安装自己的 RAID-1 卷,以便在在断开一个硬盘驱动器(因为这将是我们模拟驱动器故障的方式)的情况下,仍然可以引导 Linux 系统。
在安装好自己的卷之后,如果您执行 cat /proc/mdstat 命令,您看到的输出将类似于这个代码示例。
请注意,这使用的是 devfs,这就是读者看到上面所列的极长设备名的原因。我实际上是将 /dev/hda5 和 /dev/hde1 用作 RAID-1 磁盘。此时,内核软件 RAID 代码正在同步这两个驱动器,以便它们彼此精确地成为对方的镜像。如果 RAID-1 卷一切正常,则可以继续向下进行,在该卷中创建一个文件系统,然后将它挂载在某个位置上。向这个卷中复制一些文件,然后设置 /etc/fstab,以便在系统引导时自动挂载这个卷 (/dev/md0)。下面是我在我 fstab 中添加的一行;您要添加的行可能稍有不同:
/dev/md0 /mnt/raid1 reiserfs defaults 0 0
好了;至此我们已差不多作好了模拟驱动器故障的准备,但并非万事俱备。首先,再次执行 cat /proc/mdstat,并等待卷中的所有磁盘完成同步。完成同步之后, /proc/mdstat 将类似于这个代码示例。
开始模拟
好了,既然重新同步已经完成,我们已作好模拟准备。向下继续,关闭机器并且切断电源。然后,打开机箱,并断开组成 RAID-1 阵列的一个硬盘。当然,您肯定不希望断开包含 Linux 根分区的硬盘 ― 我们将需用它来再次启动 Linux!好,硬盘已经断开,请重新启动机器。当您登录之后,应该发现 /dev/md0 已挂载,并且您仍然可以使用这个卷。当执行 cat /proc/mdstat 时,您将看到主要变化:
# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid5]
read_ahead 1024 sectors
md0 : active raid1 ide/host0/bus0/target0/lun0/part5[0]
4610496 blocks [2/1] [U_]
unused devices:
您可以看出 /dev/md0 卷正在以降级模式运行。我断开的是驱动器 /dev/hde,因此,当内核引导并且试图自动启动该阵列时,系统将找不到 /dev/hde1。幸运的是,内核找到了 /dev/hda5,而且 /dev/md0 能以降级模式启动。正如您所见,/dev/hde1 分区未在 /proc/mdstat 中列出,而且其中一个 RAID 磁盘被标记为“不可用”(是 "[U_]" 而不是 "[UU]")。但是,由于 /dev/md0 仍在运行,软件 RAID-1 正在执行预期的任务 ― 保持数据是可用的。
恢复
我们正在经历一种模拟的驱动器故障。如果当前未加电的驱动器在系统运行时真正出现故障,那将正好是我们所处的这种情形。我们的 RAID-1 卷将以降级模式运行,即该卷仍然可用,但是不再有任何冗余。在方便的时侯,我们将希望关闭系统,更换故障驱动器,并且重新启动系统。此时我们的 RAID-1 卷仍将以降级模式运行。
一旦在机器上装好新的驱动器,我们将希望在其上创建一个大小适当的 RAID 自动检测 ("FD") 分区。为了让 Linux 能够重新读入该磁盘的分区表,可能需要再一次重启系统。一旦系统看到这个新分区,我们就可以开始恢复降级的 RAID-1 阵列 ― 此后,我们又拥有了某种冗余。
当然,我们只是在执行一个模拟过程。为了练习向 RAID 阵列中添加一个分区,我们可以作两种处理,这取决于您要模拟哪种场景。既可以关闭机器,接上驱动器,启动机器,并将原来的分区添加到阵列中,也可以关闭机器,接上驱动器,启动机器,删除该驱动器,然后创建一个 新的 RAID 自动检测分区 ("FD") ― 当然,分区的大小要适当,即至少不小于它所替代的分区 ― 然后将这个崭新的分区添加到阵列中。尽管第一种方案也模拟了一些事件,如磁盘控制