如何选择有效的备份策略

介绍

备份对于云服务器非常重要。无论您是在单个项目上运行,所有数据都存储在单个服务器上,还是直接从Git部署到虚拟机,这些虚拟机在保留最小一组日志的同时启动和关闭,您都应该始终计划应对故障情况。根据您使用的应用程序、立即故障转移的重要性以及您预期的问题类型,这可能意味着许多不同的事情。

在本指南中,您将探讨提供备份和数据冗余的不同方法。因为不同的用例需要不同的解决方案,所以本文无法提供一揽子答案,但您将了解到在不同场景中的重要性以及最适合您操作的实现。

在本指南的第一部分中,您将查看几种备份解决方案,并审查每种解决方案的相对优点,以便您可以选择适合您环境的方法。在第二部分中,您将探讨冗余选项。

第1部分 — 冗余和备份有什么区别?

术语冗余备份的定义经常是重叠的,并且在许多情况下会引起混淆。这是两个相关但不同的概念。一些解决方案同时提供两者。

冗余

数据的冗余意味着在系统出现问题时立即进行故障切换。故障切换意味着如果一组数据(或一个主机)不可用,那么另一个完全相同的副本会立即交换到生产环境中,以取代它的位置。这几乎不会造成感知到的停机时间,应用程序或网站可以继续提供请求,就好像什么都没有发生。与此同时,系统管理员(在这种情况下是您)有机会解决问题,并将系统恢复到完全运行状态。

然而,冗余解决方案通常不是备份解决方案。冗余存储并不一定提供对影响整个机器或系统的故障的保护。例如,如果您配置了镜像RAID(例如RAID 1),那么您的数据在一个驱动器故障时是冗余的,因为另一个驱动器仍然可用。然而,如果机器本身失败,那么您的所有数据可能会丢失。

通过冗余解决方案,如MySQL Group Replication,通常会在数据的每个副本上执行每个操作。这包括恶意或意外操作。根据定义,备份解决方案还应允许您从先前已知数据良好的点进行恢复。

备份

一般来说,您需要维护重要数据的功能性备份。根据您的情况,这可能意味着备份应用程序或用户数据,或者整个网站或机器。备份的理念在于,在系统、机器或数据丢失的情况下,您可以恢复、重新部署或以其他方式访问您的数据。从备份恢复可能需要停机时间,但这可能意味着从一天前开始或从头开始的差别。任何您不能承受丢失的东西,根据定义都应该备份。

在方法方面,备份有许多不同级别。这些可以根据不同类型的问题进行层叠设置。例如,您可能会在修改配置文件之前备份它,以便在出现问题时可以恢复到旧设置。这对于您正在积极监控的小更改是理想的。然而,在磁盘故障或更复杂的情况下,此设置将失败。您还应定期将备份自动备份到远程位置。

备份本身并不提供自动故障转移。这意味着您的故障可能不会造成任何数据损失(假设您的备份是100%最新的),但可能会导致停机时间。这是为什么冗余和备份经常结合使用的一个原因。

第二部分 — 文件级备份

最熟悉的备份形式之一是文件级备份。这种备份类型使用普通的文件系统级别复制工具将文件传输到另一个位置或设备。

如何使用 cp 命令

