本文的目的是描述DAOS使用的内部代码结构和主要算法,包含以下部分:
DAOS Components
如下图所示,DAOS安装涉及多个组件,这些组件可以是同一位置的,也可以是分布式的。DAOS软件定义存储(SDS)框架依赖于两种不同的通信通道:用于管理的带外TCP/IP网络和用于数据访问的高性能fabric。实际上,同一个网络可以用于管理和数据访问。IP over fabric也可用作管理网络。
DAOS System
DAOS服务器是一个多租户守护进程,运行在Linux实例(即物理节点、VM或container)上,管理分配给DAOS的本地连接的SCM和NVM存储。它侦听由IP地址和TCP端口号寻址的管理端口,以及由网络URI寻址的一个或多个fabric端点。DAOS服务器是通过YAML文件(/etc/DAOS/DAOS_server.yml,或命令行提供的其他路径)配置的。启动和停止DAOS服务器可以与不同的守护进程管理或编排框架(例如systemd脚本、Kubernetes服务,甚至通过pdsh或srun之类的并行启动程序)集成。
DAOS系统由一个系统名标识,它由一组连接到同一结构的DAOS服务器组成。两个不同的系统由两组不相交的服务器组成,彼此不协调。DAOSpool 不能跨多个系统。
在内部,DAOS服务器由多个守护进程组成。第一个要启动的是控制平面(二进制名为daos_server),它负责解析配置文件、配置存储并最终启动和监视数据平面的一个或多个实例(二进制名为daos_engine)。控制平面用Go编写,并在gRPC框架上实现DAOS管理API,该框架提供了一个安全的带外通道来管理DAOS系统。每个服务器要启动的数据平面实例的数量以及存储、CPU和结构接口关联可以通过daos_server.yml YAML配置文件进行配置。
数据平面是一个用C编写的多线程进程,它运行DAOS存储引擎。它通过CART通信中间件处理传入的元数据和I/O请求,并通过PMDK(用于存储类内存,又称SCM)和SPDK(用于NVMe ssd)库访问本地NVM存储。数据平面依赖于argobot进行基于事件的并行处理,并导出可通过fabric独立寻址的多个目标。在DAOS系统中,每个数据平面实例都被分配一个唯一的rank值。
控制平面和数据平面进程通过Unix域套接字和称为dRPC的定制轻量级协议进行本地通信。
For further reading:
Client APIs, Tools and I/O Middleware
应用程序、用户和管理员可以通过两个不同的client api与DAOS系统交互。
DAOS management Go包允许从任何(可以通过带外管理通道与DAOS服务器通信的)节点管理DAOS系统。此API保留给通过特定证书进行身份验证的DAOS系统管理员。DAOS管理API旨在与不同的特定于供应商的存储管理或开源编排框架集成。名为dmg的CLI工具是在DAOS管理API上构建的。有关管理API和dmg工具的进一步阅读:
DAOS库(libdaos)实现DAOS存储模型,主要面向希望将数据集存储到DAOScontainer中的应用程序和I/O中间件开发人员。它可以从连接到目标DAOS系统使用的结构的任何节点使用。应用程序进程通过DAOS代理进行身份验证(请参阅下一节)。libdaos导出的API通常称为DAOS API(与DAOS管理API不同),允许通过不同的接口(例如键值存储或数组API)管理container和访问DAOS对象。libdfs库模拟libdaos上的POSIX文件和目录抽象,并为需要POSIX命名空间的应用程序提供平滑的迁移路径。有关libdaos、不同编程语言和libdf的绑定的进一步阅读:
- 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)提供了基础。有关I/O中间件集成的进一步阅读,请查看以下外部参考资料:
Agent
DAOS代理是驻留在客户机节点上的守护程序。它通过dRPC与DAOS客户机库交互,以验证应用程序进程。它是一个可信任的实体,可以使用本地证书对DAOSclient 凭据进行签名。DAOS代理可以支持不同的身份验证框架,并使用Unix域套接字与客户机库通信。DAOS代理用Go编写,通过gRPC与每个DAOS服务器的控制平面组件进行通信,向客户机库提供DAOS系统成员信息,并支持pool 列表。
Network Transport and Communications
如前一节所述,DAOS使用三种不同的通信信道。
gRPC and Protocol Buffers
gRPC为DAOS管理提供了双向安全通道。它依赖于TLS/SSL来验证管理员角色和服务器。协议缓冲区用于RPC序列化,所有proto文件都位于proto目录中。
dRPC
dRPC是在Unix域套接字上构建的用于进程间通信的通信通道。它提供了C和Go接口,以支持以下两者之间的交互:
- the daos_agent and libdaos for application process authentication
- the daos_server (control plane) and the daos_engine (data plane) daemons Like gRPC, RPC are serialized via protocol buffers.
CART
CART是一个用户空间函数传递库,它为DAOS数据平面提供低延迟高带宽通信。它支持RDMA功能和可扩展的集合操作。CART 是在Mercury (水银)和libfabric上建造的。CART库用于libdaos和daos_engine 实例之间的所有通信。
DAOS Layering and Services
Architecture
如下图所示,DAOS堆栈被构造为client/server体系结构上的存储服务集合。DAOS服务的例子有pool 、container、对象和重建服务。
DAOS服务可以分布在控制和数据平面上,并通过dRPC进行内部通信。大多数服务都有client 和服务器组件,可以通过gRPC或CART进行同步。跨服务通信总是通过直接的API调用来完成的。这些函数调用可以跨服务的client 或服务器组件调用。虽然每个DAOS服务都被设计成相当自治和隔离的,但有些服务的耦合比其他服务更紧密。这通常是重建服务的情况,它需要与pool 、container和对象服务密切交互,以便在DAOS服务器发生故障后恢复数据冗余。
基于服务的体系结构提供了灵活性和可扩展性,它与一组基础结构库相结合,这些库提供了可供所有DAOS服务访问的丰富软件生态系统(例如,通信、持久存储访问、具有依赖关系图的异步任务执行、加速器支持等)。
Source Code Structure
每个基础结构库和服务在src/下分配一个专用目录。服务的客户机和服务器组件存储在不同的文件中。作为客户机组件的一部分的函数的前缀是dc \(代表DAOS client),而服务器端函数的前缀是ds \(代表DAOS server)。client 和服务器组件之间使用的协议和RPC格式通常在名为RPC.h的头文件中定义。
在控制平面上下文中执行的所有Go代码都位于src/control下。管理和安全是分布在控制(Go语言)和数据(C语言)平面上的服务,通过dRPC进行内部通信。
向最终用户(即i/O中间件或应用程序开发人员)公开的官方DAOSAPI的标头位于src/include下,并使用DAOS\前缀。每个基础结构库导出一个API,该API在src/include/daos下可用,可以由任何服务使用。给定服务导出的client API(带有dc前缀)也存储在src/include/daos下,而服务器端接口(带有ds前缀)则存储在src/include/daos\srv下。
Infrastructure Libraries
GURT和common DAOS(即libdaos_ common)库为DAOS服务提供日志记录、调试和公共数据结构(如哈希表、btree等)。
本地NVM存储由版本对象存储(VOS)和blob I/O(BIO)库管理。VOS在SCM中实现持久索引,而BIO负责根据分配策略将应用程序数据存储在NVMe SSD或SCM中。VEA层集成到VOS中,并管理NVMe ssd上的块分配。
DAOS对象分布在多个目标上,以实现性能(即分片)和恢复能力(即复制或擦除代码)。placement库实现不同的算法(例如,基于环的放置、跳转一致性散列…)从目标列表和对象标识符生成对象的布局。
复制服务(RSVC)库最终提供了一些支持容错的公共代码。pool 、container和管理服务与RDB库结合使用,RDB库在Raft上实现复制的键值存储。
For further reading on those infrastructure libraries, please see: 有关这些基础结构库的更多信息,请参阅:
· Common Library
· Versioning Object Store (VOS)
· Blob I/O (BIO)
· Algorithmic object placement
· Replicated database (RDB)
· Replicated service framework (RSVC)
Software Compatibility
DAOS中的互操作性是通过持久数据结构的协议和模式版本控制来处理的。
Protocol Compatibility
DAOS存储堆栈将提供有限的协议互操作性。将执行版本兼容性检查以验证:
- All targets in the same pool run the same protocol version.
- Client libraries linked with the application may be up to one protocol version older than the targets.
如果在同一pool 中的存储目标之间检测到协议版本不匹配,则整个DAOS系统将无法启动,并将向控制API报告失败。类似地,来自运行与目标不兼容的协议版本的client 的连接将返回错误。
PM Schema Compatibility and Upgrade
持久数据结构的模式可能会不时地演变,以修复错误、添加新的优化或支持新的特性。为此,持久数据结构支持模式版本控制。
升级模式版本不是自动完成的,必须由管理员启动。将提供一个专用的升级工具,将模式版本升级到最新版本。同一pool 中的所有目标必须具有相同的模式版本。版本检查在系统初始化时执行,以强制执行此约束。
为了限制验证矩阵,每个新的DAOS版本都将发布一个受支持的模式版本列表。要使用新的DAOS版本运行,管理员需要将DAOS系统升级到受支持的模式版本之一。新target将始终使用最新版本重新格式化。此版本控制模式仅适用于存储在持久内存中的数据结构,而不适用于只存储用户数据而不存储元数据的块存储。