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 上,在消费者主机上处理复制的好处可以超过性能成本。
添加对此的支持也增加了我们完全支持的后端类型,因为并非所有供应商都会选择在后端支持复制。
并且我们可以在不影响彼此的情况下支持两者。
数据模型影响¶
NVMe 连接器的 connect_volume 和 disconnect_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 客户端(nvme 和 mdadm)需要分别在主机上可用,以进行 NVMe 连接和 RAID 复制。
开发人员影响¶
为存储供应商提供通过其驱动程序支持复制的 NVMeoF 卷的选项。
要使用此功能,卷驱动程序需要暴露复制的 NVMe 存储,并在使用连接器的此功能时提供必要的连接信息。
这不会影响未复制的卷。
实现¶
负责人¶
- Zohar Mamedov
zoharm
工作项¶
所有操作都在 NVMe 连接器中完成
在 connect_volume 中解析复制卷的连接信息。
连接到 NVMeoF 目标并识别设备。
在设备上创建 MD RAID1 阵列。
返回指向 MDRAID 设备的符号链接。
disconnect_volume 销毁 MDRAID。
extend_volume 扩展 MDRAID。
依赖项¶
NVMe 和 MDRAID 及其 CLI 客户端(nvme 和 mdadm)需要分别在主机上可用,以进行 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