Manila 备份与恢复共享

蓝图:https://blueprints.launchpad.net/manila/+spec/share-backup

备份和恢复共享对于大多数存储用户来说是一项宝贵的功能,尤其是对于 NAS 用户而言,但目前,manila 本身并不支持备份和恢复共享功能。本规范提出了一种基于 cinder 现有方案的备份和恢复解决方案。

问题描述

目前我们无法使用 manila 命令备份共享。这些共享驻留在存储后端本身。提供一种直接备份共享的方式将允许用户将共享备份到备份设备上,与相同的存储后端分开。

用例

有些用户拥有许多共享,并希望保护这些共享。此共享备份提案提供了 manila 级别的数据保护。

OpenStack 中还有其他项目专注于数据保护,例如 Freezer、Karbor、Raksha 等。它们都处于设计、开发或采用的不同阶段。manila 中的备份 API 并非这些项目的替代品。相反,manila API 可以被这些更高级别的项目用于数据保护,也可以由不需要这些更高级别项目的用户直接使用。

当用户以朴素的方式备份共享中的文件时,我们会丢失元数据。通过在 Manila 中拥有备份 API,我们可以保留元数据(当后端相同时)。

另外,在谈论共享备份时,大多数用户希望强制执行备份策略。例如,每隔两天进行增量备份,在本地或远程创建备份,仅保留最新的 5 个副本等。这些策略不属于本规范的范围,将在未来考虑。

提议的变更

  • 用于备份的新 API 集合

    为了支持备份,我们将引入基本操作,即创建/更新/删除/列出/显示/恢复备份。我们还允许在某些情况下重置备份状态。

  • 新的数据库资源备份

    创建备份时,用户可以指定 share_id 和 availability_zone。与备份相关的信息,例如 backup_id、share_id、状态、AZ 和主机,存储在数据库中。

  • 新的备份驱动程序

    将引入一种新型的驱动程序,称为备份驱动程序,以负责与共享相关的操作。备份驱动程序将在 manila 数据服务节点上配置,并提供基本功能

    1. 创建一个备份。

    2. 删除一个备份。

    3. 在指定的共享中恢复一个备份。

    相应地,我们将使用一个新的简单的备份驱动程序 ‘NFSBackupDriver’ 来实现这些功能。[1] 此驱动程序是从 cinder 复制的,旨在提供基本的备份功能。支持 nfs 的供应商必须为 nfs 与 nfs 备份驱动程序互连提供空间。NFS 备份驱动程序的实现将是通用的。此驱动程序的备份过程将是

    1. 确保共享处于可用状态且未占用。

    2. 允许对共享进行读取访问,并允许对备份共享进行写入访问。

    3. 将共享和后端驱动程序的共享(即备份共享)挂载到数据服务节点。

    4. 将数据从共享复制到备份共享。

    5. 卸载共享和备份共享。

    6. 拒绝访问共享和备份共享。

    此外,将添加几个新的配置选项来支持备份驱动程序,目前,为了简单起见,仅允许一个备份后端(我们不必报告备份驱动程序的capabilities 并过滤后端)。默认情况下,不会启用任何备份驱动程序

    # OPTION1: enabled backup backend
    enabled_backup_backend = backup1
    [backup1]
    # OPTION2: which backup driver will be used for this backend
    backup_driver = manila.data.drivers.test.TestBackupDriver
    
  • 备份和共享的新状态

    1. backup(

      creating, available, deleting, deleted, error_deleting backup_restoring, error)

    2. share(

      backing_creating, backup_restoring, backup_restoring_error)

    在备份期间,共享将被标记为繁忙状态,并且除非共享变为可用状态,否则不能对共享执行其他操作,例如删除、软删除、迁移、扩展、缩小、ummanage、revert_to_snapshot、crate_snapshot、create_replica 等。最后,无论共享是否成功备份,共享的状态都将回滚到可用状态。如果备份失败,共享 task_state 将包含失败信息。同时,将记录共享消息。

  • 新的清理操作

    备份和恢复操作在服务中断时可能会中断,因此将添加新的清理操作来重置状态并清理临时文件(如果涉及)。

  • 新的备份配额

    1. quota_backups,指示每个项目允许的共享备份数量。

    2. quota_backup_gigabytes,指示每个项目允许用于备份的总存储量(以千兆字节为单位)。

    相应地,我们将添加新的配置选项。

