第 2 章 使用块存储备份服务执行操作
您可以使用块存储服务(cinder)备份服务来执行、保护、恢复和故障排除备份。
要在云上执行 openstack
客户端命令,您必须指定 clouds.yaml
文件中详述的云名称。您可以使用以下方法之一指定云的名称:
-
在每个命令
中使用--os-cloud
选项:
$ openstack flavor list --os-cloud <cloud_name>
如果您访问多个云,则使用此选项。
-
在
bashrc
文件中为云名称创建一个环境变量:
`export OS_CLOUD=<cloud_name>`
先决条件
-
管理员已为您创建一个项目,已为您提供了一个
clouds.yaml
文件来访问云。 -
已安装
python-openstackclient
软件包。 - 只有具有访问权限的管理员和卷所有者才能执行和访问备份。
2.1. 使用块存储备份服务
您可以使用块存储备份服务执行完整或增量备份,以保护备份,并将备份恢复到卷。
2.1.1. 验证卷所有者以访问卷备份
管理员可以备份属于该项目的任何卷。为确保卷所有者也可以访问卷备份,管理员必须提供参数以在备份卷时验证卷所有者。
流程
提供以下参数来验证卷备份的访问所有者:
$ openstack --os-project-name <projectname> \ --os-username <username> \ --os-password <password> \ volume backup create [--name <backup_name>] <volume>
-
将
<projectname
> 替换为卷所有者的项目(租户)的名称。 -
将
<username
>
; 和 <password> 替换为此项目中卷所有者的用户的用户名和密码凭证。
-
将
[--name <backup_name>] <volume
> 是创建卷备份时的典型参数。
2.1.2. 创建备份
创建块存储卷的备份,以便在卷出现问题时保护您的数据丢失。如需更多信息,请参阅创建完整卷备份。您还可以直接从卷快照创建备份。除了卷数据外,备份还存储卷元数据,如名称和描述。
如果为备份启用了数据压缩,则会压缩您的备份,这可以降低备份操作的性能。
完全备份更易于管理,但随着时间增大,它们可能会成为资源密集型。通过增量备份,您可以捕获对卷的定期更改,并最小化资源使用量。
当您创建块存储卷的备份时,此备份的元数据存储在块存储服务数据库中。如果您恢复卷备份,则会使用元数据。为确保备份在块存储服务数据库的灾难性丢失时存下,您可以手动导出和存储此备份的元数据。
2.1.2.1. 创建完整卷备份
您可以创建一个或多个卷的完整备份。
先决条件
- 只有卷所有者和管理员可以备份卷。
- 备份的存储后端必须具有所需的空间。
- 未超过为您的项目指定的备份配额。
流程
从您的工作站访问
OpenStackClient
pod 的远程 shell:$ oc rsh -n openstack openstackclient
列出卷以获取您要备份的卷的 ID 或名称:
$ openstack volume list
注意通常,您只能备份具有
available
状态的卷,但如果需要,您可以使用in-use
状态备份卷。如需更多信息,请参阅 创建使用中的卷的备份。备份卷:
$ openstack volume backup create [--name <backup_name>] <volume>
-
将 &
lt;volume
> 替换为您要备份的卷的 ID 或名称。 可选:将
<backup_name
> 替换为此备份的名称。这个命令会立即提供此备份的 ID,但卷会在后台异步备份。例如:
$ openstack volume backup create --name vol1bu2 vol_1 +-------+--------------------------------------+ | Field | Value | +-------+--------------------------------------+ | id | 83dadc43-2aa9-4c0b-bc05-a12203a8f4cb | | name | vol1bu2 | +-------+--------------------------------------+
-
将 &
验证
列出备份:
$ openstack volume backup list
此备份具有
available
状态时会创建卷备份。例如:+--------------------------------------+---------+-------------+-----------+------+ | ID | Name | Description | Status | Size | +--------------------------------------+---------+-------------+-----------+------+ | 83dadc43-2aa9-4c0b-bc05-a12203a8f4cb | vol1bu2 | None | available | 1 | | b604a932-94a5-468e-bf6b-841ac16f69a8 | None | None | available | 1 | +--------------------------------------+---------+-------------+-----------+------+
退出
openstackclient
pod:$ exit
其他资源
2.1.2.2. 创建快照的完整备份
您可以使用与快照关联的卷的 ID 从快照创建完整备份。
通过直接附加到快照来创建备份,这比将快照克隆到卷中快,然后备份这个卷。但是,此功能可能会影响备份性能,因为额外的步骤从快照创建卷。
先决条件
- 您的备份存储库必须具有所需的空间。
- 未超过为您的项目指定的备份配额。
流程
从您的工作站访问
OpenStackClient
pod 的远程 shell:$ oc rsh -n openstack openstackclient
列出快照以获取您要备份的快照的名称或 ID:
$ openstack volume snapshot list
列出此快照的详情,以获取与此快照关联的卷的 ID:
$ openstack volume snapshot show <snapshot>
将
<snapshot
> 替换为您要备份的快照的名称或 ID。volume_id
字段的值是与此快照关联的卷的 ID。例如:$ openstack volume snapshot show snap_1 +--------------------------------------------+--------------------------------------+ | Field | Value | +--------------------------------------------+--------------------------------------+ | created_at | 2023-07-18T08:14:16.000000 | | description | None | | id | 2d95b707-6657-49af-ac8f-f9a7417d4650 | | name | snap_1 | | os-extended-snapshot-attributes:progress | 100% | | os-extended-snapshot-attributes:project_id | c2c1da89ed1648fc8b4f35a045f8d34c | | properties | | | size | 1 | | status | available | | updated_at | 2023-07-18T08:14:17.000000 | | volume_id | 6841e3d1-8a1a-4496-bc51-f7c04b787e8f | +--------------------------------------------+--------------------------------------+
备份快照:
$ openstack volume backup create [--name <backup_name>] --snapshot <snapshot> <volume_id>
-
将
<volume_id
> 替换为与此快照关联的卷的 ID。 可选:将
<backup_name
> 替换为此备份的名称。这个命令会立即提供此备份的 ID,但快照会在后台异步备份。例如:
$ openstack volume backup create --name snap1bu1 --snapshot snap_1 6841e3d1-8a1a-4496-bc51-f7c04b787e8f +-------+--------------------------------------+ | Field | Value | +-------+--------------------------------------+ | id | 867e6cfb-9be7-47fa-8a79-221b0e80c757 | | name | snap1bu1 | +-------+--------------------------------------+
-
将
验证
列出备份:
$ openstack volume backup list
快照备份在备份具有
available
状态时创建。例如:+--------------------------------------+------------+-------------+-----------+------+ | ID | Name | Description | Status | Size | +--------------------------------------+------------+-------------+-----------+------+ | 867e6cfb-9be7-47fa-8a79-221b0e80c757 | snap1bu1 | None | available | 1 | +--------------------------------------+------------+-------------+-----------+------+
退出
openstackclient
pod:$ exit
2.1.2.3. 创建正在使用的卷的备份
通常,您只能备份具有 可用
状态的卷。但是,您可以在创建备份时使用-- force
选项备份具有 in-use
状态的卷。
当您使用- force
卷备份选项时,您可以创建一个崩溃一致性,而不是应用程序一致性,因为卷在执行备份前不会被静止。因此,数据保持不变,但备份不知道在执行备份时运行哪些应用程序。
先决条件
- 只有卷所有者和项目管理员才能备份卷。
- 您的备份存储库必须具有所需的空间。
- 未超过为您的项目指定的备份配额。
流程
从您的工作站访问
OpenStackClient
pod 的远程 shell:$ oc rsh -n openstack openstackclient
列出卷以获取您要备份的卷的 ID 或名称:
$ openstack volume list
例如:
+--------------------------------------+----------------+-----------+------+--------------------------------+ | ID | Name | Status | Size | Attached to | +--------------------------------------+----------------+-----------+------+--------------------------------+ | 6841e3d1-8a1a-4496-bc51-f7c04b787e8f | vol_1 | available | 1 | | | 92800cf6-82ae-448a-a2bb-872fa4d98099 | Pansible_vol_2 | in-use | 1 | Attached to inst1 on /dev/vdc | +--------------------------------------+----------------+-----------+------+--------------------------------+
如果要备份的卷具有
in-use
状态,请强制备份:$ openstack volume backup create [--name <backup_name>] --force <volume>
-
将 &
lt;volume
> 替换为您要备份的卷的 ID 或名称。 可选:将
<backup_name
> 替换为此备份的名称。这个命令会立即提供此备份的 ID,但卷会在后台异步备份。例如:
$ openstack volume backup create --name panvol2bu1 --force Pansible_vol_2 +-------+--------------------------------------+ | Field | Value | +-------+--------------------------------------+ | id | 8c72bbf3-eb8e-4459-83e9-c7654ebe6343 | | name | panvol2bu1 | +-------+--------------------------------------+
-
将 &
验证
列出备份:
$ openstack volume backup list
此备份具有
available
状态时会创建卷备份。例如:+--------------------------------------+------------+-------------+-----------+------+ | ID | Name | Description | Status | Size | +--------------------------------------+------------+-------------+-----------+------+ | 8c72bbf3-eb8e-4459-83e9-c7654ebe6343 | panvol2bu1 | None | available | 1 | +--------------------------------------+------------+-------------+-----------+------+
退出
openstackclient
pod:$ exit
2.1.2.4. 增量备份
如果卷至少有一个完整备份,您可以使用 Block Storage 备份服务来创建增量备份。如需更多信息,请参阅创建增量备份。
完全备份更易于管理,但随着时间增大,它们可能会成为资源密集型。通过增量备份,您可以捕获对卷的定期更改,并尽可能减少资源使用量。
增量备份仅会备份自上次完整或增量备份后,对卷所做的更改。
增量备份会增加管理备份所需的管理开销。例如,如果已经有一个或多个增量备份,则无法删除完整备份,您只能删除最新的增量备份。
增量备份的性能低于完整备份:当您创建增量备份时,必须先读取卷中的所有数据并与完整备份中的数据和后续增量备份进行比较。
2.1.2.5. 创建增量备份
您可以创建一个增量备份,以仅存储自上次或增量备份以来对卷所做的更改。
先决条件
- 至少一个卷的完整备份。如需更多信息,请参阅创建完整卷备份。
- 只有卷所有者和项目管理员才能备份卷。
- 您的备份存储库必须具有所需的空间。
- 未超过为您的项目指定的备份配额。
流程
从您的工作站访问
OpenStackClient
pod 的远程 shell:$ oc rsh -n openstack openstackclient
列出卷以获取您要备份的卷的 ID 或名称:
$ openstack volume list
备份卷并使用-
incremental
选项:$ openstack volume backup create --incremental [--name <backup_name>] <volume>
-
将 &
lt;volume
> 替换为您要备份的卷的 ID 或名称。 可选:将
<backup_name
> 替换为此备份的名称。这个命令会立即提供此备份的 ID,但卷会在后台异步备份。例如:
$ openstack volume backup create --name vol3incbu1 --incremental vol_3 +-------+--------------------------------------+ | Field | Value | +-------+--------------------------------------+ | id | f1681313-b5ed-4520-9b63-5b533f7cdc11 | | name | vol3incbu1 | +-------+--------------------------------------+
-
将 &
验证
列出备份:
$ openstack volume backup list
此备份具有
available
状态时会创建卷备份。例如:+--------------------------------------+---------+-------------+-----------+------+ | ID | Name | Description | Status | Size | +--------------------------------------+---------+-------------+-----------+------+ | f1681313-b5ed-4520-9b63-5b533f7cdc11 | vol3incbu1 | None | available | 1 | | f0e9ba67-67e1-4c2c-96ce-221df75bf2c2 | vol3bu1 | None | available | 1 | +--------------------------------------+---------+-------------+-----------+------+
退出
openstackclient
pod:$ exit
2.1.2.6. 取消备份
您必须在备份上请求强制删除才能取消它。
如果您将 Red Hat Ceph Storage 后端用于备份存储库,则无法取消备份。
流程
从您的工作站访问
OpenStackClient
pod 的远程 shell:$ oc rsh -n openstack openstackclient
列出备份以获取您要取消的备份的 ID 或名称:
$ openstack volume backup list
取消备份:
# openstack volume backup delete --force <backup>
将 &
lt;backup
> 替换为您要取消的卷备份的 ID 或名称。备份可能会有小的延迟被成功取消。
验证
当这个命令没有列出备份记录时,备份会被取消:
$ openstack volume backup show <backup>
退出
openstackclient
pod:$ exit
2.1.3. 保护备份
当您创建块存储卷的备份时,此备份的元数据存储在块存储服务数据库中,后者用于恢复这个卷。为确保备份在块存储服务数据库的灾难丢失丢失时存活,您可以手动将此备份的元数据导出并存储在安全的位置,如非站点备份。如需更多信息,请参阅 导出备份元数据。
当块存储服务数据库遇到灾难性丢失时,您无法恢复任何备份,因为此数据库包含恢复备份时使用的备份元数据。但是,如果您手动导出并保存了备份的元数据,您可以将此元数据导入到新的块存储数据库中,以便您可以使用此备份来恢复卷。如需更多信息,请参阅 导入备份元数据。
对于增量备份,您必须导入所有上述备份的元数据,然后才能使用它恢复卷。
2.1.3.1. 导出备份元数据
您可以导出备份的元数据并将其存储在文件中,以便您可以恢复卷备份,即使块存储数据库出现灾难性丢失。
对于增量备份,您必须导出所有上述备份的元数据。
从您的工作站访问
OpenStackClient
pod 的远程 shell:$ oc rsh -n openstack openstackclient
列出备份以获取备份的 ID 或名称:
$ openstack volume backup list
导出备份的元数据,并将其存储在适当的命名 YAML 文件中:
$ openstack volume backup record export -f yaml <backup> > <filename>.yaml
-
将
<backup>
替换为卷备份的 ID 或名称。 将
<filename
> 替换为 YAML 文件的名称,以保存此备份导出的backup_service
和backup_url
值。例如:
$ openstack volume backup record export -f yaml vol1bu2 > vol1bu2.yaml
-
将
- 将文件复制到安全位置,如非站点备份。
验证
编辑该文件,以查看
backup_service
和backup_url
的值与此命令提供的值匹配:$ openstack volume backup record export -f yaml <backup>
例如:
$ openstack volume backup record export -f yaml vol1bu2 backup_service: cinder.backup.drivers.ceph.CephBackupDriver backup_url: eyJkcml2 … YWxzZX0=
退出
openstackclient
pod:$ exit
2.1.3.2. 导入备份元数据
如果您导出并保存卷备份的元数据,则您可以导入此元数据并在块存储服务数据库丢失时使用备份。
您还可以使用此流程重新创建已删除的备份。
对于增量备份,还必须导入所有上述备份的元数据。
先决条件
-
您必须提供这个备份的
backup_service
和backup_url
元数据值。如需更多信息,请参阅 导出备份元数据。 - 尚未包含此备份的块存储数据库。
流程
从您的工作站访问
OpenStackClient
pod 的远程 shell:$ oc rsh -n openstack openstackclient
-
找到您存储此备份的
backup_service
和backup_url
元数据值的文件。 将此卷备份的元数据值导入到块存储数据库中:
$ openstack volume backup record import <backup_service> <backup_url>
-
将
<backup_service
> 替换为这个卷备份的backup_service
元数据值。 将
<backup_url
> 替换为这个卷备份的backup_url
元数据值。此命令提供此备份的名称和 ID。例如:
$ openstack volume backup record import cinder.backup.drivers.ceph.CephBackupDriver eyJkcml2 … YWxzZX0= +-------+--------------------------------------+ | Field | Value | +-------+--------------------------------------+ | id | 83dadc43-2aa9-4c0b-bc05-a12203a8f4cb | | name | vol1bu2 | +-------+--------------------------------------+
-
将
退出
openstackclient
pod:$ exit
后续步骤
2.1.4. 恢复备份
创建块存储卷备份后,如果需要,您可以恢复这个备份的数据。
您可以使用以下方法之一恢复备份:
将备份恢复到您指定的卷。如需更多信息,请参阅将备份恢复到特定卷。
注意如果您选择 Red Hat Ceph Storage 作为备份存储库的后端,则您只能将备份的卷恢复到基于 RBD 的块存储后端。
- 将备份恢复到新卷。如需更多信息,请参阅将备份恢复到新卷。
当块存储服务数据库遇到灾难性丢失时,除非已导出并保存它们的元数据,否则您无法恢复任何备份。
只有管理员才能取消恢复卷备份。
2.1.4.1. 将备份恢复到特定卷
您可以将卷备份恢复到已创建的 可用
卷。
如果您从加密卷备份中恢复卷,则必须加密目标卷类型。
如果您选择 Red Hat Ceph Storage 作为备份存储库的后端,则您只能将备份的卷恢复到基于 RBD 的块存储后端。
流程
从您的工作站访问
OpenStackClient
pod 的远程 shell:$ oc rsh -n openstack openstackclient
列出备份以获取您要恢复的备份的名称或 ID:
$ openstack volume backup list
例如:
+--------------------------------------+---------+-------------+-----------+------+ | ID | Name | Description | Status | Size | +--------------------------------------+---------+-------------+-----------+------+ | 83dadc43-2aa9-4c0b-bc05-a12203a8f4cb | vol1bu2 | None | available | 1 |
列出卷:
$ openstack volume list
确保所需卷的状态
可用
,然后获取此卷的名称或 ID。例如:+--------------------------------------+----------------+-----------+------+--------------------------------+ | ID | Name | Status | Size | Attached to | +--------------------------------------+----------------+-----------+------+--------------------------------+ | 654e2be8-bc79-4528-96a7-5f773d31c201 | vol_3 | available | 1 | |
将备份恢复到卷:
$ openstack volume backup restore <backup> <volume>
-
将
<backup
> 替换为块存储卷备份的名称或 ID。 将
<volume
> 替换为可用
块存储卷的名称或 ID。例如:
$ openstack volume backup restore vol1bu2 vol_3 +-------------+--------------------------------------+ | Field | Value | +-------------+--------------------------------------+ | backup_id | 83dadc43-2aa9-4c0b-bc05-a12203a8f4cb | | volume_id | 654e2be8-bc79-4528-96a7-5f773d31c201 | | volume_name | vol_3 | +-------------+--------------------------------------+
-
将
-
验证此命令提供的
backup_id
是否与恢复的备份 ID 对应,并且volume_name
和volume_id
值对应于指定卷的名称和 ID。 如果您不再需要备份,请删除它:
$ openstack volume backup delete <backup>
退出
openstackclient
pod:$ exit
2.1.4.2. 将备份恢复到新卷
您可以在恢复块存储卷的备份时创建新卷。
流程
从您的工作站访问
OpenStackClient
pod 的远程 shell:$ oc rsh -n openstack openstackclient
列出备份以获取您要恢复的备份的名称或 ID:
$ openstack volume backup list
例如:
+--------------------------------------+---------+-------------+-----------+------+ | ID | Name | Description | Status | Size | +--------------------------------------+---------+-------------+-----------+------+ | 83dadc43-2aa9-4c0b-bc05-a12203a8f4cb | vol1bu2 | None | available | 1 |
将备份恢复到新卷:
$ openstack volume backup restore <backup> [<volume>]
-
将
<backup
> 替换为块存储卷的 ID。 -
可选:将
<volume
> 替换为块存储卷的 ID。
-
将
验证此命令提供的
backup_id
是否与恢复的备份 ID 对应。volume_id
值是所创建的卷的 ID。但是volume_name
可以是使用备份卷的名称替换的临时名称。列出卷,以验证 ID 为
volume_id
的卷是否已创建,并获取这个卷名称:$ openstack volume list
例如:
+--------------------------------------+----------------+-----------+------+--------------------------------+ | ID | Name | Status | Size | Attached to | +--------------------------------------+----------------+-----------+------+--------------------------------+ | 296c853c-c749-4eb6-857a-57ec182232a6 | vol_1 | available | 1 | |
如果您不再需要备份,请删除它:
$ openstack volume backup delete <backup>
退出
openstackclient
pod:$ exit
2.1.4.3. 取消恢复备份
您可以通过将备份的状态更改为 错误
来取消恢复卷备份。但是,当 Red Hat Ceph Storage 是备份存储库的后端时,您无法取消恢复备份。
如果您在启动后取消恢复备份,则目标卷会无用,因为无法知道数据量(若有)实际被恢复。
先决条件
- 确保备份存储库的后端不是 Red Hat Ceph Storage。
- 只有管理员才能取消恢复卷备份。
流程
从您的工作站访问
OpenStackClient
pod 的远程 shell:$ oc rsh -n openstack openstackclient
列出备份以获取您要停止恢复的备份的名称或 ID:
$ openstack volume backup list
将此备份的状态更改为
error
以取消其恢复操作:$ openstack volume backup set --state error <backup>
-
将 &
lt;backup
> 替换为您要恢复的卷备份的名称或 ID。
取消恢复是一种异步操作,因为备份存储库的后端必须在取消恢复前检测备份状态的更改。
-
将 &
验证
列出卷备份,以验证恢复是否已取消:
$ openstack volume backup list
当备份状态变为
available
时,恢复将被取消。退出
openstackclient
pod:$ exit