高可用性 Linux 与软件 RAID

作者:Micah Silverman

RAID,独立(或廉价)磁盘冗余阵列,是一种通过硬件或软件结合使用两个或多个磁盘驱动器的系统,以提高性能和容错能力。RAID 有许多不同的配置,称为级别。最常见的 RAID 级别及其功能如下:

  • 级别 0:数据条带化,无冗余。

  • 级别 1:磁盘镜像。

  • 级别 3:类似于级别 0,但使用一个特定磁盘进行数据条带化。

  • 级别 5:跨所有磁盘的低级别数据条带化,带有条带错误校正。

有关更多信息,请参阅 www.acnc.com/04_01_00.html,以获取关于各种 RAID 级别的详尽讨论。

数据条带化是将磁盘写入操作分散到多个磁盘上的能力。仅此一项就可以提高性能,并能够从多个磁盘创建一个大卷。例如,如果您有九个 6GB 的驱动器,通常在配置系统时,您将被迫至少创建九个分区。然而,这种分区方案可能不适合您的情况。如果您从这九个驱动器创建了一个 RAID 0,它将在系统中显示为一个 54GB 的驱动器,然后您可以根据需要对其进行分区。但是,在这种情况下,如果一个磁盘发生故障,则整个阵列都会发生故障。

磁盘镜像一次使用两个驱动器,并将一个驱动器完全复制到另一个驱动器。这种复制提供了硬件冗余;如果一个驱动器发生故障,另一个驱动器可以继续独立运行。然而,软件错误可能会在镜像中传播,从而损坏两个磁盘。

级别 3 在阵列中分配一个磁盘用于奇偶校验(错误校正),然后将数据条带化到阵列中的所有其他磁盘上。这里的优点是阵列中的任何一个磁盘发生故障都不会导致数据丢失。但是,您必须牺牲一个磁盘的空间用于错误校正。与级别 5 相比,级别 3 不适用于软件 RAID 解决方案,并且还存在性能缺陷。

级别 5 将数据和纠错奇偶校验数据条带化到阵列中的所有磁盘上。因此,一个磁盘发生故障不会导致数据丢失。当这种情况发生时,RAID 被称为在降级模式下运行。但是,如果同时发生多个磁盘故障,则整个阵列将发生故障。

本文重点介绍在全新安装的 Red Hat 8.0 下使用软件 RAID 级别 5,并测试 RAID 的容错能力。Linux 的 RAID 支持多年来已经成熟,并且安装可以引导到 RAID 配置磁盘集的系统已成为标准。

在实际使用 RAID 5 重建我的服务器之前,我希望能够在安全的环境中测试安装、工具和故障模式。我还希望测试尽可能接近我的物理硬件的真实配置。

自 1990 年代后期的首次 beta 版本以来,我一直在使用 VMware (www.vmware.com)。我强烈推荐给任何需要在多个平台上开发或需要在多个平台上进行任何类型测试的人。使用 VMware,我能够在只有一块物理 IDE 驱动器的机器上设置一个带有六个 9GB SCSI 驱动器(与我的服务器上找到的驱动器相同)的 Linux 虚拟机。

正如我们将看到的,使用 RAID 5 创建高可用性 (HA) Linux 服务器是一个非常简单的过程。但是,有一个需要注意的地方;您必须至少有一个包含 /boot 目录的本地分区。这与内核需要从本地磁盘加载支持 RAID 的驱动程序有关,然后才能实际挂载 RAID。这个小细节使事情变得有趣。即,影响 RAID 中驱动器的分区方式以及如何从包含本地分区的特定驱动器的故障中恢复。

使用 RAID 安装

为了使我的 Linux VM 尽可能与我的物理机器匹配,我创建了六个 9GB SCSI 驱动器(图 1)。创建虚拟驱动器的一个好处是它们最初不会占用您分配给它们的那么多空间。相反,文件会增长以适应放置在 VM 内部的数据。因此,就 VM 而言,它可以支配 54GB 的空间。但是,完整的测试安装仅占用我实际硬盘驱动器上约 1GB 的物理空间。

High Availability Linux with Software RAID

图 1. VM 配置