备选方案

我们可以使用第三方项目来备份文件共享。

数据模型影响

  • 添加备份表

    字段

    类型

    是否为空

    默认值

    额外信息

    created_at

    datetime

    YES

    NULL

    updated_at

    datetime

    YES

    NULL

    deleted_at

    datetime

    YES

    NULL

    deleted

    tinyint(1)

    YES

    NULL

    id

    varchar(36)

    NO

    主键

    NULL

    share_id

    varchar(36)

    NO

    NULL

    user_id

    varchar(255)

    YES

    NULL

    project_id

    varchar(255)

    YES

    NULL

    host

    varchar(255)

    YES

    NULL

    availability_zone

    varchar(255)

    YES

    NULL

    display_name

    varchar(255)

    YES

    NULL

    display_description

    varchar(255)

    YES

    NULL

    status

    varchar(255)

    YES

    NULL

    size

    int(11)

    YES

    NULL

  • 共享表中的新字段

    字段

    类型

    是否为空

    默认值

    额外信息

    source_backup_id

    varchar(255)

    YES

    NULL

CLI API 影响

向 openstackclient(OSC) 添加新命令

openstack share backup create [–name <name>]

[–description <description>] [–availabity-zone <availability-zone>] <share>

  • name: 备份名称。默认=None

  • description: 备份描述。默认=None。

  • availability-zone: 备份的可用区。

  • share: 要备份的共享的名称或 ID。

openstack share backup restore <backup>

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

openstack share backup list [–share <share>]

  • share: 按共享名称或 ID 过滤备份。

openstack share backup show <backup>

  • backup: 备份的 ID 或名称

openstack share backup set <backup>

[–name <name>] [–description <description>]

  • backup: 备份的 ID 或名称

  • name: 备份名称。默认=None

  • description: 备份描述。默认=None。

openstack share backup delete <backup>

[–force <force>]

  • backup: 备份的 ID 或名称。

  • force: 允许删除状态不是“available”或“error”的共享的备份。默认=False。

REST API 影响

API 将是实验性的,直到经过几个周期的测试,以及最终的毕业。

创建共享备份:

POST /v2/share-backups

请求

{
    "share_backup": {
        "share": "77eb3421-4549-4789-ac39-0d5185d68c28",
        "name":  "backup_share",
        "description": "This is my backup",
    }
}

备份详细信息 namedescription 是可选的。

如果 manila 不知道共享,API 将响应 404 Not Found。如果共享不在可用状态或共享具有快照,API 将响应 400 Invalid Share。如果项目的共享备份配额已超过,API 将响应 413 QuotaError

Response(202 Accepted)

{
    "share_backup": {
        "share_id": "77eb3421-4549-4789-ac39-0d5185d68c28",
        "created_at": "2016-06-01T21:12:12.617687",
        "updated_at": "2016-06-01T21:12:12.617687",
        "id": "77eb3421-4549-4789-ac39-0d5185d68c29",
        "project_id": "e10a683c20da41248cfd5e1ab3d88c62",
        "display_name": "backup_share",
        "display_description": "This is my backup",
        "status": "creating"
    }
}

删除备份:

DELETE /v2/share-backups/{backup_id}

如果 manila 不知道共享备份,API 将响应 404 Not Found。如果共享备份状态不在 availableerror 中,API 将响应 400 Invalid State。如果请求被接受,API 将响应 202

共享备份的详细列表:

GET /v2/share-backups/detail

Response(200 OK)

