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 数据服务节点上配置,并提供基本功能
创建一个备份。
删除一个备份。
在指定的共享中恢复一个备份。
相应地,我们将使用一个新的简单的备份驱动程序 ‘NFSBackupDriver’ 来实现这些功能。[1] 此驱动程序是从 cinder 复制的,旨在提供基本的备份功能。支持 nfs 的供应商必须为 nfs 与 nfs 备份驱动程序互连提供空间。NFS 备份驱动程序的实现将是通用的。此驱动程序的备份过程将是
确保共享处于可用状态且未占用。
允许对共享进行读取访问,并允许对备份共享进行写入访问。
将共享和后端驱动程序的共享(即备份共享)挂载到数据服务节点。
将数据从共享复制到备份共享。
卸载共享和备份共享。
拒绝访问共享和备份共享。
此外,将添加几个新的配置选项来支持备份驱动程序,目前,为了简单起见,仅允许一个备份后端(我们不必报告备份驱动程序的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
备份和共享的新状态
- backup(
creating, available, deleting, deleted, error_deleting backup_restoring, error)
- share(
backing_creating, backup_restoring, backup_restoring_error)
在备份期间,共享将被标记为繁忙状态,并且除非共享变为可用状态,否则不能对共享执行其他操作,例如删除、软删除、迁移、扩展、缩小、ummanage、revert_to_snapshot、crate_snapshot、create_replica 等。最后,无论共享是否成功备份,共享的状态都将回滚到可用状态。如果备份失败,共享 task_state 将包含失败信息。同时,将记录共享消息。
新的清理操作
备份和恢复操作在服务中断时可能会中断,因此将添加新的清理操作来重置状态并清理临时文件(如果涉及)。
新的备份配额
quota_backups,指示每个项目允许的共享备份数量。
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",
}
}
备份详细信息 name 和 description 是可选的。
如果 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。如果共享备份状态不在 available 或 error 中,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
安全影响¶
在备份过程中,数据节点将有权读取共享数据。如果拒绝访问阶段失败,该节点将永远以访问用户数据的状态继续。
通知影响¶
无
其他最终用户影响¶
最终用户在备份期间将不可用或被限制执行其他共享操作。例如:扩展/缩小共享、复制共享、共享组操作、迁移共享。
性能影响¶
无
其他部署者影响¶
部署者将能够备份共享。
开发人员影响¶
实现¶
负责人¶
- 主要负责人
kpdev(kinpaa@gmail.com)
工作项¶
实现核心功能。
在 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