librados 简单介绍

本文阐述了Ceph客户端如何通过librados直接与OSD交互进行数据存储和读取的过程。客户端应用调用librados连接CephMonitor,获取Clustermap后,通过I/O上下文绑定pool,提供Object名字,计算PG和OSD位置,实现数据的读写操作,无需了解集群拓扑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个Ceph客户端,通过librados直接与OSD交互,来存储和取出数据。为了与OSD交互,客户端应用必须直接调用librados,连接一个Ceph Monitor。一旦连接好以后,librados会从Monitor处取回一个Clustermap。当客户端的应用想读或者取数据的时候,它会创建一个I/O上下文并且与一个pool绑定。通过这个I/O上下文,客户端将Object的名字提供给librados,然后librados会根据Object的名字和Cluster map计算出相应的PG和OSD的位置。然后客户端就可以读或者写数据。客户端的应用无需知道这个集群的拓扑结构。

出处:https://blog.youkuaiyun.com/u014236541/article/details/79959910?utm_source=copy 
 

### 关于 librados 源码的详细解析与代码结构分析 `librados` 是 Ceph 的核心组件之一,提供了操作 RADOS(Reliable Autonomic Distributed Object Store)对象存储的功能。它封装了底层通信逻辑,使得开发者能够方便地与 Ceph 集群进行交互。以下是对其源码结构和功能模块的深入解析。 #### 1. 基本架构概述 `librados` 提供了两套接口:C 接口和 C++ 接口[^3]。这两种接口分别定义在 `include/librados.h` 和 `include/librados.hpp` 中,而它们的具体实现在 `librados.cc` 文件中完成。这种设计允许不同编程语言背景的开发者灵活调用。 - **C 接口**:面向低级需求的应用程序,提供简单易用的操作函数。 - **C++ 接口**:更加高级抽象,支持异步 I/O、复杂事务处理等功能。 #### 2. 核心类及其职责划分 根据现有研究材料[^2],`librados` 的主要组成部分如下: ##### (1) RadosClient 类 作为客户端的核心部分,负责维护与集群之间的连接状态以及元数据信息。例如: - 初始化阶段建立 Monitor 和 OSD 节点间的联系; - 动态调整 PG 映射表以适应节点增减变化。 ##### (2) IoctxImpl 类 代表输入输出上下文环境,类似于传统文件描述符的概念。每个 ioctx 实例绑定到某个命名空间(pool),并通过一系列方法暴露给外部应用层使用。 ##### (3) AioCompletionImpl 类 用于管理异步请求生命周期的对象模型。当发起一项耗时较长的任务(比如大块数据上传下载)时,可通过此类跟踪进度直至最终完成通知回调机制触发。 ##### (4) OSDC(Object Storage Daemon Client) 向上游隐藏了复杂的协议细节,向下则对接真实的物理设备驱动器。内部还涉及到了分片策略(`Striper`)的设计理念,即将单个大数据集划分为多个较小单元分散存放在不同的位置上从而提升整体吞吐量表现[^2]。 #### 3. 数据读的转换过程 在实际运行期间,每当用户指定了一定范围内的字节流欲从中提取有用的信息或者向其中注入新的内容之前,都需要经历由高层语义表达形式转变为底层目标地址集合的过程。这一环节正是借助 `Striper::file_to_extents()` 函数来达成目的[^1]。具体而言,就是依据当前文件布局参数计算得出哪些具体的 object 成员应当被纳入考虑范畴之内,并记录下来形成所谓的 extent 列表以便后续逐一对齐访问动作得以顺利开展下去。 ```cpp // 示例伪代码展示 file_to_extents 工作原理 std::vector<Extent> extents; Striper::file_to_extents( cct, ino, // inode number of the file layout, // predefined striping configuration offset, // starting position within the logical space len, // total length to process truncate_size,// optional parameter indicating maximum size limit &extents // output container holding resulting mappings ); for(auto& ext : extents){ printf("Access [%lu,%lu]\n", ext.offset, ext.length); } ``` 以上片段清晰展现了如何利用条带化技术将连续区间分解成离散片段的形式加以表述出来,这对于理解分布式环境下高效检索模式具有重要意义。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值