分布式异步对象存储 (DAOS) 是一个开源的对象存储系统,专为大规模分布式非易失性内存 (NVM, Non-Volatile Memory) 设计,利用了SCM(Storage-Class Memory) 和 NVMe(Non-Volatile Memory express) 固态盘等的下一代 NVM 技术。
DAOS 是一种横向扩展的对象存储,可以为高性能计算应用提供高带宽、低延迟和高 IOPS 的存储容器,并支持结合仿真、数据分析和机器学习的下一代以数据为中心的工作流程。
与主要针对旋转介质设计的传统存储堆栈不同,DAOS 针对全新 NVM 技术进行了重新构建,可在用户空间中端对端地运行,并能完全绕开操作系统,是一套轻量级的系统。
DAOS 提供了一种为访问高细粒度数据提供原生支持的 I/O 模型,而不是传统的基于高延迟和块存储设计的 I/O 模型,从而释放下一代存储技术的性能。
与传统的缓冲区不同,DAOS 是一个独立的高性能容错存储层,它不依赖其它层来管理元数据并提供数据恢复能力。DAOS 服务器将其元数据保存在持久内存中,而将批量数据直接保存在 NVMe 固态盘中。
DAOS 特性
DAOS 依靠 OFI(OpenFabric Interface) 绕过操作系统,将 DAOS 操作交付给 DAOS 存储服务器,充分利用架构中的任何远程直接内存访问 (RDMA, Remote Direct Memory Access) 功能,进行低延迟、高消息速率的用户空间通信,并将数据存储在持久内存和 NVMe 固态盘中。
DAOS 的键值存储接口提供了统一的存储模型,通过迁移 I/O 中间件库实现对 DAOS API 的原生支持后,就能利用 DAOS 丰富的 API 和先进功能,例如 HDF5、MPI-IO 和 Apache Arrow。
DAOS 还提供 POSIX 的仿真。POSIX 不再是新数据模型的基础,而是像其他 I/O 中间件一样,POSIX 接口将构建为 DAOS 后端 API 顶部的库。
DAOS 的 I/O 操作会被记录并存储到 SCM 维护到持久索引中,每次 I/O 都用一个特定时间戳标记,并与数据集的特定版本关联。内部不执行读-修改-写 (read-modify-write) 操作,写入操作是无损的,对对齐不敏感。在读取请求时,DAOS 服务器遍历持久索引,创建聚合 RDMA 描述符,从而直接在应用程序提供的缓冲区中重建所请求的版本的数据。
SCM 直接映射到 DAOS 服务地址空间的内存,DAOS 服务通过直接加载/存储来管理持久索引。根据不同 I/O 的特性,DAOS 服务可以决定将 I/O 存储在 SCM 或 NVMe 中:
- 对延迟敏感的I/O(如应用程序元数据和字节粒度数据)通常存储在 SCM 中;
- 检查点和批量数据存储在 NVMe 中。
这种方法允许 DAOS 将数据流式传输到 NVMe 中,并在 SCM 中维护内部元数据索引,为批量数据提供原始 NVMe 带宽。持久内存开发工具包 PMDK 管理对 SCM 的事务性访问,存储性能开发工具包 SPDK 对 NVMe 设备进行用户空间 I/O 操作。
DAOS 可以提供:
- 超高细粒度、低延迟和真正零拷贝的 I/O
- 非阻塞型数据和元数据操作,以支持 I/O 和计算重叠
- 先进的数据放置,以解决故障域
- 由软件管理冗余,可通过在线重建,支持复制和擦除代码
- 端到端 (E2E) 数据完整性
- 可扩展的分布式事务,提供可靠的数据一致性和自动恢复功能
- 数据集快照功能
- 安全框架,用于管理存储池的访问控制
- 软件定义存储管理,用于调配、配置、修改和监控存储池
- 通过 DAOS 数据模型和 API,为 I/O 中间件库(例如 HDF5、 MPI-IO 和 POSIX)提供原生支持。应用无需移植代码,即可直接使用 DAOS API
- Apache Spark 集成
- 使用发布/订阅 API,实现原生生产者/消费者工作流程
- 数据索引和查询功能
- 存储内计算,以减少存储和计算节点之间的数据移动
- 容灾工具
- 与 Lustre 并行文件系统无缝集成,并能扩展到其他并行文件系统,从而为跨多个存储层的数据访问提供统一的命名空间
- 数据搬运器,用于在 DAOS 池之间迁移数据集,将数据集从并行文件系统迁移到 DAOS,反之亦然
DAOS 组件
一个数据中心可能有数十万个计算节点,通过一个可伸缩的高性能结构相互连接,其中所有节点或称为存储节点的节点子集都可以直接访问 NVM 存储。
DAOS 安装涉及几个可以集中或分布式的组件。
DAOS 系统和存储节点
DAOS系统由一个系统名标识,它由一组连接到同一结构的 DAOS 存储节点组成。DAOS 存储节点为每个节点运行一个 DAOS 服务实例,该实例为每个物理套接字启动一个 DAOS I/O 引擎进程。这些 DAOS 服务的信息被记录到系统映射中,该映射为每个 I/O 引擎进程分配一个唯一的整数秩。两个不同的 DAOS 系统由两组不相交的 DAOS 服务器组成,它们之间无法相互配合。
DAOS 服务
DAOS 服务是一个多租户守护进程,运行在每个存储节点的 Linux 实例上(物理节点、虚拟机或容器)。服务的 I/O 引擎子进程通过网络导出本地连接的 SCM 和 NVM 存储。服务监听一个管理端口(由 IP 地址和 TCP 端口号寻址),以及一个或多个结构端点(由网络 URI 寻址)。
DAOS 服务通过 /etc/DAOS
中的 YAML 文件进行配置,包括其 I/O 引擎子进程的配置。服务的启动可以与不同的守护进程管理或编排框架集成(systemd 脚本、Kubernetes 服务、或类似 pdsh 和 srun 的并行启动程序)。
I/O引擎
在 DAOS I/O 引擎中,存储静态地跨越多个 Target 分区,增强并发能力。为了避免竞争,每个 Target 都有其私有存储、自己的服务线程池以及专用的网络上下文,这些上下文可以直接通过结构寻址,而不依赖于托管在同一存储节点上的其他 Target 。
SCM 模块通常以 AppDirect interleaved 模式配置。因此,它们作为每个套接字(在 fsdax
模式)的单个 PMEM 命名空间呈现给操作系统。当配置每个 I/O 引擎的 N 个 Target 时,每个 Target 都使用该套接字 fsdax
的 SCM 容量的 \(\frac{1}{N}\),与其它 Target 独立。每个 Target 还使用连接到此套接字的 NVMe 驱动器容量的一小部分。
Target
Target 没有针对存储介质故障实现任何内部数据保护机制。因此,一个 Target 就是一个单点故障,同时也是故障单元。动态状态与每个 Target 相关联:其状态可以是“up and running”,也可以是“down and not available”。
Target 是性能的单位。与 Target 关联的硬件组件(如后端存储介质、CPU 核心和网络)的能力和容量有限。
DAOS I/O 引擎实例导出的 Target 数是可配置的,取决于底层硬件(I/O 引擎实例的 SCM 模块数和 NVMe SSD 数)。I/O 引擎的 Target 数的最佳配置是该 I/O 引擎服务的 NVMe 驱动器数的整数倍。
存储 API、应用程序接口和工具
应用程序、用户和管理员可以通过两个不同的客户端 API 与 DAOS 系统交互。
管理 API 提供了管理 DAOS 系统的接口。它旨在与不同供应商的存储管理或开源编排框架集成。dmg
命令行工具是在 DAOS 的管理 API 上构建的。
DAOS 库 libdaos
实现了 DAOS 存储模型,主要提供给希望在 DAOS 系统中存储数据集的应用程序和 I/O 中间件的开发人员。用户常用的 daos
命令等的也构建在 API 之上,允许用户通过命令行管理数据集。
应用程序可以通过本机 DAOS API、I/O 中间件库(如 POSIX 仿真、MPI-IO、HDF5)或已与本机 DAOS 存储模型集成的 Spark 或 TensorFlow 等框架直接访问存储在 DAOS 中的数据集。
代理
DAOS 代理是驻留在客户端节点上的守护进程,通过与 DAOS 库交互验证应用程序进程。它是一个可信任的实体,支持使用证书对 DAOS 客户端进行签名。DAOS 代理支持不同的身份验证框架,并使用 Unix 域套接字与客户端库通信。