首页 > 其他分享 >ceph如何进行数据的读写(1)

ceph如何进行数据的读写(1)

时间:2024-08-13 11:28:08浏览次数:12  
标签:name bl 读写 librados ceph 数据 osd op

版本

ceph版本为17.

ceph如何进行读写接口的实现

Ceph的客户端通过librados的接口进行集群的访问,这里的访问包括:
1)对集群的整体访问
2)对象的访问
两类接口,这套接口(API)包括C、C++和Python的实现,接口通过网络实现对Ceph集群的访问。在客户端层面,可以在自己的程序中调用该接口,从而集成Ceph集群的存储功能,或者在监控程序中实现对Ceph集群状态的监控。

初始化一个ObjectWriteOperation对象,并进行初始化,设置参数,然后进行写操作。

例子:在RGW中,客户端会初始化一个OBjectWriteOperation的对象,然后调用librados中的接口进行操作。

    ObjectWriteOperation op;
    op.create(false);
    op.setxattr(RGW_ATTR_ID_TAG, bl);
    op.mtime2(&mtime_ts);
    op.write_full(*meta.data);
    op.rmxattr(name.c_str());
    rgw_rados_operate(dpp, ref.pool.ioctx(), ref.obj.oid, &op, null_yield);
    ioctx.operate(oid, op, flags);

