备份是系统管理员工作中极其重要的一个方面。如果没有良好的备份以及周密的备份策略和流程,那么迟早会发生一些关键数据无法挽回地丢失的情况,这几乎是肯定的。
所有公司,无论规模大小,都依靠其数据运营。考虑一下丢失运行业务所需的所有数据所造成的财务和业务成本。如今,从最小的个体经营户到最大的全球公司,没有一家企业能够承受全部甚至大部分数据丢失的后果。您的营业场所可以使用保险重建,但您的数据永远无法重建。
在这里,我所说的丢失不是指数据被盗;那是一种完全不同类型的灾难。我在这里指的是数据的完全毁坏。
即使您是个人用户而不是运营大型公司,备份您的数据也非常重要。我有二十年的个人财务数据以及我现已关闭的企业的财务数据,包括大量电子收据。我还拥有多年来创建的许多各种类型的文档、演示文稿和电子表格。我真的不想丢失所有这些数据。
因此,备份对于确保我的数据长期安全至关重要。
备份选项
有很多选项可用于执行备份。大多数 Linux 发行版都提供了一个或多个专门设计用于执行备份的开源程序。也有许多商业选项可用。但是,这些选项都不能直接满足我的需求,所以我决定使用基本的 Linux 工具来完成这项工作。
在我去年为《开源年鉴》撰写的文章2015 年最佳搭档:tar 和 ssh中,我表明,设计和实施可行的备份程序实际上并不需要花哨而昂贵的备份程序。
自去年以来,我一直在尝试另一种备份选项,即 rsync 命令,它具有一些非常有趣的功能,我一直能够很好地利用这些功能。我的主要目标是创建备份,用户可以从中找到并恢复文件,而无需解压备份 tarball,并减少创建备份所花费的时间。
本文仅旨在描述我自己如何在备份场景中使用 rsync。它并非全面介绍 rsync 的所有功能或其多种使用方式。
rsync 命令
rsync 命令由 Andrew Tridgell 和 Paul Mackerras 编写,于 1996 年首次发布。rsync 的主要目的是远程同步一台计算机上的文件与另一台计算机上的文件。您注意到他们是如何创建这个名称的吗?rsync 是开源软件,几乎所有主要发行版都提供该软件。
rsync 命令可用于同步两个目录或目录树,无论它们是在同一台计算机上还是在不同的计算机上,但它的功能远不止于此。rsync 创建或更新目标目录,使其与源目录相同。目标目录可以被所有常用的 Linux 工具自由访问,因为它不存储在 tarball 或 zip 文件或任何其他存档文件类型中;它只是一个普通目录,其中包含普通文件,普通用户可以使用基本的 Linux 工具进行导航。这满足了我的主要目标之一。
rsync 最重要的功能之一是它用于同步源目录中已更改的现有文件的方法。它不是从源复制整个文件,而是使用校验和来比较源文件和目标文件的块。如果两个文件中的所有块都相同,则不传输任何数据。如果数据不同,则仅将源上已更改的块传输到目标。这为远程同步节省了大量时间和网络带宽。例如,当我第一次使用我的 rsync Bash 脚本将我的所有主机备份到大型外部 USB 硬盘驱动器时,花费了大约三个小时。那是因为所有数据都必须传输。随后的同步花费了 3-8 分钟的实际时间,具体取决于自上次同步以来已更改或创建了多少文件。我使用 time 命令来确定这一点,因此它是经验数据。例如,昨晚,完成从六个远程系统和本地工作站同步大约 750GB 的数据仅用了三分钟多一点的时间。当然,实际上只有几百兆字节的数据在白天被更改,需要同步。
以下简单的 rsync 命令可用于同步两个目录及其任何子目录的内容。也就是说,目标目录的内容与源目录的内容同步,以便在同步结束时,目标目录与源目录相同。
rsync
-aH sourcedir targetdir
-a 选项用于存档模式,该模式保留权限、所有权和符号(软)链接。-H 用于保留硬链接。请注意,源目录或目标目录都可以位于远程主机上。
现在,假设我们昨天使用 rsync 同步了两个目录。今天我们想重新同步它们,但是我们从源目录中删除了一些文件。rsync 通常会这样做,它只是将所有新的或已更改的文件复制到目标位置,并将已删除的文件保留在目标位置。这可能是您想要的行为,但如果您希望从源中删除的文件也从目标中删除,则可以添加 --delete 选项来实现此目的。
另一个有趣的选项,也是我个人最喜欢的选项,因为它极大地提高了 rsync 的功能和灵活性,是 --link-dest 选项。--link-dest 选项允许一系列每日备份,每天占用极少的额外空间,并且创建时间也很少。
使用此选项指定前一天的目标目录,并为今天指定一个新目录。然后 rsync 创建今天的新目录,并在今天的目录中为昨天目录中的每个文件创建一个硬链接。因此,我们现在在今天的目录中有一堆指向昨天文件的硬链接。没有创建或复制新文件。只是创建了一堆硬链接。维基百科对硬链接有非常好的描述。在使用这组指向昨天目标目录的硬链接创建今天的目标目录后,rsync 像往常一样执行其同步,但是当检测到文件中的更改时,目标硬链接将替换为昨天文件的副本,然后将文件的更改从源复制到目标。
所以现在我们的命令如下所示。
rsync
-aH --delete --link-dest=yesterdaystargetdir sourcedir todaystargetdir
有时,也希望从同步中排除某些目录或文件。为此,可以使用 --exclude 选项。使用此选项以及您要排除的文件或目录的模式。您可能想要排除浏览器缓存文件,因此您的新命令将如下所示。
rsync -aH --delete --exclude Cache --link-dest=yesterdaystargetdir sourcedir todaystargetdir
请注意,您要排除的每个文件模式都必须有一个单独的 exclude 选项。
rsync 可以将文件与远程主机同步,无论远程主机是源还是目标。对于下一个示例,让我们假设源目录位于主机名为 remote1 的远程计算机上,而目标目录位于本地主机上。即使 SSH 是将数据传输到远程主机或从远程主机传输数据时使用的默认通信协议,我总是添加 ssh 选项。命令现在如下所示。
rsync -aH -e ssh --delete --exclude Cache --link-dest=yesterdaystargetdir remote1:sourcedir todaystargetdir
这是我的 rsync 备份命令的最终形式。
rsync 有非常多的选项,您可以使用这些选项来自定义同步过程。在大多数情况下,我在这里描述的相对简单的命令非常适合满足我的个人备份需求。请务必阅读 rsync 的详细手册页,以了解有关其更多功能以及此处讨论的选项。
执行备份
我自动化了我的备份,因为——“自动化一切”。我编写了一个 BASH 脚本,用于处理使用 rsync 创建一系列每日备份的详细信息。这包括确保备份介质已挂载、生成昨天和今天的备份目录的名称、在备份介质上创建适当的目录结构(如果它们尚不存在)、执行实际备份和卸载介质。
我每天清晨作为 cron 作业运行该脚本,以确保我永远不会忘记执行备份。
我的脚本 rsbu 及其配置文件 rsbu.conf 可在 https://github.com/opensourceway/rsync-backup-script 获取
恢复测试
如果没有测试,任何备份方案都是不完整的。您应该定期测试随机文件或整个目录结构的恢复,以确保不仅备份工作正常,而且备份中的数据可以在灾难发生后恢复使用。我见过太多次备份无法恢复的情况,原因各不相同,而由于缺乏测试,未能发现问题,导致宝贵的数据丢失。
只需选择要测试的文件或目录,并将其恢复到测试位置,例如 /tmp,这样您就不会覆盖自备份执行以来可能已更新的文件。验证文件的内容是否与您期望的一致。从使用上述 rsync 命令进行的备份中恢复文件,只需找到您要从备份中恢复的文件,然后将其复制到您要恢复到的位置即可。
我曾遇到过几次不得不恢复单个文件的情况,偶尔也需要恢复完整的目录结构。大多数时候,这是我自己造成的,因为我不小心删除了文件或目录。至少有几次是由于硬盘驱动器崩溃造成的。因此,这些备份确实派上了用场。
最后一步
但是,仅仅创建备份并不能拯救您的业务。您需要定期备份,并将最新的副本保存在异地,即尽可能不在同一栋建筑物内,甚至不在您营业场所几英里范围内。这有助于确保大规模灾难不会摧毁您的所有备份。
对于大多数小型企业来说,一个合理的选择是在可移动介质上进行每日备份,并在晚上将最新的副本带回家。第二天早上,将较旧的备份带回办公室。您应该有几个轮换的备份副本。更好的做法是将最新的备份带到银行,并将其放入您的保险箱,然后带着前一天的备份返回。
21 条评论