DAOS 的安装涉及多个组件,这些组件可以是集中式的,也可以是分布式的。
DAOS 软件定义存储 (software-defined storage, SDS) 框架依赖于两种不同的通信通道:
- 用于带外管理 (out-of-band management) 的 TCP/IP 网络;
- 用于数据访问的高性能结构。
实际上,同一个网络可以用于管理和数据访问。IP over Fabric 也可用作管理网络。
DAOS 系统
DAOS 服务器是一个多租户守护进程,运行在 Linux 实例(物理节点、VM 或容器)上,管理分配给 DAOS 本地连接的 SCM (Storage-Class Memory) 和 NVM (Non-Volatile Memory) 存储。它监听由 IP 地址和 TCP 端口号寻址的管理端口,以及由网络 URI 寻址的一个或多个结构端点。
DAOS 服务器是通过 YAML 文件 /etc/daos/daos_server.yml
(可通过命令行指定的其他路径)进行配置的。服务的启动和停止可以与不同的守护进程管理或编排框架集成(systemd 脚本、Kubernetes 服务、或类似 pdsh 和 srun 的并行启动程序)。
DAOS 系统由一个系统名标识,它由一组连接到同一结构的 DAOS 服务器组成。两个不同的系统由两组不相交的服务器组成,彼此不能相互协调。DAOS Pool 也不能跨多个系统。
在内部,DAOS 服务器由多个守护进程组成:
首先要启动的是控制平面(control plane,二进制名 daos_server
)。
- 它负责解析配置文件、配置存储并最终启动和监视数据平面的一个或多个实例。
- 控制平面用 Go 编写,并在 gRPC 框架上实现 DAOS management API。该框架提供了一个安全的带外通道来管理 DAOS 系统。
- 每个服务器要启动的数据平面实例的数量以及存储、CPU 和 Fabric Interface Affinity 可以通过
daos_server.yml
进行配置。
然后是数据平面(data plane,二进制名 daos_engine
)。
数据平面是一个用 C 编写的多线程进程,负责运行 DAOS 存储引擎。它通过 CART 通信中间件处理传入的元数据和 I/O 请求,并通过 PMDK(Persistent Memory Devevelopment Kit,用于 SCM)和 SPDK(Storage Performance Development Kit,用于 NVMe SSD)访问本地 NVM 存储。
数据平面依赖于 ABT (Argobots) 进行基于事件的并行处理,并导出可通过结构独立寻址的多个 Target。
在 DAOS 系统中,每个数据平面实例都被分配一个唯一的等级。
控制平面和数据平面进程通过 Unix Domain Sockets 和被称为 dRPC 的定制轻量级协议进行本地通信。
进一步阅读:
- DAOS 控制平面 DAOS control plane (daos_server)
- DAOS 数据平面 DAOS data plane (daos_engine)
- Persistent Memory Devevelopment Kit
- Storage Performance Development Kit
客户端 API,工具和 I/O 中间件
应用程序、用户和管理员可以通过两个不同的客户端 API 与 DAOS 系统交互。
DAOS management Go package 允许从任何可以通过带外管理通道与 DAOS 服务器通信的节点管理 DAOS 系统。此 API 保留给通过特定证书进行身份验证的 DAOS 系统管理员。DAOS management API 旨在与不同供应商的存储管理或开源编排框架集成。名为 dmg
的命令行工具是在 DAOS management API 上构建的。
进一步阅读:
DAOS 库 libdaos
实现了 DAOS 存储模型,主要面向希望将数据集存储到 DAOS container 中的应用程序和 I/O 中间件开发人员。它可以被连接到目标 DAOS 系统所使用的结构的任何节点使用。
应用程序进程通过 DAOS 代理进行身份验证。libdaos
导出的 API 通常称为 DAOS API(不同于 DAOS management API),允许通过不同的接口(例如键值存储或 array API)管理 container 和访问 DAOS 对象。
libdfs
库模拟 libdaos
上的 POSIX 文件和目录抽象,并为需要 POSIX 命名空间的应用程序提供平滑的迁移过程。
进一步阅读:
- DAOS Library (
libdaos
) and array interface and KV interface built on top of the native DAOS API - Python API bindings
- Go bindings and API documentation
- POSIX File & Directory Emulation (
libdfs
)
libdaos
和 libdfs
库为支持特定的数据格式(例如 HDF5 和 Apache Arrow)提供了基础。
进一步阅读:
代理
DAOS 代理 (DAOS agent) 是驻留在客户端节点上的守护程序,它通过 dRPC 与 DAOS 客户端库进行交互,以验证应用程序进程。
DAOS 代理是一个可信任的实体,可以使用本地证书对 DAOS 客户端凭据进行签名,同时支持不同的身份验证框架,并使用 Unix Domain Sockets 与客户端库通信。
DAOS 代理用 Go 编写,通过 gRPC 与每个 DAOS 服务器的控制平面组件进行通信,向客户端库提供 DAOS 系统成员信息,并支持 Pool 列表。