下面针对每个函数调用进行详细的描述

  1. Create:初始化op对象
    void librados::ObjectWriteOperation::create(bool exclusive),实际调用的是ObjectOperation::create

    //librados_cxx.cc
    void librados::ObjectWriteOperation::create(bool exclusive){
        ceph_assert(impl);
        ::ObjectOperation *o = &impl->o;
        o->create(exclusive);
    }
    //osdc/Object.h
    void create(bool excl) {
        OSDOp& o = add_op(CEPH_OSD_OP_CREATE);
        o.op.flags = (excl ? CEPH_OSD_OP_FLAG_EXCL : 0);
    }
    //ops是ObjectOperation中的一个属性,类型为small_vector<OSDOp, osdc_opvec_len>;
    OSDOp& add_op(int op) {
        ops.emplace_back();
        ops.back().op.op = op;
        out_bl.push_back(nullptr);
        ceph_assert(ops.size() == out_bl.size());
        out_handler.emplace_back();
        ceph_assert(ops.size() == out_handler.size());
        out_rval.push_back(nullptr);
        ceph_assert(ops.size() == out_rval.size());
        out_ec.push_back(nullptr);
        ceph_assert(ops.size() == out_ec.size());
        return ops.back();
    }
    
  2. setxattr和rmxattr
    二者类似,设置op对象的一些必要操作。

    //librados_cxx.cc
    void librados::ObjectWriteOperation::setxattr(const char *name, const bufferlist& v)
    {
    ceph_assert(impl);
    ::ObjectOperation *o = &impl->o;
    o->setxattr(name, v);
    }
    //osdc/Object.h
    void setxattr(const char *name, const ceph::buffer::list& bl) {
        add_xattr(CEPH_OSD_OP_SETXATTR, name, bl);
    }
    //ops是ObjectOperation中的一个属性,类型为small_vector<OSDOp, osdc_opvec_len>;
    void add_xattr(int op, const char *name, const ceph::buffer::list& data) {
        OSDOp& osd_op = add_op(op);
        osd_op.op.xattr.name_len = (name ? strlen(name) : 0);
        osd_op.op.xattr.value_len = data.length();
        if (name)
            osd_op.indata.append(name, osd_op.op.xattr.name_len);
        osd_op.indata.append(data);
    }
    
  3. write_full
    关键函数,进行对象的写操作。

    //librados_cxx.cc
    void librados::ObjectWriteOperation::write_full(const bufferlist& bl){
        ceph_assert(impl);
        ::ObjectOperation *o = &impl->o;
        bufferlist c = bl;
        o->write_full(c);
    }
    //osdc/Object.h
    void write_full(ceph::buffer::list& bl) {
        add_data(CEPH_OSD_OP_WRITEFULL, 0, bl.length(), bl);
    }
    void add_data(int op, uint64_t off, uint64_t len, ceph::buffer::list& bl) {
        OSDOp& osd_op = add_op(op);
        osd_op.op.extent.offset = off;
        osd_op.op.extent.length = len;
        osd_op.indata.claim_append(bl);
    }
    
  4. rgw_rados_operate
    当op初步处理完成后,即可进行operate操作。交由存储池的ioctx进行处理

    int rgw_rados_operate(const DoutPrefixProvider *dpp, librados::IoCtx& ioctx, const std::string& oid,
                        librados::ObjectWriteOperation *op, optional_yield y, int flags){
        if (y) {
            auto& context = y.get_io_context();
            auto& yield = y.get_yield_context();
            boost::system::error_code ec;
            librados::async_operate(context, ioctx, oid, op, flags, yield[ec]);
            return -ec.value();
        }
        if (is_asio_thread) {
            ldpp_dout(dpp, 20) << "WARNING: blocking librados call" << dendl;
        }
        return ioctx.operate(oid, op, flags);
    }
    int librados::IoCtx::operate(const std::string& oid, librados::ObjectWriteOperation *o, int flags) {
        object_t obj(oid);
        if (unlikely(!o->impl))
            return -EINVAL;
        return io_ctx_impl->operate(obj, &o->impl->o, (ceph::real_time *)o->impl->prt, translate_flags(flags));
    }
    //librados/IoctxImpl.cc
    //其中核心部分是objecter_op和objecter的op_submit函数.objecter是osdc的Object类的对象,后面的操作就涉及到osdc中的操作了。
    int librados::IoCtxImpl::operate(const object_t& oid, ::ObjectOperation *o,
                    ceph::real_time *pmtime, int flags)
    {
    ceph::real_time ut = (pmtime ? *pmtime :
        ceph::real_clock::now());
    
    /* can't write to a snapshot */
    if (snap_seq != CEPH_NOSNAP)
        return -EROFS;
    
    if (!o->size())
        return 0;
    
    ceph::mutex mylock = ceph::make_mutex("IoCtxImpl::operate::mylock");
    ceph::condition_variable cond;
    bool done;
    int r;
    version_t ver;
    
    Context *oncommit = new C_SafeCond(mylock, cond, &done, &r);
    
    int op = o->ops[0].op.op;
    ldout(client->cct, 10) << ceph_osd_op_name(op) << " oid=" << oid
                << " nspace=" << oloc.nspace << dendl;
    Objecter::Op *objecter_op = objecter->prepare_mutate_op(
        oid, oloc,
        *o, snapc, ut,
        flags | extra_op_flags,
        oncommit, &ver);
    objecter->op_submit(objecter_op);
    
    {
        std::unique_lock l{mylock};
        cond.wait(l, [&done] { return done;});
    }
    ldout(client->cct, 10) << "Objecter returned from "
        << ceph_osd_op_name(op) << " r=" << r << dendl;
    
    set_sync_op_version(ver);
    
    return r;
    }
    

总结

一个op经过初始化create,设置参数,setxattr,后面交给ioctx进行operate,submit给osdc。
下一篇,介绍osdc部分的处理。

标签:name,bl,读写,librados,ceph,数据,osd,op
From: https://www.cnblogs.com/whutao/p/18356510