在配置 VMware 以引用 VM 的 CD-ROM 驱动器的物理 CD-ROM 驱动器之后,我将第一张 Red Hat 8.0 光盘放入驱动器并启动了 VM。此步骤有一些分区要求。首先,RAID 卷中使用的每个分区的大小应相同。其次,其中一个驱动器上的一个分区应为本地分区,并应挂载到 /boot。第三,对于 RAID 5,RAID 卷中一个分区大小的空间需要“牺牲”以用于奇偶校验(错误校正)数据。由于我的物理机器有 512MB 的 RAM,我希望有 1GB 的交换空间。表 1 显示了我的分区方案。

表 1. VM 测试的分区方案

分区

大小 (MB)

类型(十六进制值)

/dev/sda1

250

Linux (83)

/dev/sda2

8750

RAID 自动检测 (fd)

/dev/sdb1

250

RAID 自动检测 (fd)

/dev/sdb2

8750

RAID 自动检测 (fd)

/dev/sdc1

250

RAID 自动检测 (fd)

/dev/sdc2

8750

RAID 自动检测 (fd)

/dev/sdd1

250

RAID 自动检测 (fd)

/dev/sde1

250

RAID 自动检测 (fd)

/dev/sde2

8750

RAID 自动检测 (fd)

/dev/sdf1

250

RAID 自动检测 (fd)

/dev/sdf2

8750

RAID 自动检测 (fd)

一旦以这种方式对驱动器进行分区,我就可以创建 RAID 5 卷。表 2 显示了 RAID 卷配置。

表 2. VM RAID 卷配置

RAID 卷

分区

大小

md0

/dev/sdb1、/dev/sdc1、/dev/sdd1、/dev/sde1、/dev/sdf1

1GB

md1

/dev/sda2、/dev/sdb2、/dev/sdc2、/dev/sdd2、/dev/sde2、/dev/sdf2

43.75GB

由于奇偶校验,每个由五个分区组成的 RAID 卷的大小都是分区大小的四倍。表 3 显示了我的最终分区表。

表 3. 最终 VM 分区表

挂载点

文件系统类型

/dev/md1

/

/boot

/dev/sda1

ext2

/boot

/dev/md0

交换

 

卷使用的文件系统类型是 EXT2。但是,默认情况下,Red Hat 8.0 想要创建 EXT3 日志文件系统。目前,日志文件系统和软件 RAID 的组合会导致非常差的性能。关于解决这些性能问题有很多讨论,但就目前而言,EXT2 是最佳选择。

在 Red Hat 8.0 安装期间,我使用 Disk Druid 设置了如上所述并在图 2 和图 3 中所示的分区。我使用了 GRUB 引导加载程序,并将引导镜像安装在 /dev/sda 上。出于测试目的,我在 VM 上只安装了大约 500MB 的软件包。

High Availability Linux with Software RAID

图 2. 使用 Disk Druid 进行分区

High Availability Linux with Software RAID

图 3. 设置 RAID 设备

安装完成后,检查文件 /etc/fstab 和 /etc/raidtab 反映了上面概述的分区方案和 RAID 配置。

以 root 身份执行 cat /proc/mdstat 会显示有关 RAID 配置的信息。以下是示例输出:

Personalities : [raid5]
read_ahead 1024 sectors
md0 :   active raid5 sdf1[4] sde1[3] sdd1[2] sdc1[1] sdb1[0]
        1027584 blocks level 5, 64k chunk, algorithm 0 [5/5] [UUUUU]
md1:    active raid5 sdf2[5] sde2[4] sdd2[3] sdc2[2] sdb2[1] sda2[0]
        44780800 blocks level5, 64k chunk, algorithm 0 [6/6] [UUUUUU]

此输出向我们展示了参与 RAID 卷的每个分区及其状态。第二行中的最后两列显示了每个 RAID 卷的重要信息。具体来说,它显示了驱动器总数和活动驱动器数(例如,[5/5]),以及每个驱动器的状态(U 代表正常运行?文档中不清楚)。

使用此配置,如果 /dev/sdb 到 /dev/sdf 中的任何一个驱动器发生故障,则两个 RAID 卷 /dev/md0 和 /dev/md1 都将在降级模式下运行,但不会丢失任何数据。如果 /dev/sda 驱动器发生故障,则 RAID 卷 /dev/md1 将在降级模式下运行,而不会丢失任何数据。但是,在这种情况下,我们的 /boot 分区和 /dev/sda 上的主引导记录将丢失。这就是创建可引导恢复 CD 的用武之地。

可引导 CD 创建

