ceph 自定义操作

Ceph学习——Librbd块存储库与RBD读写流程源码分析 Librbd 包含了rbd的相关操作,并发送给ImageRequestWQ类处理(队列),而后该类将其中的的请求发送给ImageRequest处理,ImageRequest将Image进行**分片(将一个 块 分解成 对象 进行处理,Ceph的底层本质还是对象存储)** 等操作后,将各个对象调用ObjectRequest类进行处理 ,每个ObjectRequest请求分别处理。 阅读详情

ceph 通过自定义操作的方式来提供丰富的业务逻辑, 例如radosgw的业务逻辑
首先先通过下面方法注册到OSD中

 72/* class registration api */
 73extern int cls_register(const char *name, cls_handle_t *handle);
 74extern int cls_unregister(cls_handle_t);
 75
 76-extern int cls_register_method(cls_handle_t hclass, const char *method, int flags,
 77                        cls_method_call_t class_call, cls_method_handle_t *handle);
 78extern int cls_unregister_method(cls_method_handle_t handle);
 79extern void cls_unregister_filter(cls_filter_handle_t handle);

...
137-extern int cls_register_cxx_method(cls_handle_t hclass, const char *method, int flags,
138                                   cls_method_cxx_call_t class_call, cls_method_handle_t *handle);

显然一个是用来注册c++ 方法的, 一个是注册c方法的
其中
hclass 是方法组
method 是方法名
flags 是这个方法会请求的锁类型
class_call 是定义的处理函数
handle 作为返回的句柄

客户端需要调用这些方法时
通过调用ObjectOperation::exec 输入方法组,方法名,参数