相关文章

  • 图数据库在社交网络分析中的应用
    图数据库在社交网络分析中的应用随着互联网的飞速发展,社交网络已成为人们日常生活中不可或缺的一部分。这些平台不仅连接了数以亿计的用户,还生成了海量的、高度互连的数据。如何有效地处理和分析这些数据,以理解用户行为、优化用户体验、提升平台价值,成为了一个重要的研究课题......
  • KingbaseES RAC运维案例之---集群及数据库管理
    案例说明:KingbaseESRAC在部署完成后,进行日常的集群及数据库管理。适用版本:KingbaseESV008R006C008M030B0010操作系统版本:[root@node201KingbaseHA]#cat/etc/centos-releaseCentOSLinuxrelease7.9.2009(Core)集群架构:如下所示,node1和node2为集群节点:节点信息:......
  • 信号处理卡 数据收发卡设计方案:428-基于XC7Z100+ADRV9009的双收双发无线电射频板卡 5G
    数据收发卡设计方案:428-基于XC7Z100+ADRV9009的双收双发无线电射频板卡5G小基站无线图传基于XC7Z100+ADRV9009的双收双发无线电射频板卡一、板卡概述        基于XC7Z100+ADRV9009的双收双发无线电射频板卡是基于Xilinx ZYNQ FPGA和ADI的无线收发芯片ADRV90......
  • 基于Dango+微信小程序的广西东盟旅游资源信息管理系统+80003(免费领源码)可做计算机毕业
    django广西-东盟旅游资源信息管理系统小程序摘 要在社会快速发展和人们生活水平提高的影响下,旅游产业蓬勃发展,旅游形式也变得多样化,使旅游资源信息的管理变得比过去更加困难。依照这一现实为基础,设计一个快捷而又方便的基于小程序的旅游资源信息管理系统是一项十分重要并且......
  • 【YashanDB数据库】Yashandb表闪回业务表实践
    数据误删除DELETE操作闪回示例(HEAP表)基于闪回查询(建议):select*fromsales.branches1;BRANCH_NOBRANCH_NAMEAREA_NOADDRESSEMPLOYEE_COUNT------------------------------------------------------------------------------------------------------------------......
  • Keras图形数据增强
    在《跟着迪哥学Python数据分析与机器学习实战》这书中提到Keras图像数据增强函数ImageDataGenerator:查看官方API却发现不存在,因为现在Keras都推荐使用版本3了。但是预处理层还是保留了,此时可以使用如下一些层的函数:Resizing层,调整层。版本2对应的是https://keras.io/2.16......
  • 【YashanDB数据库】yasboot查询数据库状态时显示数据库状态为off
    【问题现象】yasbootclusterstatus-cyashandb显示数据库状态为off与数据库实际的状态不符,如下图【问题分类】yasboot、yasdb使用问题【关键字】yasboot,数据库运行状态为off【问题描述】yasboot工具显示的状态【问题原因分析】发现是备库启动数据库方式不标准,即使用noh......
  • MySQL——删除数据(三)使用关键字 TRUNCATE 删除表中数据
        在MySQL数据库中,还有一种方式可以用来删除表中所有的记录,这种方式需要用到一个关键字TRUNCATE,其语法格式如下:TEUNCATE[TABLE]表名        TRUNCATE的语法格式很简单,只需要通过“表名”指定要执行删除操作的表即可。下面通过一个案例来演示TRUN......
  • 【深度分析】关于SPN不正确导致SQL数据库连接失败
    连接SQLServer数据库时发生报错“Thetargetprincipalnameisincorrect.CannotgenerateSSPIcontext”,无法连接,可能是由于AD域中记录了错误的SPN,导致无法进行身份验证而连接失败。下文通过简述Kerberos认证过程、SPN的组成,引出由SPN错误引发报错的解决方法。Kerberos认证......
  • 计算机毕业设计Hadoop+Hive居民用电量分析 居民用电量可视化 电量爬虫 机器学习 深度
    《Hadoop居民用电量分析》开题报告一、研究背景与意义能源问题在全球范围内一直是热点议题,尤其是随着居民生活水平的提高和城市化进程的加快,居民用电量急剧增长,对电力系统的稳定运行和能源管理提出了更高要求。如何科学合理地管理和分析居民用电量数据,成为提升能源利用效率、......