NVMe 连接器支持 MDRAID 复制

https://blueprints.launchpad.net/cinder/+spec/nvme-of-add-client-raid-1

通过 MDRAID 复制的 NVMe 连接器卷支持。允许 OpenStack 使用分布在可扩展存储上的复制的 NVMe 卷。

问题描述

在使用块存储时,需要块卷的弹性。虽然目标仍然是单点故障,但可以通过 NVMe 和 iSCSI 在存储后端实现这一点。并且多路径不能处理卷数据复制,它只是处理到目标的路径的 HA。

暴露高性能 NVMeoF 存储的存储解决方案需要一种处理卷复制的方法。我们建议通过在主机上使用 RAID1 来实现这一点,因为在这种环境下相对性能影响将较小,并且会被带来的好处大大超过。

用例

当需要 NVMeoF 存储的弹性时。

利用高性能网络上的 NVMe,在保持良好性能的同时获得主机上复制的好处。

在这种情况下,卷副本故障不会对用户产生影响,并允许无缝进行自我修复。

对于卷驱动程序开发人员,这将允许他们支持 OpenStack 使用他们在存储后端暴露的复制卷。

以这种模式运行的最终用户将受益于 NVMe 的性能,并由于卷复制而增加弹性。

提议的变更

扩展 os-brick 中的 NVMeoF 连接器,以便能够接收复制卷的连接信息。

当调用 connect_volume 时并带有复制卷信息,NVMe 将连接到所有副本目标并创建 RAID1 在这些设备之上。

NVMe client RAID diagram

备选方案

复制也可以在后端主动维护,这是通常的做法。但是,在高性能网络上的 NVMe 上,在消费者主机上处理复制的好处可以超过性能成本。

添加对此的支持也增加了我们完全支持的后端类型,因为并非所有供应商都会选择在后端支持复制。

并且我们可以在不影响彼此的情况下支持两者。

数据模型影响

NVMe 连接器的 connect_volumedisconnect_volume 参数 connection_properties 现在还可以包含一个 volume_replicas 列表,其中将包含连接到 NVMe 子系统并对其进行 MDRAID 复制所需的信息。

volume_replicas 列表中的每个副本字典必须包含正常的扁平连接属性。

如果 volume_replicas 只有一个副本,则将其视为未复制的卷。

如果省略 volume_replicas,则使用现有版本的此 NVMe 连接器中 NVMe 的正常扁平连接属性。

未复制卷的连接属性

{'uuid': '96e25fb4-9f91-4c88-ab59-275fd354777e',
 'nqn': 'nqn.2014-08.org.nvmexpress:uuid:...'
 'portals': [{
     'address': '10.0.0.101',
     'port': '4420',
     'transport': 'tcp'
 }],
 'volume_replicas': None}

复制卷的连接属性

{'volume_replicas': [
     {'uuid': '96e25fb4-9f91-4c88-ab59-275fd354777e',
      'nqn': 'nqn.2014-08.org.nvmexpress:uuid:...'
      'portals': [{
          'address': '10.0.0.101',
          'port': '4420',
          'transport': 'tcp'
      }]},
     {'uuid': '12345fb4-9f91-4c88-ab59-275fd3544321',
      'nqn': 'nqn.2014-08.org.nvmexpress:uuid:...'
      'portals': [{
          'address': '10.0.0.110',
          'port': '4420',
          'transport': 'tcp'
      }]},
]}

REST API 影响

安全影响

管理 MDRAID 需要提升权限。(当前的 NVMe 连接器已经执行 nvme cli 的 sudo 执行,因此此更改将只是添加 mdadm 的执行)

Active/Active HA 影响

通知影响

其他最终用户影响

在这种复制模式下工作将允许在特殊情况下,例如,具有 4 个副本的 MDRAID 阵列失去与两个副本的连接,继续将数据写入剩余的两个副本。然后,在重启或迁移后的重新连接后,由于某种原因,现在只能访问最初丢失的两个副本,而不能访问“良好”的两个副本,那么重新创建的 MDRAID 阵列将具有旧/坏数据。

可以通过存储后端感知阵列中设备发生故障来解决上述问题。这是由 NVMe 监控代理启用的,它可以识别阵列中发生故障的副本并通知存储后端,该后端将这些副本标记为复制卷的故障副本。

不支持 NVMe MDRAID 卷的多重附加。

性能影响

复制卷的附加速度会较慢(需要构建 MDRAID 阵列)。这是一个公平的权衡,速度较慢的附加以换取更高的弹性。

其他部署者影响

NVMe 和 MDRAID 及其 CLI 客户端(nvmemdadm)需要分别在主机上可用,以进行 NVMe 连接和 RAID 复制。

开发人员影响

为存储供应商提供通过其驱动程序支持复制的 NVMeoF 卷的选项。

要使用此功能,卷驱动程序需要暴露复制的 NVMe 存储,并在使用连接器的此功能时提供必要的连接信息。

这不会影响未复制的卷。

实现

负责人

Zohar Mamedov

zoharm

工作项

所有操作都在 NVMe 连接器中完成

  • connect_volume 中解析复制卷的连接信息。

  • 连接到 NVMeoF 目标并识别设备。

  • 在设备上创建 MD RAID1 阵列。

  • 返回指向 MDRAID 设备的符号链接。

  • disconnect_volume 销毁 MDRAID。

  • extend_volume 扩展 MDRAID。

依赖项

NVMe 和 MDRAID 及其 CLI 客户端(nvmemdadm)需要分别在主机上可用,以进行 NVMe 连接和 RAID 复制。如果未找到它们,则正常降级。

测试

为了在 tempest 中正确测试此功能,需要对存储后端进行编程访问。例如,为了使复制卷的驱动器之一发生故障。

我们也可以仅通过检查连接的 NVMe 子系统(nvme list)和扫描 MDRAID 阵列(mdadm -D scan)来查看是否连接了多个 NVMe 设备并创建了 RAID 来通过。

无论哪种方式,tempest 都需要知道存储后端配置为使用复制的 NVMe 卷,然后才能执行这些检查。

除此之外,使用 NVMe 复制卷后端运行 tempest 仍然可以完全测试此功能,只是具体的断言(nvme 设备和 RAID 信息)会有所不同。

最后,我们将从单元测试开始,并将功能测试作为 os-brick 的一个延伸目标。

文档影响

记录 NVMe 连接器现在支持复制卷,并且需要从卷驱动程序提供副本的连接信息才能支持它。

参考资料

架构图 https://wiki.openstack.org/wiki/File:Nvme-of-add-client-raid1-detail.png