聊聊daos高性能分布式存储

2023-10-11 19:20

本文主要是介绍聊聊daos高性能分布式存储,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介

  • 现在大部分应用的IO模型会增加元数据和不对齐的数据碎片比例越来越大,同时传统的存储软件引入的对齐约束和通过大量延迟导致针对这些类型的IO应用越来越差的性能。大容量持久化内存(SCM)和高速硬件结构两者结合的,为重新定义存储规范和高效支持现在的IO密集型应用提供最佳的机会

  • 基于SCM需要重新考虑完整的存储栈的设计,为了释放这些新硬件的性能,新的软件栈采用字节粒度无共享的接口,并且它能够支持大规模分布式存储。DAOS是基于SCMNVMe的全新的IO架构,通过fabric全局访问对象的地址空间,保证性能的前提下提供一致性、可用性、弹性分布式存储 服务。

传统并行文件系统限制

  • 常规的并行文件系统是建立在块设备之上,IO的提交是通过内核的块接口;它们通过IO调度器优化磁盘的seek操作、合并写等优化手段适配workload特性,然后发送大量数据流给磁盘驱动器来获得更高的带宽。但是随着新硬件3D-XPoint出现提供臂传统存储低几个数量级的低延迟,为机械盘设计的软件栈会成为这些新型存储很大的开销。

  • 大部分并行文件系统都会去提供RDMA的能力,比如从客户端的page cache把数据直接传输到服务端的buffer cache中,然后持久化 服务端的块存储上。由于在块设备IO和网络事件缺乏统一的poll的处理模型,IO的处理严重依赖中断RPC的多线程并发处理,因此在IO处理过程中上下文的切换无法重新发挥网络低延迟的优势。传统并行文件系统的软件栈中包括cache/distribute lock依旧可以在3D NAND/3D-XPoint存储设备上使用,并且能获得更高的性能。

Daos软件 架构

  • Daos(Distribute Asynchronous Object Storage)是基于非易失内存(NVM)构建的一个开源自定义对象存储.daos提供key-value存储接口和提供non-bloking I/O数据的多版本快照等功能。

  • Daos存储系统充分利用了下一代的NVM技术,比如SCM(Storage Class Memory)NVMe(NVM express).采用kernel bypass技术,端对端的运行在用户态,在执行IO操作期间不需要任何的系统调用。

图片

  • 如上图所示,Daos核心分为三个部分,它们分别是SCM和PMDKNVMe和SPDKlibfabric.SCM和PMDK是第一部分,daos使用SCM来存储所有的元数据,应用的key索引和延迟敏感的小IO.daos在启动时候调用系统调用初始化持久化内存,比如启用DAX文件系统功能后映射持久化内存文件到虚拟内存地址空间。当系统启动运行后,daos可以在用户态通过内存指令访问持久化内存设备。持久化内存设备非常快,但是容量低、成本高,因此用来存储元数据非常合适;针对分布式存储中的数据,daos采用了NVMe设备,通过SPDK技术达到kernel bypass目的,IO的提交都是异步方式提交到SPDK的用户态队列,在SPDK IO完成后,在持久化内存中为这些数据创建索引。libfabricdaos的最后一个部分,它主要负责高性能的网络,比如支持Omni-Path/IB等网络架构。libfabric是一个定义在用户态的库,同时给使用它的应用导出fabric通信服务,它提供基于消息的异步API包括数据传输、网络的poll 等功能。

  • daos基于新硬件和网络技术,运行在用户态的kernel bypass分布式存储,它目前支持SCMNVMe,不支持机械磁盘。

  • daos是一个基于C/S的模型,daos client是一个linrary可以整合到应用中,它和应用运行在同一个地址空间。daos server是一个多容错的daemon进程,它直接访问SCMNVMe,所有的metadata和小io存储在SCM中,大IO存储在NVMe中。daos server不依赖于pthread来处理并发的IO请求,而是采用用户级别的线程User Level Thead(ULT)来处理。

图片

Daos数据存储策略

  • daos存储导出对象的形式提供key0-value或者key-array的api形式提供给用户访问。为了避免扩展性问题和维护元数据(比如对象的layout用来描述对象数据的位置)的开销,daos中的对象是128bit来标识对象的唯一性,同时在128bit中也包含编码用来描述数据的分布和数据保护策略(是副本还是ec)等信息。daos根据存储池配置生成随机数生成对象的layout.这个优点像ceph的crush算法。

图片

  • daos server中的用于元数据存储的SCM直接和内存总线连接,用于数据存储的NVMe直接连接到PCIe.采用内存的 load/store指令来访问内存映射的SCM,然后使用SPDK API在用户态访问NVMe 。一旦SCM或者是NVMe出现硬件故障,会存在数据或者元数据的丢失,为了保证数据丢失,daos提供replication或者erasure coding方式来保护数据和恢复数据。当启用了数据保护的功能,daos object会被replicate或者chunked 为多个数据分片和数据校验分片,然后存储在不同的存储节点,一旦出现硬件故障或者节点故障,daos object出于降级模式但是依然可以访问,数据恢复是是从其他的副本或者校验数据进行恢复。

