备份是系统管理员工作中极其重要的一个方面。如果没有良好的备份以及完善的备份策略和流程,那么迟早一些关键数据将无法挽回地丢失,这几乎是肯定的。
所有公司,无论大小,都依赖于数据运营。考虑一下丢失运行业务所需的所有数据所造成的财务和业务成本。如今,从最小的个体户到最大的全球公司,没有哪家企业能够承受全部甚至大部分数据丢失的打击。您的营业场所可以使用保险重建,但您的数据永远无法重建。
这里所说的丢失,我不是指数据被盗;那是一种完全不同类型的灾难。我在这里指的是数据的完全损毁。
即使您只是个人用户,而不是经营一家大型公司,备份您的数据也非常重要。我有二十年的个人财务数据以及我现在已关闭的企业的财务数据,包括大量电子收据。我还拥有多年来创建的各种类型的文档、演示文稿和电子表格。我真的不想失去所有这些。
因此,备份对于确保我的数据长期安全至关重要。
备份选项
有很多选项可以执行备份。大多数 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 条评论