Cinder 的 NFS 备份驱动

https://blueprints.launchpad.net/cinder/+spec/nfs-backup [1]

目前,cinder-backup 不支持备份到 NFS 提供的存储库。此蓝图旨在实现此功能。

问题描述

  • 目前 cinder 卷的备份可用于 Ceph 对象存储或通过 Tivoli Storage Manager。虽然这些选择对于某些用户来说是合适的,但它们并不能解决所有 OpenStack 操作员或部署场景的问题。

  • 一些拥有 NFS 存储设备或可扩展 NFS 存储集群的 OpenStack 管理员希望利用这些设备为他们的 cinder 卷提供备份,无论 NFS 是否用作 cinder 卷后端。

  • 一些后端提供商需要 OpenStack 中的动态挂载管理,就像 NFS 卷驱动程序中一样,以便更好地管理备份数据安全,为支持和合同提供更确定的环境,并最大限度地减少对 OpenStack 发行版和自动化软件包外部的依赖。

  • NFS 备份驱动不应复制 POSIX 文件系统驱动程序(目前正在审核,参见 [3] 和 [4])提供的功能。

用例

提议的变更

以下建议的前提是 POSIX 文件系统驱动程序 ([3] 和 [4]) 已合并到上游,并且 POSIX 文件系统驱动程序反过来扩展了一个“分块”基类,该基类抽象了先前仅在 Swift 备份驱动程序中通用的功能(参见 [5] 和 [6])。

我们建议在 POSIX 文件系统 BackupDriver 类下实现一个 NFSBackupDriver 类

                +----------------------+
                |                      |
      +-------->|     BackupDriver     |<-----+
      |         |                      |      |
      |         +----------^-----------+      |
      |                    |                  |
      |                    |                  |
+-----+------+ +-----------+---------+ +------+-----+
|    TSM     | |        Chunking     | |    Ceph    |
| BkupDriver | |       BkupDriver    | | BkupDriver |
|            | |          Base       | |            |
+------------+ +---^--------------+--+ +------------+
                   |              |
                   |              |
             +-----+-----+  +-----+------+
             |   Swift   |  |   POSIX    |
             | BkupDriver|  | BkupDriver |
             | (default) |  |            |
             +-----------+  +-----^------+
                                  |
                                  |
                            +-----+------+
                            |    NFS     |
                            | BkupDriver |
                            |            |
                            +------------+

NFS 备份驱动程序将覆盖父 POSIX 文件系统驱动程序的 __init__() 方法,以便使用与卷驱动程序用于此目的的“brick”代码进行动态挂载,如 [2] 中所示。通过此扩展,它将在初始化时连接到外部配置的 NFS 共享。

这个通用的 NFS 备份驱动程序将继承其父程序中的方法来创建、删除和恢复备份。

可以添加价值的后端供应商,例如,通过避免或减少 cinder 节点和后端存储阵列之间的传输操作的数据传输技术,可以自行扩展通用的 NFS 备份驱动程序。为此,我们已经同意 POSIX 备份驱动程序将显式实现一个通用的数据传输方法,子类可以覆盖该方法,或者从 Chunking Base Class 继承该方法。此外,虽然此通用的数据传输方法可以实现压缩作为选项,但重要的是它只能是一个选项,因为后端可以选择自行实现压缩或去重。

此处提出的方法的优点是,用户应该能够切换到 posix、NFS 以及 NFS 备份驱动程序的供应商特定扩展,并且备份操作将继续工作,即使它们使用不同的数据传输机制。

备选方案

在图中,Swift 和 POSIX 共享的通用代码通过继承和“is-a”关系实现。对于此建议,与库的“has-a”关系也可以工作。

