备份和恢复卷和快照

openstack 命令行界面提供了创建卷备份的工具。只要卷备份相关的数据库信息(或备份元数据)在块存储数据库中仍然存在,就可以从备份恢复卷。

运行此命令以创建卷的备份

$ openstack volume backup create [--incremental] [--force] VOLUME

其中 VOLUME 是卷的名称或 ID,incremental 是一个标志,指示是否应执行增量备份,force 是一个标志,允许或禁止在卷附加到实例时备份卷。

如果没有 incremental 标志,则默认创建完整备份。使用 incremental 标志,将创建增量备份。

如果没有 force 标志,只有当卷的状态为 available 时才会备份该卷。使用 force 标志,无论卷的状态是 available 还是 in-use,都会备份该卷。当卷附加到实例时,卷为 in-use。备份 in-use 卷意味着您的数据是崩溃一致的。默认情况下,force 标志为 False。

注意

force 标志是 OpenStack Liberty 中的新功能。

增量备份基于一个父备份,该备份是具有最新时间戳的现有备份。根据时间戳,父备份可以是完整备份或增量备份。

注意

卷的第一个备份必须是完整备份。尝试在没有任何现有备份的情况下执行增量备份将失败。有一个 is_incremental 标志,指示在显示备份详细信息时备份是否为增量备份。另一个标志,has_dependent_backups,在显示备份详细信息时返回,将指示备份是否具有依赖备份。如果是 true,则尝试删除此备份将失败。

一个新的配置选项 backup_swift_block_size 被引入到 cinder.conf 中,用于默认的 Swift 备份驱动程序。这是增量备份跟踪更改的字节大小。现有的 backup_swift_object_size 选项,Swift 备份对象的大小(以字节为单位),必须是 backup_swift_block_size 的倍数。 backup_swift_block_size 的默认值为 32768,backup_swift_object_size 的默认值为 52428800。

cinder.conf 中的配置选项 backup_swift_enable_progress_timer 用于备份到对象存储后端中的卷时。此选项启用或禁用计时器。默认情况下启用它,以便将定期进度通知发送到遥测服务。

此命令还会返回一个备份 ID。在恢复卷时使用此备份 ID

$ openstack volume backup restore BACKUP_ID VOLUME_ID

从完整备份恢复时,执行的是完整恢复。

从增量备份恢复时,将基于父备份的 ID 构建一个备份列表。首先基于完整备份执行完整恢复,然后基于增量备份执行恢复,按顺序将其置于其之上。

您可以使用 openstack volume backup list 命令查看备份列表。可选参数可以阐明备份的状态,包括:running --name--status--volume,以按指定的名称、状态或卷 ID 筛选备份。使用 --all-projects 搜索以获取与所列备份关联的项目详细信息。

由于卷备份依赖于块存储数据库,因此还必须定期备份块存储数据库以确保数据恢复。

注意

或者,您可以导出并保存所选卷备份的元数据。这样可以避免备份整个块存储数据库。如果您只需要一小部分卷在灾难性数据库故障中幸存,这将很有用。

如果在设置卷规范时指定了 UUID 加密密钥,则备份元数据可确保在备份和恢复卷时密钥将保持有效。

有关如何导出和导入卷备份元数据的更多信息,请参阅名为 导出和导入备份元数据 的部分。

默认情况下,swift 对象存储用于备份存储库。

如果您想改用 NFS 导出作为备份存储库,请将以下配置选项添加到 [DEFAULT] 部分的 cinder.conf 文件并重新启动块存储服务

backup_driver = cinder.backup.drivers.nfs
backup_share = HOST:EXPORT_PATH

对于 backup_share 选项,将 HOST 替换为存储服务器的 DNS 可解析主机名或 IP 地址,用于 NFS 共享,并将 EXPORT_PATH 替换为该共享的路径。如果您的环境需要为共享指定非默认挂载选项,请按如下方式设置它们

backup_mount_options = MOUNT_OPTIONS

MOUNT_OPTIONS 是一个逗号分隔的 NFS 挂载选项字符串,如 NFS man 页面中所述。

还有几个其他选项,其默认值可以根据您的环境进行覆盖

backup_compression_algorithm = zlib
backup_sha_block_size_bytes = 32768
backup_file_size = 1999994880