可以使用 mkbootdisk 实用程序轻松创建可引导 CD 恢复磁盘。但是,为了将 /boot 分区包含在恢复 CD 中,需要将一个小补丁应用于 mkbootdisk(列表 1)。此外,您必须安装 mkisofs 软件包。以下以 root 身份发出的命令可以完成此操作:

cd /sbin
cp mkbootdisk mkbootdisk.orig
patch -p0 \ mkbootdisk.patch

列表 1. mkbootdisk.patch

应用补丁后,以下命令创建可引导恢复 CD:

cd /tmp
mkbootdisk --device bootcd.iso --iso 2.4.18-14

当使用 --iso 选项时,指定的 --device 预计是 ISO 镜像将被写入的文件名。最后一个参数 2.4.18-14 指定要使用的内核。

我们可以使用以下命令检查 ISO 镜像:

cd /tmp
losetup /dev/loop1 bootcd.iso
mount /dev/loop1 /mnt

它们创建了一个环回设备,ISO 镜像随后被挂载在该设备上。检查后,您应该在 CD 镜像上看到完整的 /boot 目录。

对于物理机器,此镜像将被刻录到 CD 上。为了测试目的,VMware 可以直接将 ISO 镜像用作虚拟 CD-ROM 驱动器。

故障测试

现在到了有趣的部分。使用 VMware 进行测试的优势之一是能够在不担心对物理硬件可能产生影响的情况下模拟硬件故障。为了确保系统按预期运行,我进行了两个故障测试:纯 RAID 驱动器故障和混合本地和 RAID 驱动器故障。

为了在 VMware 下模拟驱动器故障,我只需关闭 VM,将代表特定虚拟驱动器的文件移动到备份文件夹,然后重新创建一个新的虚拟驱动器。此过程有效地创建了一个新的未分区驱动器——这正是驱动器发生故障并被替换后的情况。

对于第一个测试,我“故障”了阵列中的第四个驱动器。在 VM 中成功启动后,我查看了 /proc/mdstat:

Personalities : [raid5]
read_ahead 1024 sectors
md0 :   active raid5 sdf1[4] sde1[3] sdd1[2] sdc1[1] sdb1[0]
        1027584 blocks level 5, 64k chunk, algorithm 0 [5/4] [UU_UU]
md1:    active raid5 sdf2[5] sde2[4] sdd2[3] sdc2[2] sdb2[1] sda2[0]
        44780800 blocks level5, 64k chunk, algorithm 0 [6/5] [UUU_UU]

有点违反直觉,但状态指示从左到右从较低的驱动器编号开始。因此,对于 md0,[UU_UU] 表示驱动器 0 和 1 正常运行,驱动器 2 故障,驱动器 3 和 4 正常运行。这些分别对应于 sdb1、sdc1、sdd1、sde1 和 sdf1。对于 md1,[UUU_UU] 表示驱动器 0 到 2 正常运行,驱动器 3 故障,驱动器 4 和 5 正常运行。这些分别对应于 sda2、sdb2、sdc2、sdd2、sde2 和 sdf2。

正如我们所预期的,sdd 驱动器已发生故障。此时,RAID 在降级模式下运行。如果另一个驱动器发生故障,则会发生数据丢失。

我们可以在系统运行时将“新”驱动器重新集成到阵列中。为此,我们需要对驱动器进行分区并使用 raidhotadd 实用程序。驱动器的分区应与最初完全相同。对于此驱动器,两个分区均为 Linux raid 自动检测 (fd) 类型。重新分区驱动器后,执行以下命令:

raidhotadd /dev/md0 /dev/sdd1
raidhotadd /dev/md1 /dev/sdd2
cat /proc/mdstat

之后,您应该看到类似以下内容的输出:

Personalities : [raid5]
read_ahead 1024 sectors
md0 :   active raid5 sdf1[4] sde1[3] sdd1[2] sdc1[1] sdb1[0]
        1027584 blocks level 5, 64k chunk, algorithm 0 [5/4] [UU_UU]
        [===>.................]  recovery = 18.3% (47816/256896)
finish=0.5min speed=6830K/sec
md1:    active raid5 sdf2[5] sde2[4] sdd2[3] sdc2[2] sdb2[1] sda2[0]
        44780800 blocks level5, 64k chunk, algorithm 0 [6/5] [UUU_UU]