{
    "share_backups": [
        {
            "availability_zone": "az1",
            "created_at": "2016-04-02T10:35:27.000000",
            "id": "2ef47aee-8844-490c-804d-2a8efe561c65",
            "display_name": "my_backup",
            "display_description": "this is description",
            "size": 1,
            "status": "available",
            "share_id": "e5185058-943a-4cb4-96d9-72c184c337d6",
        },
        {
            "availability_zone": "az2",
            "created_at": "2016-05-02T10:35:27.000000",
            "id": "2ef47aee-8844-423c-804d-2a8efe561623",
            "display_name": "my_backup_1",
            "display_description": "this is description",
            "size": 2,
            "status": "available",
            "share_id": "e5185058-943a-4cb4-96d9-72c184c33dsd",
        }
    ]
}

恢复共享备份:

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

请求

{
    "restore": null
}

备份将在源共享中恢复(即,从备份创建的共享)将用于恢复。如果源共享或共享备份不知道 manila,API 将响应 404 Not Found。如果源共享的大小与备份的大小不同,API 将响应 400 Invalid Share。但是,如果请求被接受,API 将响应 202

更新共享备份信息:

PUT /v2/share-backups/{backup_id}

请求

{
    "share_backup": {
        "display_name": "test share backup",
    }
}

如果 manila 不知道共享备份,API 将响应 404 Not Found。如果请求被接受,API 将响应 200

驱动程序影响

备份驱动程序需要实现这些函数

def backup(self, backup, share):
    """Create a backup of a specified share.

    The driver should return the backup model with new created
    backup content if creation is successful, manila
    will update the model after this. For example::
    ```
    {"backup":
        {
            "name": "backup_one",
            "id": "e5185058-943a-4cb4-96d9-72c184c33d12",
            "created_at": "2016-04-02T10:35:27.000000",
        }
    }
    ```

    :param backup: backup object.
    :param share: share object.
    :returns: backup: backup object with backup object updated.
    """
    return


def restore(self, backup, share):
    """Restore a shared backup.

    Driver will restore the specified backup.

    :param backup: backup object.
    :param share: share object.
    """
    return

def delete(self, backup):
    """Delete a saved backup.

    Driver will delete the share backup.

    :param backup: backup object.
    """
    return

安全影响

在备份过程中,数据节点将有权读取共享数据。如果拒绝访问阶段失败,该节点将永远以访问用户数据的状态继续。

通知影响

其他最终用户影响

最终用户在备份期间将不可用或被限制执行其他共享操作。例如:扩展/缩小共享、复制共享、共享组操作、迁移共享。

性能影响

其他部署者影响

部署者将能够备份共享。

开发人员影响

实现

负责人

主要负责人

工作项

  • 实现核心功能。

  • 在 NFSBackupDriver 中实现备份。

  • 在 python-manilaclient 中实现备份命令。

  • 实现tempest支持。

  • 实现 manila-ui 支持。

  • 在 devstack 插件中支持 manila 备份。

未来工作项目

  • 新的表 ‘backup_metadata’,数据服务或用户可以在其中存储一些有用的元数据,例如备份的位置。元数据可能用于在发生灾难性数据库故障时恢复备份。

  • 添加支持从备份创建共享,其中 ‘openstack share create’ API 将接受 –backup <backup_id> 选项并创建与备份大小相同的共享。此外,备份数据将被复制到共享。

  • 添加支持处理 manila 服务中断情况下的备份故障转移,即,当服务恢复在线时,监控备份,检查其完成情况并在可能时恢复。

  • 恢复操作可以增强为考虑恢复到大小与备份不同的共享。如果恢复共享的尺寸较小,则在恢复之前将扩展它,如果尺寸较大,则在恢复之前将缩小它。

依赖项

测试

  • 单元测试

  • Tempest 测试

文档影响

  • 文档字符串

  • Devref

  • 用户指南

  • 管理员指南

  • 发布说明

参考资料

[1]: https://specs.openstack.org/openstack/cinder-specs/specs/kilo/nfs-backup.html