为 manila 添加快照回滚功能¶
https://blueprints.launchpad.net/manila/+spec/manila-share-revert-to-snapshot
在 manila 中,用户目前只能从快照创建新的共享。东京和奥斯汀会议上讨论了其他的快照语义。在奥斯汀峰会上,社区达成共识,新的快照语义之一是回滚共享(就地),即通过恢复 manila 拍摄的该共享的最新快照来实现。
问题描述¶
有些驱动程序可以拍摄快照,但无法从这些快照创建新的共享(或者这样做成本过高)。即使从快照创建共享是可行的,也会消耗配额,并且在某些情况下会占用后端存储系统中的实际空间。
用例¶
考虑文件系统损坏或变得不可用的情况,可能是由于病毒或意外安装库或其他依赖项,甚至是由恶意“rm -rf”攻击造成的。在这种情况下,能够回滚到发生损坏之前的某个时间点将非常有价值,而无需使用新的共享或从挂载的快照中恢复文件。
提议的变更¶
正如 manila 社区在奥斯汀达成的共识,manila 可以通过添加从快照回滚共享(就地)的能力来满足这一需求。
理论上,如果存在多个快照,存储系统可以将共享恢复到任何一个快照。但回滚到不是最新快照的快照通常会删除后续的快照,这是一种数据丢失形式,可能不是用户期望的。因此,此功能将限制 manila 恢复到 manila 知道的共享的最新快照。
对于这种用例,从最新的快照开始回滚是有意义的。只有用户才能确定共享是否可用或必须回滚,因此恢复到良好状态是一个手动迭代的过程。
Observe corruption in active file system
Revert to most recent snapshot
While corruption is present in active file system:
Delete most recent snapshot
Revert to most recent snapshot
最初的建议是保持 REST 接口简单,只需包含共享 ID 并允许 manila 确定最新的快照,但这会打开潜在的并发错误。如果两个用户同时调用 share-revert-to-snapshot 和 snapshot-create,这两个调用会发生竞争,并且一个用户可能会对用于回滚共享的快照感到惊讶。同样,如果两个用户同时调用 share-revert-to-snapshot 和 snapshot-delete,调用会发生竞争,并且有人可能会惊讶地发现共享回滚到比预期更早的快照(这是一种数据丢失形式)。
为了保持 REST 接口的明确性,并避免上述竞争条件,manila 社区决定接口将接受要恢复的快照的 ID。Manila 将通过快照对象上的 created_at 字段验证该快照是否为最新的,如果不是则返回错误。在任何时候,manila 都不会在回滚操作期间删除任何快照,也不会对任何不是 REST 调用中指定的快照进行操作。一旦 manila 中提供用户消息,包含一条指示快照恢复成功的消息将会有所帮助。
共享大小可能在要恢复的快照拍摄之后发生了变化。快照拍摄时任何共享的大小都存储在快照记录中的数据库中。这应该用于确保恢复快照不会超出配额,并且在恢复成功后,它也可能用于更新共享记录以及用户的共享大小配额,恢复到原始大小。
CLI 的外观如下
usage: manila revert-to-snapshot <snapshot>
Revert a share to the specified snapshot.
Positional arguments:
<snapshot> Name or ID of the snapshot to restore.
请注意,此功能短期内针对单个共享提出,但它同样适用于共享组。由于组尚未完全完成,revert-to-group-snapshot 应该稍后实现。
备选方案¶
Manila 可以简单地依赖于从快照创建新的共享。但并非所有支持快照的驱动程序都可以这样做,并且这涉及将数据从新共享复制到旧共享,或者更新应用程序以指向新共享。
Manila 也可以添加备份功能来解决这种用例(完全恢复到更早的时间点以解决整个共享的损坏等)。但备份通常涉及站外数据副本(完整或差异),因此本质上比存储控制器执行的就地快照恢复操作慢。
数据模型影响¶
不需要更改数据库模式。
在快照恢复期间,有两个对象受到影响,其状态必须反映该操作。共享正在“回滚”,而快照正在“恢复”。在恢复期间,不允许对这两个对象执行任何其他操作,因此它们都将更新为过渡状态
共享 —> ‘reverting’
快照 —> ‘restoring’
恢复成功后,两个对象的状态将再次设置为‘available’。如果恢复失败,共享将被设置为‘reverting_error’,而快照将被设置为‘available’。
对于复制的共享,所有“活动”副本必须立即回滚,而其他副本将“不同步”,直到它们再次与“活动”副本保持一致。为了确定最新的快照,将使用快照对象上的 created_at 字段;查看 snapshot_instance 对象是不正确的,因为它们可能在副本创建期间创建得晚得多。
REST API 影响¶
需要一个用于回滚到快照的单个 API 方法。REST API 模仿其他共享操作,例如 deny_access
Method = POST
URL = /shares/{share_id}/action
Body = {'revert': {'snapshot_id': <snapshot_id>}}
调用此方法会将共享回滚到指定的快照。它适用于租户和管理员使用,policy.json 文件将更新以反映允许所有人使用。如果快照不是 manila 知道的最新快照,或者共享或快照的状态不是‘available’,则 API 将返回 HTTP 错误代码 409(冲突)。如果未找到共享,则返回 404。如果快照不存在,则返回 400(因为它未在 URL 中显式引用)。
驱动程序影响¶
将有一个新的驱动程序入口点来回滚共享到快照,以及另一个来回滚复制的共享到快照。驱动程序可以使用‘revert_to_snapshot_support’池属性显式地宣传对回滚功能的的支持,但共享管理器将能够自动检测到这一点,就像它现在对‘snapshot_support’所做的那样,通过查找入口点是否存在。
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
此功能将在 python-manilaclient 中可用,并且在 manila-ui 中实现它应该也很简单。在后者的情况下,GUI 应该仅在已知为最新快照的快照上显示该操作。
性能影响¶
为了正确识别 manila 知道的最新快照,现有的快照创建工作流必须受到锁的保护,以确保不会发生竞争,导致快照记录的时间戳相对于快照在存储控制器上拍摄的顺序而出错。这可能会导致在多个快照在短时间内拍摄时(例如在自动化测试中)出现延迟。
社区决定在拍摄快照时将共享置于‘snapshotting’状态,以防止多个并发快照操作。快照回滚功能的完全正确性取决于完成这项工作,尽管它们可以以任何顺序合并。
此外,确定哪个快照是最新的需要一个按时间戳(快照对象上的 created_at 字段)排序的数据库查询。这将比不关心结果排序的查询稍慢。
其他部署者影响¶
无
开发人员影响¶
与其他的快照语义一样,包括拍摄快照的能力,驱动程序必须宣传其恢复快照的能力。这将通过现有的驱动程序方法发现代码来完成,以向调度器报告共享回滚能力。新的字段将是‘revert_to_snapshot_support’。它也将作为共享类型上的可选公共额外规范报告,以允许面向用户的工具有选择地在每个快照的基础上提供该功能,并且该值将在共享创建时从共享类型复制到共享。在发布此功能之前创建的共享将不会设置该属性,因此即使后端支持存在,这些共享上的回滚操作也不可用。共享对象上‘revert_to_snapshot_support’的默认值将为 False,如果共享类型上未设置相应的键。
实现¶
负责人¶
主要负责人
clintonk (manila & python-manilaclient)
其他贡献者
vponomaryov (manila-ui)
bswartz (LVM 驱动程序)
TBD (通用驱动程序)
vponomaryov (ZFS 驱动程序)
akerr (功能测试)
TBD (场景测试)
工作项¶
实现快照锁以消除导致快照时间戳对于查找最新快照不可靠的竞争条件。这些可以使用 Oslo 并发提供的文件锁,但一旦 Tooz 采用代码可用,它们应该成为分布式锁。
在 python-manilaclient 中实现 revert-to-snapshot 命令
实现核心功能
在至少一个第一方驱动程序中实现 revert-to-snapshot,涵盖正常和复制的快照
实现 tempest 支持
实现 manila-ui 支持
依赖项¶
为了确定最新的快照,将使用快照对象上的 created_at 字段。快照创建 API 必须将共享置于‘snapshotting’状态,以确保在给定共享上同时只发生一个快照操作。否则,manila 对具有多个快照的共享的最新快照的视图可能与存储控制器上的实际最新快照不同。
测试¶
Tempest 覆盖可能包括检查‘revert_to_snapshot_support’功能是否存在并执行相应的 API。测试应包括共享大小在原始快照拍摄后发生变化的情况,以确保在回滚操作后共享大小和配额正确。负面测试应包括尝试恢复不是最新快照的快照。
为了保证快照恢复实际发生,需要一个新的场景测试,该测试将数据写入共享,创建快照,修改共享,恢复快照,并确保原始数据存在于共享中。
文档影响¶
API 参考:添加有关 API 的内容。
用户指南:添加关于回滚功能和新的公共额外规范的内容。
管理员指南:添加关于 revert_to_snapshot_support 通用功能的内容。
开发人员参考:将 revert_to_snapshot_support 添加到通用功能和臭名昭著的驱动程序矩阵。
参考资料¶
https://etherpad.openstack.org/p/newton-manila-snapshot-semantics