选项 backup_compression_algorithm 可以设置为 zlibbz2zstdnone。值 none 可以是一个有用的设置,当提供备份存储库的服务器本身对备份数据执行去重或压缩时。

选项 backup_file_size 必须是 backup_sha_block_size_bytes 的倍数。它实际上是用于保存备份数据的最大文件大小,考虑到您的环境。大于此的卷将存储在备份存储库中的多个文件中。 backup_file_size 还决定了用于生成备份文件的缓冲区大小;在较小的主机上,可能需要将其缩小以避免 OOM 问题。选项 backup_sha_block_size_bytes 确定从正在备份的 cinder 卷上计算数字签名的块的大小,以便启用增量备份功能。

您还可以选择重置备份的状态。在创建或恢复备份时,有时由于数据库或 rabbitmq 出现故障等问题,它可能会卡在创建或恢复状态。在这些情况下,重置备份的状态可以将其恢复到功能状态。

运行此命令以恢复备份的状态

$ openstack volume backup set --state <state> BACKUP

运行此命令以创建快照的备份

$ openstack volume backup create [--incremental] [--force] \
  [--snapshot SNAPSHOT_ID] VOLUME

其中 VOLUME 是卷的名称或 ID,SNAPSHOT_ID 是卷快照的 ID。

取消

从 Liberty 开始,可以取消任何分块备份类型驱动程序(如 Swift、NFS、Google、GlusterFS 和 Posix)上进行中的备份操作。

要对备份发出取消操作,我们必须请求对备份进行强制删除。

$ openstack volume backup delete --force BACKUP_ID

注意

强制删除的策略默认情况下仅对管理员开放。

即使备份立即被删除,因此不再出现在列表中,取消可能需要更长的时间,因此请检查源资源的的状态,以查看它何时停止“备份中”。

注意

在 Pike 之前,“备份中”状态始终存储在卷中,即使在备份快照时也是如此,因此在备份快照后对快照进行的任何删除操作,如果快照仍然映射,都可能导致错误。在删除之前轮询卷以停止“备份中”是确保成功的必要条件。

从 Rocky 开始,也可以取消任何分块备份类型驱动程序上进行中的恢复操作。

要对备份恢复操作发出取消操作,我们需要将其状态更改为任何其他状态,而不是 restoring。我们强烈建议使用“error”状态,以避免混淆恢复是否成功。

$ openstack volume backup set --state error BACKUP_ID

警告

在恢复操作开始后,如果随后被取消,目标卷将变得无用,因为无法知道实际恢复了多少数据,或者是否恢复了任何数据,因此我们建议使用“error”状态。

backup_max_operations

使用此配置选项,我们可以选择可以同时执行的最大操作数,备份和恢复。

此选项的默认值为 15,这意味着我们可以有 15 个并发备份,或 15 个并发恢复,或任何备份和恢复的组合,只要这 2 个操作的总和不超过 15。

此配置选项的并发限制也适用于使用 backup_workers 配置选项为相同的备份服务运行多个进程时。它不是每个进程的限制,而是全局服务限制,因此我们无法在每个进程上运行 backup_max_operations,而是在来自相同备份服务的所有运行进程上运行。

备份和恢复操作都占用大量 CPU 和内存,但由于此选项,我们可以限制并发性并防止 DoS 攻击或仅仅由于许多并发请求导致内存不足 (OOM) 导致的的服务中断。

操作期间使用的内存量 (RAM) 取决于配置的块大小以及操作期间数据达到的压缩率。

示例

让我们看看在从非 Ceph 后端(Swift、NFS 等)恢复到 RBD 卷时,如果使用默认备份块大小(~1.86 GB),需要多少内存。

在恢复操作中,从内存的角度来看,最坏的情况是压缩率接近 0%(压缩数据块的大小几乎与未压缩数据的大小相同)。

在这种情况下,内存使用量将是 ~5.58 GB 的数据,每个块:~5.58 GB = 读取缓冲区 + 解压缩缓冲区 + librbd 库使用的写入缓冲区 = ~1.86 GB + 1.86 GB + 1.86 GB

对于 15 个并发恢复操作,cinder-backup 服务将需要 ~83.7 GB 的内存。

可以对环境特定的场景进行类似的计算,并相应地设置此配置选项。