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

DAOS 经过两个紧密集成的平面进行运转。数据平面处理繁重的运输操做,而控制平面负责进程编排和存储管理,简化数据平面的操做。git

模块接口

I/O 引擎支持一个模块接口,该接口容许按需加载服务器端代码。每一个模块实际上都是一个库,由 I/O 引擎经过 dlopen 动态加载。模块和 I/O 引擎之间的接口在 dss_module 数据结构中定义。github

每一个模块应指定:数组

  • 模块名
  • daos_module_id 中的模块标识符
  • 特征位掩码
  • 一个模块初始化和销毁函数

此外,模块还能够选择配置:缓存

  • 在整个堆栈启动并运行后调用的配置和清理函数
  • CART RPC 处理程序
  • dRPC 处理程序

线程模型与 Argobot 集成

I/O 引擎是一个多线程进程,使用 Argobot 进行非阻塞处理。服务器

默认状况下,每一个 Target 都会建立一个 main xstream 和 no offload xstreams。offload xstream 的实际数量能够经过 daos_engine 命令行参数进行配置。此外,还建立了一个额外的 xstream 来处理传入的元数据请求。每一个 xstream 都绑定到一个特定的 CPU 核心。main xstream 接收来自客户端和其余服务器的 Target 传入请求。一个特定的 ULT (User Level Thread) 会在网络和 NVMe I/O 操做方面提供帮助。网络

Thread-local Storage (TLS)

每一个 xstream 分配的私有存储能够经过 dss_tls_get() 函数进行访问。数据结构

注册时,每一个模块能够指定一个模块密钥,该密钥的数据结构大小将由 TLS 中的每一个 xstream 进行分配。多线程

dss_module_key_get() 函数的做用是:返回特定注册模块密钥的数据结构。函数

Incast Variable 集成

DAOS 使用 IV (incast variable) 在单个 IV 命名空间(组织结构为树)下的服务器之间共享值和状态。树的根节点称为 IV leader,服务器能够是叶子节点也能够是非叶子节点。命令行

每一个服务器都维护本身的 IV 缓存。在获取过程当中,若是本地缓存不能完成请求,它会将请求转发给其父缓存,直到到达根缓存 (IV leader)。对于更新操做,服务器首先更新它的本地缓存,而后转发到它的父缓存,直到到达根缓存,而后将更改传播到其余的服务器。

IV 命名空间是属于每一个 Pool 的,在 Pool 链接期间建立,在 Pool 断开链接期间销毁。

要使用 IV,每一个用户须要在 IV 命名空间下注册本身以得到标识符,而后用户将使用这个 ID 来获取或更新本身在 IV 命名空间下的 IV 值。

dRPC 服务器

I/O 引擎包括一个 dRPC 服务器,它监听给定 Unix Domain Socket 上的活动。

有关 dRPC 的基础知识以及 Go 和 C 中的底层 API 的更多详细信息,请参阅 dRPC Documentation

dRPC 服务器按期轮询传入的客户端链接和请求。它能够经过 struct drpc_progress_context 对象同时处理多个客户端链接,该对象管理监听 Socket 的 struct drpc 对象以及任何活动的客户端链接。

服务器在 xstream 0 本身的 ULT (User Level Thread) 中循环运行。dRPC Socket 已设置为非阻塞的,而且使用无超时轮询。这容许服务器在 ULT 中运行,而不是在本身的 xstream 中运行,预计该通道的流量相对较低。

dRPC 进程

drpc_progress 表示 dRPC 服务器循环的一次迭代。其工做流程以下:

  1. 在监听 Socket 和任何打开的客户端链接上同时进行超时轮询。
  2. 若是在客户端链接上看到任何活动:
    1. 若是数据已输入:调用 drpc_recv 处理输入的数据。
    2. 若是客户端已断开链接或链接被破坏:释放 struct drpc 对象并将其从 drpc_progress_context 中删除。
  3. 若是在监听器上发现任何活动:
    1. 若是有新的链接进入:调用 drpc_accept 并将新的 struct drpc 对象添加到 drpc_progress_context 中的客户端链接列表中。
    2. 若是有错误:将 -DER_MISC 返回给调用者。I/O 引擎中会记录该错误,但不会中断 dRPC 服务器循环。在监听器上获取到错误是意外状况。
  4. 若是没有看到任何活动,则将 -DER_TIMEDOUT 返回给调用者。这纯粹是为了调试目的,实际上,I/O 引擎会忽略此错误代码,由于缺乏活动实际上并非一种错误。

dRPC 处理程序注册

单个 DAOS 模块能够经过注册一个或多个 dRPC 模块 ID 的处理函数来实现对 dRPC 消息的处理。

注册处理程序很简单。在 dss_server_module 的字段 sm_drpc_handlers 中,静态分配一个 struct dss_drpc_handler数组,该数组的最后一项为零,以指示列表的结尾。将字段设置为 NULL 表示没有要注册的处理程序。当 I/O 引擎加载 DAOS 模块时,它将自动注册全部 dRPC 处理程序。

注意:

  • dRPC 模块 ID 与 DAOS 模块 ID 不一样。
  • 这是由于给定的 DAOS 模块可能须要注册多个 dRPC 模块 ID,具体数量取决于 DAOS 模块所涵盖的功能。
  • dRPC 模块 ID 必须是系统范围内惟一的,而且列在一个中心头文件 `src/include/daos/drpc_modules.h 中。

dRPC 服务器使用函数 drpc_hdlr_process_msg 来处理传入的消息。此函数检查传入消息的模块 ID,搜索处理程序。

  • 若是找处处理程序,则执行该处理程序,并返回 Drpc_Response
  • 若是找不到,它将生成本身的 Drpc_Response,指示模块 ID 未注册。

相关信息

GitHub: https://github.com/storagezhang

Emai: debugzhang@163.com

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

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

本文翻译自 https://github.com/daos-stack/daos/blob/master/src/control/README.md

相关文章
相关标签/搜索