当 md0 的同步过程完成后,md1 的类似过程开始。完成后,您应该看到 /proc/mdstat 看起来与之前一样(所有 U 都存在),并且阵列不再处于降级模式。

对于第二个测试,我“故障”了阵列中的第一个驱动器。对于此测试,我们必须拥有之前创建的可引导 CD-ROM。它可以刻录到 CD 上,也可以在 VMware 配置中引用该文件(图 4)。

High Availability Linux with Software RAID

图 4. 为可引导 CD-ROM 准备 VMware

当您从 CD 启动时,mkbootdisk 脚本创建的欢迎屏幕会出现(图 5)。当系统尝试挂载 /boot 分区时,启动会在中途失败。这是因为驱动器 /dev/sda1 不可用。输入 root 密码以进入维护模式,然后使用命令 vi /etc/fstab 编辑文件系统表文件。现在,只需注释掉包含 /boot 条目的行。在我的安装中,fstab 文件具有 /boot 条目的标签引用。我更喜欢直接引用驱动器,所以我将此条目更改为 /dev/sda1,然后将其注释掉。键入 exit,系统重新启动,再次从 CD 启动。这一次,它可以完全启动。

High Availability Linux with Software RAID

图 5. 启动盘欢迎屏幕

您应该通过检查 /proc/mdstat 发现 md1 RAID 卷正在降级模式下运行,如前所述。恢复故障的第一个驱动器的任务如下:

  1. 对驱动器进行分区。

  2. 使用 raidhotadd 实用程序重建 md1 RAID。

  3. 格式化驱动器上的本地分区。

  4. 将 /boot 文件从 CD 复制到驱动器。

  5. 取消注释 /etc/fstab 文件。

  6. 在驱动器的 MBR(主引导记录)中安装 GRUB 引导加载程序。

驱动器的分区应与最初完全相同。也就是说,第一个 250MB 分区应为 Linux (83) 类型,第二个 8750MB 分区应为 Linux raid 自动检测 (fd) 类型。然后,您可以输入命令:

raidhotadd /dev/md1 /dev/sda2

以重建 md1 RAID。如前所述检查 /proc/mdstat 以查看同步过程的状态。

本地分区应使用命令 mke2fs /dev/sda1 进行格式化。假设 CD-ROM 驱动器挂载在 /mnt/cdrom 上,以下命令恢复 /boot 分区:

mount /dev/sda1 /boot
cp -p -r /mnt/cdrom/boot/* /boot

接下来,编辑 /etc/fstab,并取消注释包含 /boot 分区的行。最后,使用 GRUB 在驱动器的 MBR 上安装引导加载程序。对 GRUB 的详尽讨论超出了本文的范围,但以下命令使用 Red Hat 8.0 安装时定义的原始 GRUB 配置:

grub
root (hd0,0)
setup (hd0)
quit

一旦 md1 RAID 重建完成,系统就可以在不使用恢复 CD 的情况下重新启动。确保从 CD-ROM 驱动器中取出恢复 CD,或者删除 VMware 配置中的镜像引用,然后重新启动。系统应正常启动。查看 /proc/mdstat 应显示两个 RAID 卷,所有成员都在运行。

总结

通过结合使用软件 RAID 和恢复 CD,可以轻松设置和配置高可用性 Linux 服务器。驱动器可能会发生故障,使 RAID 进入降级模式,而系统管理员可能不会立即知道。可以创建一个 cron 作业来定期检查 /proc/mdstat 文件,如果发现 RAID 卷处于降级模式,则发送电子邮件或页面通知。

在使用 VMware 进行测试后,我使用了上面概述的相同技术在我的物理机器上安装了 Red Hat 8.0。我还对物理机器进行了相同的测试程序,包括模拟纯 RAID 驱动器故障、模拟第一个混合 RAID 和本地驱动器故障、在降级模式下恢复 RAID 卷、从恢复 CD 启动、重建本地分区以及在 MBR 上安装引导加载程序。它工作完美,我的系统已经重生为 HA 服务器。

资源

RAID 级别

Red Hat

Software-RAID HOWTO

VMware

Micah Silverman 自 1980 年代以来一直从事软件开发和计算机安全工作。自 1991 年以来,他一直在使用 Linux。Micah 是 CISSP(认证信息系统安全专业人员)和认证 Java 程序员。

加载 Disqus 评论