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

模块接口

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

每个模块应指定:

  • 模块名
  • 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

DAOS 分布式异步对象存储|数据平面的更多相关文章

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

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

  2. DAOS 分布式异步对象存储|架构设计

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

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

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

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

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

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

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

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

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

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

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

  8. 微信小程序 路由跳转 异步请求 存储数据,微信登录接口

    1小程序路由跳转 wx.switchTab(Object object) 这里的tabBar是底下的导航栏指定的页面 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面 tabBar l ...

  9. jsp:session对象存储数据

    public void setAttribute(String key,Object obj).session对象可以调用该方法将参数object指定的对象obj添加到session对象中,并为添加的 ...

随机推荐

  1. react-parent-child-lifecycle-order

    react-parent-child-lifecycle-order react parent child lifecycle order live demo https://33qrr.csb.ap ...

  2. Flutter 删除AppBar的返回icon

    设置automaticallyImplyLeading: false即可,替换可以修改"leading"参数 ... appBar: AppBar( automaticallyIm ...

  3. Captain technology开发的新能源汽车强在哪里?

    在新能源汽车飞速发展的这些年,Captain technology 认识到,要改变有状况,就要不断创新,调整新能源汽车发展路线.新能源汽车本质永远是汽车, Captain technology是在改变 ...

  4. Win10安装VSCode并配置Python环境 完整版超详细简单【原创】

    我们分为三个步骤进行: 一.下载VSCode 二.配置Python环境 三.测试Python 一.下载VSCode 1.打开国内镜像vscode下载地址,即可自动下载:https://vscode.c ...

  5. 开启算法之路,还原题目,用debug调试搞懂每一道题

    文章简述 大家好,本篇是个人的第 3 篇文章. 承接第一篇文章<手写单链表基础之增,删,查!附赠一道链表题>,在第一篇文章中提过,在刷算法题之前先将基础知识过一遍,这样对后面的做算法题是很 ...

  6. 解决windwos系统80端口被暂用无法发布(NGINX、TOMCAT、IIS)

    原因: 一个操作系统有0-65535个端口,但是一个端口只能被一个应用程序使用.所以80端口只有一个,当开发发布时想用应用NGINX,TOMCAT,IIS发布时,如果有程序占用了,就无法使用了. 解决 ...

  7. 修改vs模板抬头\Common7\IDE\ItemTemplates\CSharp\Code\2052\Class

    //************************************************************************************************** ...

  8. synchronized语法

    synchronized( ){ } synchronized 关键字是加锁的意思,用它来修饰方法就表示给该方法加了锁,从而达到线程同步的效果;用它来修饰代码块就表示给该代码块加了锁,从而达到线程同步 ...

  9. Java Socket编程基础及深入讲解

    原文链接:https://www.cnblogs.com/yiwangzhibujian/p/7107785.html 原文写的特别好,非常详细,但是禁止转载,那我就不再复制粘贴了! socket实现 ...

  10. Tango with django 1.9 中文——2.准备工作

    在正式开始写代码之前,设置好开发环境是非常重要的.你要确保所有必须的组件都已安装好.本章将概述五个你需要了解的关键组件的设置和使用.清单如下: 使用命令行 Python Python包管理器pip和虚 ...