图片

  • replication提供比较高的数据冗余,daos采用了primary-slave协议进行写操作,primary replica负责接受请求进行写,然后primary replica转发请求给slave replica进行分布式事务的处理。primary-slave模型 不同于传统的副本模型。primary replica仅仅转发rpc到slave server.所有的副本节点请求都是通过RDMA方式,从对端的客户端的buffer中直接获取数据。daos采用了两阶段提交协议的变种协议,如果一个副本不能应用变更,则所有的副本则通知更新。如果server处理副本写出现节点失败,daos则会从事务中排除这个节点,然后通过算法选择一个不同正常节点作为替代节点,然后把之前的事务状态赋给这个正常节点。如果这时候失效的节点有恢复正常,它会根据数据恢复协议捕获到事务的状态,同时忽略本地的事务状态。daos中健康检查失效节点时间,它会报告到基于多节点的daos-serverraft的协议服务,server中的raft服务会扫描object id,计算每个对象的layout,然后找出所有受影响的obejcts;把这些受影响的objet id发送给算法算则的应急server.应急节点通过pull方式重其他副本重建这些受影响的数据。

  • Erasure Coding提供更加节省空间和提供空间利用率的数据保护策略。daos client是一个轻量级的库,整个到进程中,因此数据的EC编码是在客户端进行的,那么客户端进程所在节点会消耗更多的cpu资源。daos client计算数据的校验码,创建数据分片和数据校验块RDMA Destriptor,然后发送一个RPC请求给校验组的leader server来协调写操作,这种写操作和副本的写类似,参与ec写操作节点直接从客户端buffer中获取数据,daos ec也是采用二阶段提交协议保证数据在不同节点的原子写入。当写入数据不等于stripe_size,大部分存储系统会通过read/encode/write处理来保证数据分片和数据校验的一致性,这个操作代码非常大(放大问题导致),同时需要一个分布式锁来保证读写的一致性。但是在daos中,为了避免这种开销,采用了Multi-version data module,通过复制部分写数据到 parity server的方式,因此parity server容易通过副本数据计算parity 数据。当在读的过程中,有节点失效,daos会提供降级读,daos client会首先获取所有的数据的stripe信息来重建已经丢失的数据,采用两阶段提交协议,把事务传递给正常的sever节点,然后进行丢失数据的数据重建。

  • daos中有三种失效情况,第一种是服务崩溃,daos通过gossip-like协议SWIM处理;第二种是NVMe失效,daos使用SPDK来polling设备的状态来判断;第三种是存储介质的失败,daos会探测并且保存和验证校验码来保证。当server接受到写请求,server核实校验码或者存储校验码和数据。server端可以根据性能的需求开启或者关闭核实功能。当应用再次回来读数据,如果读数据是和之前写数据是对齐的,server直接返回数据和校验码;否则daos server核实涉及读操作的数据块的校验码,然后计算出读取数据的校验码,然后返回数据和校验码给客户端。如果daos客户端在读的过程中检查到校验码错误,它会开启降级读或者切换其他的副本读或者在客户端进行数据重建(ec模式)。客户端也会报告校验码错误给server。server会通过探测和校验收集所有校验码错误,然后进行vefifyscrubbing,也会报告给客户端。

Daos 数据模型

图片

图片

  • daos数据模型包含了两种不同的对象形式,一种是array objects允许应用呈现多维度的数组形式;另外一种是key/value来存储对象数据,这种方式提供kv的接口和multi-level的kv接口。不论是那种形式,数据对象都是有版本的,这允许应用可以轻松的回滚到之前的版本数据。每个object是属于一个域(daos container).每个container都有私有的对象地址空间,事务的处理在poll中的其他container也是相互独立的。

图片

  • daos支持posix语义的访问,posix并不是daos的存储模型的功能,而是在daos后端api构建的库,一个posix文件系统的命名空间是在daos container中.posix api是通过fuse驱动使用daos引擎api(libdaos)和daos文件系统api(libdfs)来访问数据。

这篇关于聊聊daos高性能分布式存储的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/190283

相关文章

Redis存储的列表分页和检索的实现方法

《Redis存储的列表分页和检索的实现方法》在Redis中,列表(List)是一种有序的数据结构,通常用于存储一系列元素,由于列表是有序的,可以通过索引来访问元素,因此可以很方便地实现分页和检索功能,... 目录一、Redis 列表的基本操作二、分页实现三、检索实现3.1 方法 1:客户端过滤3.2 方法

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

Redis分布式锁使用及说明

《Redis分布式锁使用及说明》本文总结了Redis和Zookeeper在高可用性和高一致性场景下的应用,并详细介绍了Redis的分布式锁实现方式,包括使用Lua脚本和续期机制,最后,提到了RedLo... 目录Redis分布式锁加锁方式怎么会解错锁?举个小案例吧解锁方式续期总结Redis分布式锁如果追求

使用JavaScript操作本地存储

《使用JavaScript操作本地存储》这篇文章主要为大家详细介绍了JavaScript中操作本地存储的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录本地存储:localStorage 和 sessionStorage基本使用方法1. localStorage

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k