NVMeoF 连接代理

https://blueprints.launchpad.net/cinder/+spec/nvmeof-connection-agent

监控 NVMeoF 连接和由新的 NVMeoF 连接器创建的 MDRAID 阵列的守护进程。它将发起端事件报告给存储编排器,识别出现故障的卷副本,请求新的副本,并用新分配的副本替换出现故障的副本。

问题描述

当 NVMe 连接器连接客户端复制的卷时,OpenStack 会将其视为一个卷,无法监控、管理和修复这些 MDRAID 阵列中的副本。此代理将负责处理这些问题。

目前没有机制来监控和修复这些复制的卷。我们不能仅在 Cinder 驱动程序端执行此操作,因为目前没有集成的机制来检测发起端连接事件并在计算节点上执行副本替换。

对于目标端卷复制(传统方法),存储后端负责监控和自我修复。NVMe + MDRAID 方法将数据复制的责任从存储后端转移到消耗发起端(即计算节点)。

因此,监控和修复需要在发起端/计算端进行。

使用这种方法,代理将监控 NVMeoF 连接并向存储编排器/配置器报告更改。它将监控 MDRAID 阵列,并将主机上的物理状态与其来自卷配置器的预期状态进行协调,替换损坏的链路。

最后,编排决策/优化将由卷编排器/配置器使用来自代理监控报告的信息来执行。虽然这超出了代理的范围(这是存储后端实现的功能),但值得在此处提及,它将处理诸如在重新连接场景中避免使用有故障的副本的情况,因为在这种设计方法中,只有发起节点才能检测其 MDRAID 阵列的副本同步状态。

用例

在使用连接到实例很长时间的复制的 NVMeoF 卷时,其中一个副本可能会出现故障。此代理将检测到它并尝试替换它,即自我修复 MDRAID 阵列,而无需从实例分离和重新连接整个卷。

此外,代理将检测并报告连接和副本同步状态事件到存储编排器(或潜在的其他可以使用它的端点) - 这些信息由存储后端收集,用于做出存储配置/编排决策,以及用于遥测。

提议的变更

在 os-brick 中添加一个代理入口点代码,例如:os_brick/os-brick/cmd/agent.py

在 os-brick 的 setup.cfg 中添加一个 entry_points console_scripts 条目

代理主函数将首先通过从预定义的配置文件(例如 /etc/nvme-agent/agent.conf?)读取访问信息来初始化代理,以访问卷编排器/配置器。

特定于供应商的参数将被使用并以供应商前缀为前缀,例如:kioxia_provisioner_ip kioxia_provisioner_port kioxia_provisioner_token kioxia_cert_file

初始化完成后,代理将启动一个定期任务,该任务将执行以下操作

  • 主机探测/心跳到存储编排器/配置器

  • 从配置器拉取卷元数据(连接和复制状态)

  • 监控 NVMeoF 设备和属于它的 MDRAID 阵列

  • 检测连接和复制状态更改并报告给配置器

  • 请求替换有故障的副本

  • 协调来自配置器的副本状态(执行替换)

典型的自我修复流程

  1. 卷副本出现故障

  2. 代理注意到有故障的副本,并报告给配置器

  3. 配置器将副本标记为坏的(因此,除非同步,否则以后不会使用它)

  4. 代理继续从配置器拉取卷信息

  5. 经过一定的宽限期后,代理没有看到来自配置器的有故障副本的状态更改,因此它发送明确的请求来替换副本

  6. 配置器替换副本并更新卷信息

  7. 代理拉取卷副本信息,注意到一个副本已更改

  8. 代理执行副本替换

备选方案

操作员可以使用他们自己的脚本来监控连接和复制的数组状态,报告检测到的事件,并手动执行副本替换。

数据模型影响

REST API 影响

安全影响

需要对根文件系统路径(例如:/sys/class/nvme-fabrics/… /sys/class/block/…)进行读取访问权限,以执行 nvmemdadm 的 sudo 执行。

Active/Active HA 影响

通知影响

其他最终用户影响

性能影响

如果配置为由操作员运行,这将是在计算节点上运行的新进程。虽然它大部分时间都在休眠,但它会每 30 秒唤醒一次来执行其定期任务:探测存储配置器并检查 nvme 连接和 mdraid 状态。

这些任务不是计算密集型的,时间大部分用于等待来自存储配置器的响应,并且 nvme 和 mdraid 操作的时间复杂度仅与代理控制下的设备数量成线性关系(由于每个主机的上限较低,可以将其视为常数)。最后,对网络的影响也很小,因为它只会通过网络发送/接收少量(元)数据。

其他部署者影响

开发人员影响

为了允许多个供应商实现,特定的方法/逻辑对于

  • 探测/心跳存储配置器

  • 从配置器拉取/解析卷元数据

  • 向配置器报告状态更改

  • 请求配置器替换副本

所有这些都涉及与存储后端配置器/编排器的通信和功能,需要基于每个供应商实现。

架构是这样的,代理将是一个定义接口的通用守护进程,而 kioxia 实现将是供应商特定实现的第一个示例。

实现

负责人

Zohar Mamedov

zoharm

工作项

代理入口点和初始化。

代理定期任务

  • 主机探测/心跳

  • 监控(连接和复制事件检测)

  • 向存储配置器报告事件

  • 连接和复制状态协调

依赖项

测试

我们应该只用单元测试就能接受这个。

文档影响

记录此功能将使 os-brick 带有用于启动此代理的控制台脚本。

记录如何配置代理以供使用。

参考资料

幻灯片演示文稿,其中第二张幻灯片包含架构图 https://docs.google.com/presentation/d/1lPU8mQ7jJmr9Tybu5gXkbE7NC1ppkMnoBS4cgSFhzWc