马尼拉 - 分享备份异地恢复

蓝图:https://blueprints.launchpad.net/manila/+spec/out-of-place-restore

先前引入的分享备份规范和 API 允许通过马尼拉创建和恢复分享,但是目前,此 API 仅限于恢复到给定备份的源分享。此规范建议增强分享备份 API,以允许恢复到非源分享目标。

问题描述

目前,将给定的分享备份恢复到其他位置(而非用于创建备份的源分享)是不可能的。允许用户恢复到由分享 ID 或名称指定的不同分享,将扩展马尼拉分享备份的可用性。

用例

就业务连续性和灾难恢复 (BCDR) 而言,有几个原因使得此功能有利可图

如果用户仅限于恢复到源分享,他们必须确保当前分享的大小与恢复内容之和不超过给定分享的大小/配额。这可能会阻止用户执行恢复。此外,用户可能会被鼓励“通过恢复浏览”破坏性地删除现有分享内容,以查看备份是否具有他们感兴趣的有效内容。

同样,如果支持源分享类型的存储后端突然变得不可用,用户将无法利用他们的备份。

允许恢复到单独的分享,为恢复到与源不同的分享后端提供了客户服务恢复的机会。

这将使马尼拉分享备份与 Cinder 提供的功能保持一致,并以另一种方式交付原始规范中详细的“添加从备份创建分享的支持”的未来工作项目。

提议的变更

  • 扩展 python-manilaclient ‘share backup restore’ 命令

    分享备份恢复命令将被扩展,以允许最终用户添加一个可选参数,–target-share,其形式为有效的 share_id 或 share_name。这将把给定的备份恢复到目标分享。

  • 扩展 python-manilaclient ‘share create’ 命令

    分享创建命令将被扩展,以允许最终用户添加一个可选参数,–backup-id,其形式为有效的备份 ID。这将创建一个新的分享,并将给定备份的内容恢复到其中。

  • 更新目标分享恢复的 API 调用

    用于恢复的分享备份 API 调用将被扩展,以允许将目标分享附加到恢复调用的主体中作为其信息的一部分。

    • 组件侧 wsgi 操作将修改为考虑此新的附件到主体,以检查提供的分享是否存在于客户端上下文的范围内,并将其传递到 RPC 调用组件。

    • 最后,在相关情况下,希望使用目标恢复的备份驱动程序应使用额外的合理性检查进行更新,以便适当处理给定备份和目标分享的 share_protocol 之间的差异。在支持的情况下,备份应按预期进行,而在不支持给定 share_protocol 匹配的情况下,应显式发生故障并进行通信。

  • backup_driver 抽象类更新

    为了确保兼容性,将在 backup_driver 抽象类中引入一个新的布尔标志:self.support_restore_to_target,这样备份驱动程序就可以向数据管理器发出信号,表明它是否能够支持对其支持的存储后端进行异地恢复。

  • 马尼拉数据管理器更新

    马尼拉数据管理器将被修改,以允许它在恢复调用中接收 target_share 值。这不采用新参数的形式,而是数据管理器将通过将备份源分享的 ID 与提供的分享的 ID 进行评估,来检查是否可以将分享视为目标恢复。

    如果这两个元素匹配,则可以认为正在进行正常的恢复,如果它们不匹配,则应针对当前备份驱动程序的布尔标志执行进一步检查,以确保支持该操作。

    如果是目标分享,其状态将被更新为 BACKUP_RESTORING,并传递到备份驱动程序中,以代替原始分享进行恢复。

    最后,无论这些检查或恢复操作成功或失败,数据管理器都将适当地更新争论中的分享的状态。

  • NFSBackupDriver 更新

    数据管理器中包含的默认 NFSBackupDriver 将不得不扩展以支持异地恢复,或者将目标恢复的支持布尔值设置为 False,从而禁止此类请求。

备选方案

我们可以接受异地恢复不是马尼拉的有效用例,并停止追求此功能。

数据模型影响

CLI API 影响

扩展 python manila 客户端 OSC 插件中的恢复和创建命令

openstack share backup restore [<backup> –target-share <target-share>]

  • backup:要恢复的备份的 ID。

  • target_share:可选 恢复的目标分享,其值为 A

    分享名称或 ID。默认值为 None,例如恢复到源)

openstack share create [<share arguments> –backup-id <backup-id>]

  • share arguments:创建分享时预期的强制参数,例如

    share_protocol、size 等。

  • backup-id:可选 用于从备份创建分享的可选备份 ID。

REST API 影响

正常的 API 恢复将仍然可用,如前所述

POST /v2/share-backups/{backup_id}/action

{
    "restore": null
}

如果需要目标恢复,可以将 ID 作为信息附加

POST /v2/share-backups/{backup_id}/action

{
    "restore": <target_share_id>
}

如果马尼拉不知道 target_share 或备份,API 将响应 404 Not Found,就像正常的分享一样。

如果 target_share 或备份已知,但租户用户没有权限,API 将响应 403 Unauthorised

如果请求被接受,API 将响应 202

驱动程序影响

备份驱动程序必须修改为包含新的支持布尔值,例如

class BackupDriver(object):

    def __init__(self):
        super(BackupDriver, self).__init__()

        # This flag indicates if backup driver implement backup, restore,
        # delete, and get progress operations by its own or uses the data
        # manager.
        self.use_data_manager = True

        # This flag indicates if the backup driver supports out of place
        # restores to a share other then the source of a given backup.
        self.support_restore_to_target = False

安全影响

与原始分享备份规范一样,数据节点将能够访问读取源和目标分享数据。如果拒绝访问阶段失败,则该节点将永远具有访问用户数据的权限。

通知影响

其他最终用户影响

如果最终用户将目标定位到源以外的现有分享,它将在恢复期间对其他分享操作不可用。例如,不扩展/缩小分享、复制分享、分享组操作、迁移分享。

性能影响

其他部署者影响

部署者将能够将分享恢复到非源目标。

开发人员影响

实现

负责人

主要负责人

工作项

  • 更新 python-manilaclient 中的恢复命令。

  • 更新恢复 API WSGI 处理

  • 更新数据管理器和 backup_driver 以支持目标恢复

  • 更新 tempest 支持。

  • 更新 manila-ui 支持。

  • 更新 devstack 插件中的马尼拉备份以支持。

未来工作项目

依赖项

测试

  • 单元测试

  • Tempest 测试

文档影响

  • 文档字符串

  • Devref

  • 用户指南

  • 管理员指南

  • 发布说明

参考资料