理论上,您可以使用 cp 命令备份 Linux 机器,比如您的云服务器。这将文件从一个本地位置复制到另一个本地位置。在本地计算机上,您可以挂载一个可移动驱动器,然后将文件复制到它:

  1. mount /dev/sdc /mnt/my-backup
  2. cp -a /etc/* /mnt/my-backup
  3. umount /dev/sdc

此示例将可移动磁盘 sdc 挂载为 /mnt/my-backup,然后将 /etc 目录复制到磁盘。然后卸载驱动器,可以将其存放在其他地方。

如何使用 Rsync

A better alternative to cp is the rsync command. Rsync is a powerful tool that provides a wide array of options for replicating files and directories across many different environments, with built-in checksum validation and other features. Rsync can perform the equivalent of the cp operation above like so:

  1. mount /dev/sdc /mnt/my-backup
  2. rsync -azvP /etc/* /mnt/my-backup
  3. umount /dev/sdc

-azvP 是典型的 Rsync 选项集。对于每个选项的详细说明如下:

  • a enables “Archive Mode” for this copy operation, which preserves file modification times, owners, and so on. It is also the equivalent of providing each of the -rlptgoD options individually (yes, really). Notably, the -r option tells Rsync to recurse into subdirectories to copy nested files and folders as well. This option is common to many other copy operations, such as cp and scp.
  • z compresses data during the transfer itself, if possible. This is useful for any transfers over slow connections, especially when transferring data that compresses very effectively, like logs and other text.
  • v enables verbose mode, so you can read more details of your transfer while it is in progress.
  • P tells Rsync to retain partial copies of any files that do not transfer completely, so that transfers can be resumed later.

您可以在其 man 页面上查看其他 rsync 选项。

当然,在云环境中,您通常不会每次都挂载和复制文件到已挂载的磁盘上。Rsync 还可以通过提供 SSH 风格的语法在网络上执行远程备份。只要您可以 SSH 登录到任何主机,并且在两端都安装了 Rsync,这就可以正常工作。由于 Rsync 被认为是核心 Linux 工具,即使您在 Mac 或 Windows 机器上本地工作,这几乎总是一个安全的假设。

  1. rsync -azvP /etc/* username@remote_host:/backup/

这将把本地机器的 /etc 目录备份到位于 remote_host/backup 目录中。如果您有权限写入此目录并且有可用空间,则此操作将成功。

您还可以查看更多关于 如何使用 Rsync 同步本地和远程目录 的信息。

如何使用其他备份工具

虽然cprsync非常有用且普遍,但它们本身并不是完整的解决方案。要使用Rsync自动化备份,您需要创建自己的自动化流程、备份计划、日志轮换等。虽然这对于一些非常小型的部署可能是合适的,这些部署不希望使用外部服务,或者对于有专门资源维护非常细粒度脚本以满足各种目的的非常大型部署来说可能是合适的,但许多用户可能希望投资于专门的备份解决方案。

Bacula

Bacula是一个复杂而灵活的解决方案,采用客户端 – 服务器模型。Bacula设计了客户端、备份位置和主管(实际备份的组件)的独立概念。它还将每个备份任务配置为称为“作业”的单元。

这允许极其精细和灵活的配置。您可以将多个客户端备份到一个存储设备,将一个客户端备份到多个存储设备,并通过添加节点或调整其详细信息来修改备份方案。它在网络环境中运行良好,并且是可扩展和模块化的,非常适合备份分布在多台服务器上的站点或应用程序。

Duplicity

Duplicity是另一个开源备份工具。它默认使用GPG加密进行传输。

使用GPG加密进行文件备份的明显好处是数据不以明文形式存储。只有GPG密钥的所有者才能解密数据。这为数据存储在多个位置时所需的额外安全措施提供了一定程度的安全保障。

对于不经常使用GPG的人来说,可能不明显的另一个好处是每个交易都必须经过验证才能完全准确。GPG和Rsync一样,强制进行哈希检查,以确保在传输过程中没有数据丢失。这意味着当从备份中恢复数据时,你遇到文件损坏的可能性会显著降低。

第三部分 —— 块级备份

A slightly less common, but important alternative to file-level backups are block-level backups. This style of backup is also known as “imaging” because it can be used to duplicate and restore entire devices. Block-level backups allow you to copy on a deeper level than a file. While a file-based backup might copy file1, file2, and file3 to a backup location, a block-based backup system would copy the entire “block” that those files reside on. Another way of explaining the same concept is to say that block-level backups copy information bit after bit. They do not know about the files that may span those bits.

块级备份的一个优点是通常速度更快。而基于文件的备份通常会为每个单独的文件启动一个新的传输,基于块的备份将传输块,这意味着需要启动较少的非顺序传输来完成复制。

使用dd执行块级备份

执行块级备份的最常见方法是使用dd实用程序。dd可用于创建整个磁盘映像,并且在归档可移动介质(如CD或DVD)时经常使用。这意味着您可以将分区或磁盘备份到单个文件或原始设备,而无需进行任何预备步骤。

要使用dd,您需要指定输入位置和输出位置,如下所示:

  1. dd if=/path/of/original/device of=/path/to/place/backup

在这种情况下,if=参数指定输入设备或位置。of=参数指定输出文件或位置。请注意不要混淆这些,否则可能会误删整个磁盘。

例如,要备份包含您文档的分区,该分区位于/dev/sda3,您可以通过向.img文件提供输出路径来创建该目录的映像:

  1. dd if=/dev/sda3 of=~/documents.img

部分4 —— 版本化备份

备份数据的主要动机之一是能够在不希望的更改或删除时恢复文件的先前版本。尽管到目前为止提到的所有备份机制都可以实现这一点,但您还可以实现更加细粒度的解决方案。

例如,实现这一点的手动方式是在使用nano编辑文件之前创建该文件的备份:

  1. cp file1 file1.bak
  2. nano file1

你甚至可以通过创建带有时间戳的隐藏文件来自动化这个过程,每次你使用编辑器修改文件时都会创建一个。例如,你可以将以下内容放入你的~/.bashrc文件中,这样每次你从bash(即$) shell中执行nano时,它都会自动创建一个备份,并标记上年份(%y)、月份(%m)、日期(%d)等等:

  1. nano() { cp $1 .${1}.`date +%y-%m-%d_%H.%M.%S`.bak; /usr/bin/nano $1; }

这个方法可以部分实现自动备份,但范围有限,而且可能很快就会填满磁盘。你可以想象一下,它可能比手动复制你要编辑的文件还要糟糕。

一个解决这个设计中许多问题的替代方案是使用Git作为版本控制系统。尽管Git主要是为了对纯文本进行版本控制而开发的,通常是源代码,逐行进行版本控制,但你可以使用Git来跟踪几乎任何类型的文件。要了解更多信息,你可以参考如何有效使用Git

第五部分 — 服务器级备份

大多数托管提供商也会提供自己的可选备份功能。DigitalOcean的备份功能定期为已启用此服务的droplets执行自动备份。在创建droplet时,你可以勾选“备份”复选框来启用此功能:

这将定期备份您整个云服务器镜像。这意味着您可以从备份中重新部署,或者将其用作新 droplets 的基础。

对于系统的一次性成像,您还可以创建快照。这些快照的工作方式与备份类似,但不是自动化的。尽管在某些情况下可能会对正在运行的系统进行快照,但根据您如何写入文件系统,这并不总是推荐的:

您可以从《容器和镜像》文档中了解有关DigitalOcean备份和快照的更多信息。

GitOps

最后值得注意的是,有些情况下,您不一定需要按照每台服务器的方式实施备份。例如,如果您的部署遵循GitOps的原则,您可以将许多单独的云服务器视为可丢弃的,并且将远程数据源(如 Git 仓库)视为数据的有效真实来源。像这样的复杂、现代化的部署在许多情况下可以更具可扩展性,更不容易发生故障。然而,您仍然希望为数据存储本身或每个可丢弃服务器可能发送信息的集中式日志服务器实施备份策略。考虑一下您的部署中哪些方面可能不需要备份,哪些需要。

结论

在本文中,您探讨了各种备份概念和解决方案。接下来,您可能想要查看启用冗余的解决方案。

Source:
https://www.digitalocean.com/community/tutorials/how-to-choose-an-effective-backup-strategy-for-your-vps