分布式异步对象存储 (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 域套接字与客户端库通信。

相关信息

GitHub: https://github.com/storagezhang

Emai: debugzhang@163.com

华为云社区: https://bbs.huaweicloud.com/blogs/253697

DAOS: https://github.com/daos-stack/daos

本文翻译自 https://daos-stack.github.io/overview/architecture

DAOS 分布式异步对象存储|架构设计的更多相关文章

  1. 从两个模型带你了解DAOS 分布式异步对象存储

    摘要:分布式异步对象存储 (DAOS) 是一个开源的对象存储系统,专为大规模分布式非易失性内存 (NVM, Non-Volatile Memory) 设计,利用了 SCM(Storage-Class ...

  2. DAOS 分布式异步对象存储|存储模型

    概述 DAOS Pool 是分布在 Target 集合上的存储资源预留.分配给每个 Target 上的 Pool 的实际空间称为 Pool Shard. 分配给 Pool 的总空间在创建时确定,后期可 ...

  3. DAOS 分布式异步对象存储|故障模型

    DAOS 依靠大规模分布式单端口存储.因此,每个 Target 实际上都是一个单独的失败点. DAOS 通过在不同的容错域中提供 Target 间的冗余来实现数据和元数据的可用性和持久性.DAOS 内 ...

  4. DAOS 分布式异步对象存储|相关组件

    DAOS 的安装涉及多个组件,这些组件可以是集中式的,也可以是分布式的. DAOS 软件定义存储 (software-defined storage, SDS) 框架依赖于两种不同的通信通道: 用于带 ...

  5. DAOS 分布式异步对象存储|事务模型

    DAOS API 支持分布式事务,允许将针对属于同一 Container 的对象的任何更新操作组合到单个 ACID 事务中.分布式一致性是通过基于多版本时间戳排序的无锁乐观并发控制机制提供的.DAOS ...

  6. DAOS 分布式异步对象存储|数据平面

    DAOS 通过两个紧密集成的平面进行运转.数据平面处理繁重的运输操作,而控制平面负责进程编排和存储管理,简化数据平面的操作. 模块接口 I/O 引擎支持一个模块接口,该接口允许按需加载服务器端代码.每 ...

  7. DAOS 分布式异步对象存储|安全模型

    DAOS 使用了一个灵活的安全模型,将身份验证和授权分离开来.它的设计令其对 I/O 的影响被降到最小. DAOS 对用于 I/O 传输的网络结构没有提供任何传输安全性保障.在部署 DAOS 时,管理 ...

  8. QingStor 对象存储架构设计及最佳实践

    对象存储概念及特性 在介绍 QingStor️对象存储内部的的架构和设计原理之前,我们首先来了解一下对象存储的概念,也就是从外部视角看,对象存储有什么特性,我们应该如何使用. 对象存储本质上是一款存储 ...

  9. 老徐FrankXuLei 受邀为花旗银行讲授《微软WCF服务分布式开发与SOA架构设计课程》

    老徐FrankXuLei 受邀为花旗银行上海研发中心讲授<微软WCF服务分布式开发与SOA架构设计课程> 受邀为花旗银行上海研发中心讲授<微软WCF服务分布式开发与SOA架构设计课程 ...

随机推荐

  1. OTA development

    OTA development OTA update OTA Over the Air / 无线下载 https://en.wikipedia.org/wiki/Over-the-air_progra ...

  2. 钉钉 & URL Scheme & Universal Link & Deep Link

    钉钉 & URL Scheme & Universal Link & Deep Link DD link https://www.cnblogs.com/xgqfrms/p/1 ...

  3. what's the print number means after called the setTimeout function in Chrome console?

    what's the print number means after called the setTimeout function in Chrome console? javascript fun ...

  4. leetcode best solutions

    leetcode best solutions how to learning algorithms form the leetcode best solutions https://leetcode ...

  5. CORS OPTIONS

    CORS OPTIONS A CORS preflight request is a CORS request that checks to see if the CORS protocol is u ...

  6. mysql事务的实现原理

    此篇文章算是对mysql事务的一个总结,基本把mysql事务相关的知识点都涵盖到了,面试问来问去无非也就是这些,在了解这些之前我们先对mysql在执行的过程中 有一个整体的认识,如下图 如上图所示,M ...

  7. Python 股票市场分析实战

    目标: 1.股票数据获取 2.历史趋势分析及可视化 3.风险分析 实验数据:来源于Yahoo Finance / Stooq,该网站提供了很多API接口,本文用的工具是pandas-datareade ...

  8. 小记一下递归通过id寻找一条链路的数据

    Array.prototype.remove = function(val) { var index = this.indexOf(val); if (index > -1) { this.sp ...

  9. Hystrix熔断器的使用步骤

    1.添加熔断器依赖 2.在配置文件中开启熔断器 feign.hystrix.enabled=true 3.写接口的实现类VodFileDegradeFeignClient,在实现类中写如果出错了输出的 ...

  10. Numpy初体验

    目录 Numpy 一.简介 1.安装 2.特殊的导包 二.ndarray-多维数组对象 1.创建ndarray数组 1.1 array 1.2 arange 1.3 linspace 1.4 zero ...