备份快照

https://blueprints.launchpad.net/cinder/+spec/backup-snapshots

目前我们可以备份一个卷,但不能备份快照。此规范建议提供一种备份快照的方式。

问题描述

今天我们可以备份一个卷,但我们无法直接备份快照。直接备份卷很有价值,因为它允许一步完成卷的备份。而且卷备份自从 Cinder 引入备份功能以来就一直可用。用户还会从卷中创建快照,以保护他们的数据。这些快照驻留在存储后端本身上。提供一种直接备份从卷中创建的快照的方式,将允许用户将快照备份到备份设备上,与存储后端分开,从而保护快照。

用例

有些用户创建了许多快照,并且希望找到一种保护这些快照的方式。此备份快照的提案提供了另一层数据保护。

OpenStack 中还有其他项目专注于数据保护,例如 Freezer、Smaug、Raksha 等。它们都处于不同的设计、开发或采用阶段。Cinder 中的备份 API 并不是这些项目的替代品,这些项目正在对 OpenStack 中所有资源(而不仅仅是块存储)进行完整的数据保护编排。相反,Cinder API 可以被这些更高级的项目用于数据保护,也可以由不需要这些更高级项目的用户直接使用。

提议的变更

总而言之,将发生以下更改

  • 将在现有备份 API 的请求体中添加一个字段 snapshot_id

  • 将在备份表中添加一个新的列 snapshot_id

  • driver.py 和 lvm.py 中的 backup_volume 逻辑将被更改为在它不为 None 时使用 snapshot_id

  • 在增量备份期间查找最新父项的逻辑将被调整为考虑来自快照的备份。

注意:此提案不会引入新的驱动程序 API。

使用内部租户创建快照备份的步骤如下

  • 从快照创建临时卷

  • 附加临时卷

  • 从临时卷进行备份

  • 分离临时卷

  • 清理临时卷

如果驱动程序实现了 Liberty 版本中引入的附加快照接口(请参阅开发人员影响部分),则备份快照将使用以下步骤完成

  • 附加快照

  • 从快照进行备份

  • 分离快照

对于增量备份,由于通过查看时间戳自动计算最新的父项,因此逻辑需要更改以适应来自快照的备份。对于来自快照的备份,我们需要查看快照的时间戳;对于来自卷的备份,我们仍然像以前一样查看备份的时间戳。增量快照的父项可能是来自先前快照的备份或来自卷的备份,具体取决于先前快照拍摄的时间与卷备份拍摄的时间。时间戳最新的备份将被选为父项。将在备份表中创建一个新列来记录数据的的时间戳。对于来自卷的备份,数据时间戳字段将与备份表中的 created_at 字段相同。对于来自快照的备份,数据时间戳字段将与快照的 created_at 字段相同。

备选方案

这里有一个手动替代方案

  • 从快照创建卷

  • 备份卷

  • 删除卷

数据模型影响

将以下新列添加到备份表中以记录快照 ID。如果备份来自卷,则此字段将为空。

snapshot_id = Column(String(36))

将以下新列添加到备份表中以记录数据的时间戳

data_timestamp = Column(DateTime)

请注意,以下列仍然需要用于来自快照的备份

volume_id = Column(String(36), nullable=False)

REST API 影响

更改现有的创建备份 API 以接受快照 ID。创建备份 API 必须提供 volume_idsnapshot_id,但不能同时提供。 snapshot_id 是备份快照所必需的。

  • 创建备份

    • V2/<tenant id>/backups

    • 方法:POST

    • V2 的 JSON 模式定义

      {
          "backup":
          {
              "display_name": "nightly001",  # existing
              "display_description": "Nightly backup",  # existing
              "volume_id": "xxxxxxxx",  # existing
              "snapshot_id": "xxxxxxxx",  # new
              "container": "nightlybackups",
              ......
          }
      }
      

安全影响

通知影响

目前,当创建、恢复和删除备份时会发送通知。如果需要,需要使用 snapshot_id 更新通知数据。

其他最终用户影响

最终用户将能够从快照创建备份。

性能影响

没有明显的影响性能。

其他部署者影响

部署者将能够备份快照。

开发人员影响

所有卷驱动程序将获得此提案的快照备份功能。无需进行其他更改。

如果驱动程序想要使用更优化的方式通过附加快照,它可以实现 Liberty 版本中添加的以下接口以支持非破坏性备份

  • initialize_connection_snapshot

  • terminate_connection_snapshot

  • create_export_snapshot

  • remove_export_snapshot

以下函数也可以被驱动程序覆盖,默认情况下返回 False

  • backup_use_temp_snapshot

注意:上述所有驱动程序 API 都在 Liberty 版本中添加。此规范没有引入新的驱动程序 API。

实现

负责人

主要负责人

<xing-yang>

其他贡献者

<None>

工作项

  • 修改备份 API 以支持备份快照。

  • 修改备份数据库表以添加 snapshot_id 列。

  • 修改 driver.py 和 lvm.py 中的 backup_volume 函数以支持备份快照。

  • 修改增量备份以考虑从快照创建的备份。

  • 确保代码具有良好的注释,以解释不同的代码路径。

依赖项

测试

将提供单元测试和 tempest 测试。

文档影响

将修改文档以描述如何使用此功能。我们将确保清晰地记录现有用例和新用例,以避免任何混淆。应涵盖以下内容

  • 对状态为“available”或“in-use”的卷进行完整备份。

  • 对状态为“available”或“in-use”的卷进行增量备份。

  • 对快照进行完整备份。

  • 对快照进行增量备份。

还应创建开发人员文档,以解释如何处理不同的备份用例以及它将如何影响从事驱动程序工作的开发人员。

参考资料

代码提交在此处:https://review.openstack.org/#/c/243406/