288  -class CEPH_RADOS_API ObjectOperation
 289  {
 290  public:
 291    ObjectOperation();
 292    virtual ~ObjectOperation();
 293
 294    size_t size();
 295    void set_op_flags(ObjectOperationFlags flags) __attribute__((deprecated));
 296    //flag mean ObjectOperationFlags
 297    void set_op_flags2(int flags);
 298
 299    void cmpxattr(const char *name, uint8_t op, const bufferlist& val);
 300    void cmpxattr(const char *name, uint8_t op, uint64_t v);
 301    void src_cmpxattr(const std::string& src_oid,
 302              const char *name, int op, const bufferlist& val);
 303    void src_cmpxattr(const std::string& src_oid,
 304              const char *name, int op, uint64_t v);
 305    void exec(const char *cls, const char *method, bufferlist& inbl);
 306    void exec(const char *cls, const char *method, bufferlist& inbl, bufferlist *obl, int *prval);
 307    void exec(const char *cls, const char *method, bufferlist& inbl, ObjectOperationCompletion *completion);

具体的实现为

 55-int cls_register_method(cls_handle_t hclass, const char *method,
 56                        int flags,
 57                        cls_method_call_t class_call, cls_method_handle_t *handle)
 58{
 59  if (!(flags & (CLS_METHOD_RD | CLS_METHOD_WR)))
 60    return -EINVAL;
 61  ClassHandler::ClassData *cls = (ClassHandler::ClassData *)hclass;
 62=>cls_method_handle_t hmethod =(cls_method_handle_t)cls->register_method(method, flags, class_call);
 63  if (handle)
 64    *handle = hmethod;
 65  return (hmethod != NULL);
 66}
...
 68-int cls_register_cxx_method(cls_handle_t hclass, const char *method,
 69                            int flags,
 70                            cls_method_cxx_call_t class_call, cls_method_handle_t *handle)
 71{
 72  ClassHandler::ClassData *cls = (ClassHandler::ClassData *)hclass;
 73  cls_method_handle_t hmethod = (cls_method_handle_t)cls->register_cxx_method(method, flags, class_call);
 74  if (handle)
 75    *handle = hmethod;
 76  return (hmethod != NULL);
 77}

osd 在线程中根据消息的类型通过名字取出处理函数,例如

 4099-int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
 4100{
 4101  int result = 0;
 4102  SnapSetContext *ssc = ctx->obc->ssc;
 4103  ObjectState& obs = ctx->new_obs;
 4104  object_info_t& oi = obs.oi;
 4105  const hobject_t& soid = oi.soid;
 4106
 4107  bool first_read = true;
 4108
 4109  PGBackend::PGTransaction* t = ctx->op_t.get();
 ...
 4407    case CEPH_OSD_OP_CALL:
 4408      {
 ...
 4430        ClassHandler::ClassMethod *method = cls->get_method(mname.c_str());
 ...
}

这样只需要注册相关的操作函数,和方法名字,在客户端通过ObjectOperation::exec 取调用即可
这里值得注意的还有一点就是注册方法时的flags这里有

 28#define CLS_METHOD_RD       0x1 /// method executes read operations
 29#define CLS_METHOD_WR       0x2 /// method executes write operations
 30#define CLS_METHOD_PUBLIC   0x4 /// unused
 31=>efine CLS_METHOD_PROMOTE  0x8 /// method cannot be proxied to base tier

有这几种 其中
CLS_METHOD_RD 代表读锁
CLS_METHOD_WR 代表写锁
在确定了操作对象后会调用下面函数来申请对象的锁, 这个锁用于处理对象操作的互斥性

 791=>-bool get_rw_locks(bool write_ordered, OpContext *ctx) {
 792    /* If snapset_obc, !obc->obs->exists and we will always take the
 793     * snapdir lock *before* the head lock.  Since all callers will do
 794     * this (read or write) if we get the first we will be guaranteed
 795     * to get the second.
 796     */
 797    if (write_ordered && ctx->op->may_read()) {
 798      ctx->lock_type = ObjectContext::RWState::RWEXCL;
 799    } else if (write_ordered) {
 800      ctx->lock_type = ObjectContext::RWState::RWWRITE;
 801    } else {
 802      assert(ctx->op->may_read());
 803      ctx->lock_type = ObjectContext::RWState::RWREAD;
 804    }
 ... 非快照的话 会在下面获取对应的锁
 817    if (ctx->lock_manager.get_lock_type(
 818          ctx->lock_type,
 819          ctx->obc->obs.oi.soid,
 820          ctx->obc,
 821          ctx->op)) {
 822      return true;

锁对象为
ObjectContext::RWState 实现了一种特殊的行为
可以多读, 可以多写但是读写互斥
当多读 多写时只会增加count 计数, 如果此时来了相异的请求类型时会在waiters 中加1,此时非贪婪的锁请求将不能获取锁

3525    -bool get_read_lock() {
3526      // don't starve anybody!
3527      if (!waiters.empty()) {
3528        return false;
3529      }
or
3557      if (!greedy) {
3558        // don't starve anybody!
3559        if (!waiters.empty() ||
3560            recovery_read_marker) {
3561          return false;
3562        }
3563      }

这样可以避免饥饿的现象,不过当大量读请求时 如果当中含有一个写请求时下一个读请求将要等待前面的读请求完成,在等待写请求完成才能获得对象锁
同时如果是请求读写类型的锁时是每次互斥的,我想对单一对象的大量此类操作会出现较长等待时间

以上就是关于ceph的自定义操作的基本流程, ceph 大多业务实现是在此基础上构建的 例如radosgw等

Ceph集群搭建部署及常规操作 文章目录一、环境准备1、主机名2、关闭防火墙、核心防护3、配置hosts4、创建免交互5、配置YUM源6、配置NTP时钟服务二、CEPH集群搭建三、CEPH扩容四、osd数据恢复1、模拟故障2、恢复osd到集群中五、ceph常规的维护命令1、创建mgr服务2、创建pool3、删除pool4、修改pool名字5、查看ceph命令6、配置ceph内部通信网段六、制作centos_ceph离线包 一、环... 阅读详情

相关推荐

Ceph集群搭建系列(一):Ceph 集群搭建

目录 摘要: 目录 一、准备机器 二、ceph节点安装 三、搭建集群 后续:Ceph集群搭建系列(二):Ceph 集群扩容 参考: 摘要: 本文介绍的Ceph 集群搭建是基于luminous版本(ceph -v: ceph version 12.2.11 (26dc3775efc7bb286a1d6d66faee0ba30ea23eee) luminous (stable)),c...

Yannick Jiang 的专栏 7487

ceph 对动态加载类的管理

ceph提供了一个ClassHandler来管理动态链接库 使用ClassHandler 之前必要要先注册 ClassHandler::ClassData *ClassHandler::register_class(const char *cname) { assert(mutex.is_locked()); #根据name得到要使用的class ClassData *cls = _g...

jason的笔记 1071

基于ceph-deploy部署Ceph 集群

基于ceph-deploy部署Ceph 集群

m0_71593537的博客 1912

【Ceph】Ceph Client

librados librados是RADOS对象存储系统访问的接口层,它提供了pool的创建、删除、对象的创建、删除、读写等基本操作接口 在最上层是RadosClient,它是librados的核心管理类,处理整个RADOS系统层面以及pool层面的管理。类IoctxImpl实现单个pool 层的对象读写等操作 OSDC模块实现了请求的封装和通过网络模块发送请求的逻辑,其核心类Objecter完成对象的地址计算、消息的发送等工作 librados主要接口: 1.集群句柄创建 ...

我的笔记本 1435

ceph 恢复卡在 deleting 状态的 rook-ceph crds

由于 Kubernetes 不允许恢复已删除的资源,因此以下命令可以修复 CR,甚至不必担心集群停机。例如,如果有多个 CephFilesystem 卡在删除状态,则可以恢复特定的文件系统: restore-deleted cephfilesystems filesystem-2。当 Rook CR 被删除时,Rook 运算符将响应删除事件,尝试清理集群资源。如果集群中仍有数据,Rook 将拒绝删除该 CR,以确保数据不丢失。如果集群中有多个已删除的资源,且未提及具体资源,则将恢复第一个资源。

weixin_40548182的博客 110

ROS2理论与实践_宇树机器人Go2开发指南(文字)

本文介绍了Unitree Go2机器人ROS2开发环境的安装与配置流程。主要内容包括:1)从GitHub克隆unitree_ros2仓库;2)安装ROS2 Foxy版本依赖项;3)编译特定版本的CycloneDDS(0.10.2);4)编译unitree_go和unitree_api功能包;5)网络配置,包括设置静态IP和修改环境变量脚本setup.sh以指定网络接口。文章还提供了本地回环测试的替代方案,并建议配置完成后重启电脑。整个流程涉及ROS2环境切换、网络适配和编译安装等多个技术环节。

Li_Dongyi的博客 4205

RGW层Op的下发执行

rgw层将Op都存储到struct ObjectOperation的成员ops中,并encode到bufferlist中,通过Message传递给osd层,osd层得到bufferlist,就可以decode出对应的操作,调用librados的接口或者位于动态库的自定义函数。

weixin_43977379的博客 974

JLINK/SWD/STLINK下载选项区别

摘要: 本文对比了JLINK/SWD/STLINK的6种下载模式:Normal(硬件复位)、Hot plug(无复位)、Under reset(持续复位后连接)、Software reset(软件复位)、Hardware reset(全复位)和Core reset(内核复位)。重点分析了各模式的操作逻辑、适用场景及注意事项,其中Under reset模式是解决SWD禁用/程序异常的首选方案。通过对比表归纳了复位范围、NRST操作等核心差异,并给出场景选择建议:排查连接问题优先选Under reset,常规调

亚洲程序员盟主得博客 395

Ceph中的消息通信——Messenger、Message和Connection详解

综合以上的分析可以发现,在消息传递的过程中,Messenger像是一个管理统筹的角色,负责相关模块的初始化和运行,Connection是真正负责发送,Message则是传递消息的格式,EventCenter则是负责调度,实现异步IO的关键。最后用一个函数调用栈,阐述一个来自radosgw层的操作如何传递到OSD层(以setxattr为例)。我们以complete multipart函数中的setxattr为例,将所有涉及的函数的调用关系呈现一遍。

weixin_43977379的博客 1340

手把手教你用VCS+Verdi在Linux下仿真蜂鸟E203 RISC-V核(附波形调试技巧)

本文详细介绍了在Linux环境下使用VCS和Verdi工具链对蜂鸟E203 RISC-V核进行仿真验证的完整流程。从环境配置、工程结构解析到VCS编译优化和Verdi波形分析技巧,提供了实战性强的调试方法和性能优化策略,帮助工程师高效完成数字IC验证工作。

weixin_42531163的博客 416

STM32F405实战:手把手教你实现永磁同步电机无感FOC控制(附完整工程文件)

本文详细介绍了基于STM32F405微控制器实现永磁同步电机无感FOC控制的完整实战方案。文章从硬件搭建、CubeMX配置入手,逐步讲解了FOC核心算法、SVPWM调制,并重点阐述了如何结合HFI高频方波注入与滑模观测器(SMO)实现全速域无感控制。内容涵盖算法原理、代码实现、参数整定及调试技巧,并附有完整工程文件,为开发者提供从理论到实践的全面指导。

sun99的博客 266

【Ceph】ceph luminous版本新增组件:ceph-mgr

ceph luminous版本中新增加了一个组件: Ceph Manager Daemon,简称ceph-mgr。 该组件的主要作用是分担和扩展monitor的部分功能,减轻monitor的负担,让更好地管理ceph存储系统。 mgr的实现与用途 ceph-mgr是由C/C++、python以及Cpython等共同编写完成的,mgr的实现使用了大量的Extending Python with C or C++的语法,不熟悉这块的可以先在python官网中科普一下。 由ceph-mgr的实现其实大概可以.

我的笔记本 1228

RK3568 MIPI屏幕启动异常:从uboot logo到黑屏的排查与修复

本文详细分析了RK3568平台MIPI屏幕在启动过程中,从uboot阶段正常显示logo到内核阶段黑屏的典型故障。通过硬件测量与软件调试,最终定位问题根源在于电源时序,并提供了在设备树中为屏幕供电的regulator节点添加`regulator-boot-on`属性的关键解决方案,有效解决了因内核启动早期电源管理导致的显示异常。

weixin_29161719的博客 541

使用Zabbix监控Ceph集群的三种方式

感谢社区专家Wanger供稿!Wanger | Zabbix开源社区活跃用户Zabbix运维工程师,熟悉Zabbix开源监控系统的架构。乐于分享Zabbix运维经验,个人公众号“运维开发故事”。擅长领域:Zabbix基础设施运维以及Zabbix图形化展示。Ceph作为一个开源的分布式存储平台,可以从软件层面正确提供所有的企业级存储特性,本文主要介绍使用Zabbix监控Ceph集群的三种方式。本文只是提供监控Ceph的思路或者方法,不涉及详细的配置。1.使用Agent2监控Ceph从Zabbix5.0开始,Z

wanger5354的博客 567

保姆级教程:用Verilog手把手实现一个MIPI CSI-2 D-PHY接收器(附PPI接口时序详解)

本文提供了一份详细的Verilog实现MIPI CSI-2 D-PHY接收器的教程,重点解析了PPI接口时序和deskew数据对齐技术。通过模块划分、时钟域处理、状态机设计和错误恢复机制等实战内容,帮助开发者掌握高速数据接收的核心技术,适用于嵌入式视觉系统开发。

weixin_30619101的博客 512

ADAS方案设计-CAN网络管理与休眠唤醒机制

文章摘要:本文介绍了车载控制系统的五种工作模式及其转换条件,包括睡眠模式、准备睡眠模式、就绪睡眠模式、正常工作模式和重复消息状态。系统唤醒条件包括接收到网络管理报文或电源ON档信号,休眠条件则需满足电源OFF档、功能完成等多重要求。针对下挂节点的网络管理报文发送规则,详细说明了不同状态下的报文发送策略,特别是在哨兵模式、OTA模式等特殊场景下的处理方式。系统在满足休眠条件后会立即停止发送下挂节点网络管理报文,确保电源管理的有效性。

xiandang8023的博客 325

Ceph-Ansible自定义模块开发:扩展你的自动化能力

Ceph-Ansible是部署和管理Ceph分布式存储系统的终极自动化解决方案。🚀 作为Ansible生态系统中最重要的存储自动化工具之一,它提供了丰富的自定义模块来简化Ceph集群的管理工作。本文将为你揭示如何通过自定义模块开发来扩展Ceph-Ansible的自动化能力,让你能够更好地适应特定业务需求。 ## 📦 Ceph-Ansible自定义模块架构解析 Ceph-Ansible的自定

gitblog_07941的博客 364

Android系统开发面试指南:系统Launcher岗位解析

本文针对上海礼聪Android系统开发岗位(侧重系统Launcher、充电/电池/USB底层开发)提供面试指南。内容涵盖应用开发(启动流程优化)、系统底层(充电状态机、USBOTG)、编程能力(线程安全LRU实现)、问题排查(ANR分析)及沟通协作等核心考点。通过5类典型问题及技术深度解析,帮助候选人系统准备,重点考察Framework源码理解、系统调试能力和工程思维。建议结合PowerManagerService等模块源码和systrace工具进行实践准备,同时注重技术表达与协作能力的展现。

郑伟强dev的专栏 933

ceph怎么搭建文件存储_Ceph RGW搭建ES同步模块

RGW搭建ES同步模块前言目前对象存储提供的检索服务十分有限,仅有prefix查询,对于海量小文件来说,丰富的检索能力对于应用来说是十分友好的,特别是在大数据时代,优势越益明显。通过ceph 自带的es同步模块,将对象属性通过X-Amz-Meta-xxx 或 tagging 打上对应标签,在对其进行模糊查询,准确查询,自定义标签查询,以满足上层应用的需求部署环境详情:ceph 版本:12.2.12...

weixin_42515380的博客 1666

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

php librados,ceph librados接口说明

rados_getxattr获取对象属性rados_getxattrs获取对象属性列表rados_getxattrs_next从获取的对象属性列表中读取值rados_getxattrs_end释放rados_getxattrs获取的指针rados_setxattr设置对象的自定义属性rados_rmxattr删除对象的自定义属性rados_stat返回对象的时间、大小rados_tmap_upda...

weixin_36011231的博客 224

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ceph自定义rgw元数据查询

可以利用rgw对ceph中的objectd的metadata进行个性化的筛选与查询 创建默认的realm radosgw-admin realm create --rgw-realm=default --default realm的作用:相当于是一块领土。 一个realm代表了全局唯一的命名空间,这个命名空间由一个或者多个zonegroup,zonegroup可以包含一个或多个zone,zone包含了桶,桶里包依次存放了对象 将默认的zonegroup关联至realm radosgw-admin z

weixin_42340926的博客 1176

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Ceph常用命令总结

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34387284的博客 431

Ceph相关操作

client.ticp] keyring 配置ceph.client.ticp.keyring , 此处也可以写[client.admin], 我这里测试调整了。引用上述 Secret 的名称 rook-csi-cephfs-ticp-secret 和命名空间 rook-ceph。以下操作主要针对Rook Ceph Object Gateway模块操作, 相对应的操作, 均可以在界面上体现。如果你需要将 Ceph 用户用于 Kubernetes,可以将用户的密钥作为 Secret 创建。

xincan的博客 1545

【Ceph】Ceph介绍、原理、架构

Ceph技术栈/学习图谱

我的笔记本 1万+

Spark操作Ceph

文章目录前言Ceph集群安装ceph部分组件介绍主机和每台机器安装的组件和启动的服务集群安装步骤1.机器环境准备2.安装ceph组件3.ceph的存储命令Spark操作cephceph-radosgw安装spark通过radosgw服务对ceph进行读写 前言 通过spark操作ceph(读/写操作),在操作之前,我是连ceph是什么都不知道的,因此这篇文章也是在我简单了解ceph后写的,可能有不足之处,请指教; spark是不能很好的和ceph对接的;虽然ceph提供的有api,但把数据读出来后,在转为r

L_Mr_ll的博客 2639
上一篇: Ceph修改OSD和Monitor的网络
下一篇: ceph集群reweight调整各osd权重使各osd pg数均衡
for_tech
博客等级 码龄11年 50粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值