可靠、经济的 RAID 备份
作为一个主题,备份是那种可能会引出与您询问的人一样多答案的主题之一。它与您的桌面配置或操作系统一样是个人的选择。因此,在本文中,我甚至不打算涵盖所有选项。相反,我将描述我用于构建可靠、有用的备份系统的方法。此解决方案并非适用于所有人,但它非常适合我的情况。
每个人都知道他们应该进行备份。但是你做了吗?您有多少次开始备份计划,却在几周后让它搁置?听起来有点像锻炼或节食计划,不是吗?
在为我的家庭和托管的 Web 服务器设计新的备份系统时,我设定了几个目标:存储数据的可靠性、备份过程的自动化和相对较低的成本。人为错误是任何备份系统中最薄弱的环节,因此 100% 无人值守的系统是我的目标。
在“可怕的备份故事”中,Paul Barry 讨论了备份失败的问题。他的故事的共同点是在事件链的某个环节中,有人忘记了一个非常重要的步骤。他讲的第一个故事突出了一个团队如何忘记格式化磁带。他们虔诚地遵循了备份计划,备份到未格式化的磁带上,结果却发现磁带毫无用处。
我进行了一些阅读,最终选择了 RAID-5 硬盘阵列作为存储数据的最可靠方式。它可以承受单盘故障,并在您更换故障盘时从中恢复。与磁带、CDR 或 DVD 备份不同,它不需要有人更换介质或格式化和轮换磁带。任何 RAID 方法都无法承受双盘故障,因此 RAID-5 是最好的选择。
RAID-5 通过将数据写入多个磁盘以及错误检测信息来实现其可靠性。信息的分布方式使得任何单盘故障都不会破坏存档。当您更换故障盘时,它会自动重建该 RAID 部分上的数据。
基础系统将是我最近退役的托管 Web 服务器机箱。它有一个不错的机架式机箱、一个 400MHz AMD 处理器和 768MB 的 RAM。我添加了一个更强大的电源(百思买的 Antec 350W)来替换机箱随附的 250W 电源。该系统已经有一个 SCSI 控制器和一个 5GB SCSI 硬盘,我将用于根文件系统。是的,以今天的标准来看,5GB 很小,但该系统是在 1999 年构建和安装的。它一直运行无故障,直到 2002 年 12 月被移除,因为 ISP 倒闭了。Red Hat 8 的最小安装大约需要 400MB,因此该硬盘非常适合其新用途。
SCSI 通常是可靠 RAID 硬件的首选,但它很昂贵——不仅是硬盘,还有控制器也是如此。另一个重要的原因是速度:SCSI 比 IDE 硬盘更有效地处理对硬盘的多次访问。但对于我的应用来说,速度不是决定性因素。
IDE RAID 控制器正变得越来越经济实惠,但截至本文撰写之时,价格仍在 200 美元以上。一种更便宜的替代方案是在系统中添加几张 IDE 控制器卡,并将每个通道一个硬盘(每张卡 2 个硬盘)放在上面。这些 PCI IDE 卡每张不到 25 美元,并且支持较新的 133MHz IDE 总线速度。
我选择安装两张 PCI 卡用作 RAID 控制器。这使得主板上的 IDE 控制器可以自由地在以后添加其他硬盘。它们也可以用于快速备份我不想通过网络复制的硬盘。
将备份限制为每个通道一个硬盘有两个充分的理由。首先,如果一个硬盘发生故障,它可能会扰乱通道上的另一个硬盘,导致灾难性的双盘故障。另一个原因是速度。据我所知,在一个 IDE 链上有两个硬盘的情况下,吞吐量减半,因此仅使用一个硬盘是有道理的。也可以论证每个控制器卡仅使用一个硬盘。但是,在这一点上,您不妨投资购买专用 RAID 卡。
我的硬盘选择已经做出了。一段时间以来,我一直在我的每个系统中使用第二个 Maxtor 硬盘作为备份硬盘,使用 rsync 将实时文件系统镜像到它。多年来,我一直在使用 Maxtor 硬盘,从未发生过一次故障,这与 Fujitsu 硬盘不同,后者似乎会在一年内死机(我的垃圾箱里有三个)。我想这意味着,一旦本文发表,我所有可靠的硬盘都将同时发生故障。
您需要三个硬盘才能组成一个最小的 RAID-5 系统。所有硬盘的大小都应相同,因为总大小是使用最小硬盘大小计算的,乘以 1-硬盘数量。因此,三个 30GB 的硬盘产生的 RAID-5 大约有 60GB 的存储空间。当时,我手头有两个 40GB 和一个 30GB 的硬盘。因此,为了尽快启动并运行该系统,我在构建该系统时浪费了大约 20GB 的空间。
以后可能会通过添加更多硬盘来调整阵列大小,但除非您有数据的第二个备份,否则您可能不想尝试这样做。相反,我建议购买更大的硬盘,将 RAID 复制到它,然后从头开始重建 RAID 文件系统。
我不打算讨论不同的 RAID 级别。我只想说,对于我的目的而言,RAID-5 非常适合。它提供的存储空间比单盘更大,并且能够从单盘故障中幸存和恢复。
在处理像我这样的需求时,我真的看不到有任何必要使用硬件 RAID。我不需要速度,备份在 LAN 通常空闲时运行,并且机器唯一要承担的其他负载是在后台运行 SETI@home 客户端。
这里的目标是安装尽可能简单的 Linux 系统,这样,如果 RAID 根文件系统发生故障,可以以最小的麻烦重新安装它。我有几个系统运行在 Red Hat 8.0 上,所以我选择它作为我的发行版。但是,这些说明应适用于内核默认启用 RAID 支持的任何现代 Linux 发行版。
我进行了 Red Hat 8.0 的最小安装,选择了单个软件包,并关闭了所有看起来不重要的东西。RH 可能称之为最小安装,但它仍然包含许多您可能不需要的东西。选中标有“选择所有软件包”的框,然后浏览列表并关闭它们。如果您关闭太多,配置程序将在最终安装之前解决依赖关系,并提示您需要添加的软件包列表。
使用 Disk Druid 对硬盘进行分区。对于将用于 RAID 的硬盘,将其格式化为“软件 RAID”,并选择覆盖整个硬盘的分区大小。记住配置另一个硬盘/分区作为根分区,带有交换分区和 /boot。RAID 系统可以从位于 RAID 上的根分区启动,但设置起来有点棘手,我想尽可能保持简单。
要创建 RAID 系统,请从 Disk Druid 中的选项中选择“RAID”按钮。您选择为“软件 RAID”的分区将默认被选中。输入挂载点(我使用 /backup)和 RAID 级别(在我的情况下为 5,实际上是我唯一认为有意义的选项)。使用您喜欢的日志文件系统对其进行格式化。我的系统使用了 ext3,但 ReiserFS 也应该同样有效。我倾向于首选 ext3 而不是 ReiserFS,主要是因为它向后兼容 ext2。这样,如果日志发生任何事情,我仍然可以作为 ext2 文件系统访问数据。
继续正常安装。您可以在系统上安装任意数量的内容。我选择了最小安装,并且必须安装 samba-common、samba-clients 和 cups-libs 软件包,然后才能使用 smbmount 来备份 Windows 机器。
重新启动系统并通过输入 df 来确认 RAID 正在运行,以查看挂载了哪些文件系统以及它们的容量是多少。这是我当前的输出
文件系统 | 1K-blocks | 已用 | 可用 | 使用% | 挂载在 |
/dev/sda1 | 3534096 | 544004 | 2810568 | 17% | / |
/dev/md0 | 59114404 | 47497448 | 8614040 | 85% | /backup |
无 | 386744 | 0 | 386744 | 0% | /dev/shm |
/dev/md0 是 RAID 设备,正如您所见,我做得很好,用备份填充了它。这引出了下一步——实际备份您的系统。我将 rsync 和 SSH 以及 smbmount 用于我的备份。设置您的系统,以便备份系统上的 root 用户可以访问所有需要备份的系统上的 root 用户。将其设置为备份系统的 root 用户可以在不被要求输入密码的情况下登录。
通过在备份机器上使用 ssh-keygen -t DSA 生成密钥对来完成此设置,然后将 .ssh/id_dsa.pub 文件复制到所有要备份的系统上的 .ssh/authorized_keys2 文件中。这授权备份系统访问所有目标系统的文件。如果您只需要备份文件的一个子集,则可以使用目标系统上 root 用户以外的用户。
由于此系统可以访问您的所有其他系统,因此需要尽可能安全。不要在其上运行任何其他服务,并确保始终使用 SSH 登录到机器,这样其 root 密码就不会暴露给网络的其余部分。
我使用 rsync 来处理仅复制自上次备份以来已更改的文件。该程序有效地计算差异并传输更改,从而节省时间和带宽。使用 rsync,我能够对我的托管 Web 服务器进行夜间备份——在通过我的 256KB 电缆调制解调器连接对基本系统进行初始八小时备份之后。
我修改了 tridge@linuxcare.com 的 rsync 备份脚本以满足我的需求。它创建一个锁定文件以防止两个实例同时运行,如果备份期间发生挂起,这可能是可能的。它使用以下命令将目标系统上安装的所有 RPM 的副本转储到目标系统的 /etc/ 目录中的文件中
ssh root@target.home "rpm -qa > /etc/rpm_qa.txt"
这样您就知道系统上安装了哪些 RPM。
该脚本使用 rsync 的 backup-dir 功能来创建包含已更改文件的每日目录。这样,您最终得到一个当前的、完整的和完整的备份以及七个目录,以星期几命名,其中包含当天更改的文件。这比旧式的完整备份和增量更改更容易恢复。
可以通过更改 backup-dir 参数使用的目录的命名方式来修改脚本以适应不同的备份计划。有关处理备份 Linux 机器的脚本,请参阅相关的列表 linux_inc。
对于 Windows 系统(我只有一个,我妻子的电脑),我使用 smbmount 将 Windows 共享挂载到备份系统,然后使用本地文件系统上的 rsync 进行备份。有关处理 Windows 机器的备份脚本,请参阅相关的列表 windows_inc。
所有这些都通过 crontab 自动化
MAILTO=backupadmin@yourdomain.home # Backup the windows machine at 7pm 0 19 * * * /backup/scripts/windows_inc # Backup Linux machine at 2am 0 2 * * * /backup/scripts/linux_inc
在提供的脚本中,搜索“target”并将其替换为您的机器名称或 IP 地址,以自定义脚本以适合您的设置。为每台要备份的机器制作单独的副本,并使用 crontab -e 将其添加到 root 的 crontab 中。
该系统的最后一个功能是电源故障时的自动关机。该系统使用带有 ATX 电源的 Asus P5A 主板,因此能够自行关机。我将其连接到带有 USB 连接的 APC 500 电源备份。
我安装了最新版本的 apcupsd 来处理电源中断两分钟后关闭系统。ext3 文件系统和 RAID 应该能够在没有连接 UPS 的情况下防止任何数据损坏,但为什么要冒险呢?
我的系统已经运行备份大约一个月了。夜间报告通过电子邮件发送给我(来自 root 的 cron 作业),其中详细说明了备份的文件。我遇到的唯一问题是当 Windows 机器关闭时,它会删除存档——这不是一件好事!所以我向 smbmount 添加了错误检查,现在如果挂载 Windows 共享失败,它不会尝试进行备份。
希望本文已经让您相信,自动化备份可以以最小的麻烦完成。可以从备份过程中消除大部分人为因素,但并非完全消除。您仍然需要监控您的系统以确保一切运行顺利。
Brian Lane 是来自华盛顿州西贝克的软件开发人员,他与妻子和儿子住在那里。当他不为 www.shinemicro.com 编写软件时,他正在从事各种 Linux 项目,这些项目可以在 www.brianlane.com 上找到。
电子邮件:bcl@brianlane.com