如果其他 NAS 驱动程序(GlusterFS、SMB 等)也选择实现动态挂载管理,我们可以将 RemoteFS Backup Driver 作为它们的通用父类抽象出来,并在 NFS 备份驱动程序(和其他 NAS 驱动程序)与 POSIX 文件系统驱动程序之间进行插值。或者,我们可能能够共享大多数配置选项,并将原始 NFS 备份驱动程序实现提升到 RemoteFS 驱动程序角色。

数据模型影响

无。

REST API 影响

无。

安全影响

NFS 备份将以非 root 用户身份运行,并且建议的驱动程序不会在挂载备份存储库时提升用户权限。当它执行挂载时,它将调用 brick 代码来执行此操作。因此,此驱动程序的唯一权限提升将在一个通用库中。该库已经过审核并进行了调整,作为最近 NFS 安全增强 [7] 的一部分,解决了 launchpad bug 1260679 [8] 的 NFS 端问题。

由于备份驱动程序以普通用户身份运行,因此它可以与启用了 root squash 的安全 NAS 环境配合使用。

备份驱动程序将 chmod ‘660’ 实际备份数据和元数据,并将 chmod ‘770’ 设置为路径中的目录。

通知影响

无。

其他最终用户影响

无。

性能影响

备份服务通常会对性能产生影响。对这个驱动程序类进行的未来增强或扩展可以寻求减少备份和恢复过程中的数据传输带宽,或寻求差分备份策略以减少典型备份中涉及的工作量。

POSIX 路径备份可能会生成包含大量备份文件的目录,使得目录操作成本非常高。我们应该实现某种目录层次结构以保持目录大小合理。请参阅 [2] 以了解一种方法。

其他部署者影响

无。

开发人员影响

无。

实现

备份数据和元数据将写入存储库中的唯一路径,这些路径是备份 ID 的函数。该路径将存储在备份记录 service_metatdata 中,以便可以用于导航到备份数据和元数据以进行恢复和删除操作。

备份和恢复操作将共享一个通用方法,用于在卷和备份之间传输数据,反之亦然。该方法最初将实现为朴素的块复制,但允许增强或扩展,例如减少或消除 cinder 节点和 NFS 服务器之间的备份数据移动。

负责人

主要负责人

Tom Barron (tbarron)

其他贡献者

Kevin Fox (kfox1111) - POSIX 文件系统驱动程序和 Chunking Base 类

工作项

依赖项

测试

  • 将添加适当的单元测试。

  • 将 cinder.conf 中 backup_driver 选项设置为 NFS 驱动程序而不是 Swift 的现有测试将提供 tempest 覆盖。

文档影响

更新 OpenStack 配置参考的备份部分,以指示如何使用 NFS 服务器执行卷备份。具体来说,记录

  • cinder.conf backup_driver 选项的新值:cinder.backup.drivers.nfs

  • cinder.conf 选项 ‘backup_nfs_share’ 的新值,默认值为 None,值为以下格式之一

    - <fqdn>:<posix-path>
    - <ipv4addr>:<posix-path>
    - [<ipv6addr>]:<posix-path>
    
  • cinder.conf 选项 ‘backup_nfs_mount_options’ 的新值,默认值为 None,值为 NFS man 页面中指定的值以及在 NFS 卷驱动程序中使用的值。注意:如果我们可以就 NFS 通用的值达成一致,那么将默认值设置为针对备份性能进行调整可能是有意义的。否则,不同的 NFS 后端可能希望扩展此类并设置最佳的后端特定默认选项。

参考资料

[1]: https://blueprints.launchpad.net/cinder/+spec/nfs-backup [2]: https://review.openstack.org/#/c/138234 [3]: https://blueprints.launchpad.net/cinder/+spec/add-backup-driver-nas-storage [4]: https://review.openstack.org/#/c/82996 [5]: https://blueprints.launchpad.net/cinder/+spec/chunked-backup-base-class [6]: https://review.openstack.org/#/c/139737/ [7]: https://review.openstack.org/#/c/107693 [8]: https://bugs.launchpad.net/cinder/+bug/1260679