ceph源码分析之读写操作流程(2)

本文深入探讨Ceph分布式存储系统的读写操作流程。在读操作中,客户端直接与主OSD交互,主OSD通过Filestore从底层文件系统读取数据。而写操作更为复杂,包括数据预处理、主OSD与从OSD间的同步、Journal的使用等。整个过程中涉及多线程、回调函数和消息队列的协调工作。

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

上一篇介绍了ceph存储在上两层的消息逻辑,这一篇主要介绍一下读写操作在底两层的流程。下图是上一篇消息流程的一个总结。


ceph中,读写操作由于分布式存储的原因,故走了不同流程。

对于读操作而言:

1.客户端直接计算出存储数据所属于的主osd,直接给主osd上发送消息。

2.osd收到消息后,可以调用Filestore直接读取处在底层文件系统中的主pg里面的内容然后返回给客户端。具体调用函数在ReplicatedPG::do_osd_ops中实现。


读操作代码流程如图:


如我们之前说的,当确定读操作为主osd的消息时(CEPH_MSG_OSD_OP类型),会调用到ReplicatePG::do_osd_op函数,该函数对类型做进一步判断,当发现为读类型(CEPH_OSD_OP_READ)时,会调用FileStore中的函数对磁盘上数据进行读。

int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
{
    ……
    switch (op.op) {
        ……
        case CEPH_OSD_OP_READ:
            ++ctx->num_read;
        {
            // read into a buffer
            bufferlist bl;
            int r = osd->store->read(coll, soid, op.extent.offset, op.extent.length, bl);
            // 调用FileStore::read从底层文件系统读取
            ……
        }
        case CEPH_OSD_OP_WRITE:
            ++ctx->num_write;
        {
            ……//写操作只是做准备工作,并不实际的写
        }
        ……
    }
}


FileStore::read函数是底层具体的实现,会通过调用系统函数如::open,::pread,::close等函数来完成具体的操作。

int FileStore::read(
  coll_t cid,
  const ghobject_t& oid,
  uint64_t offset,
  size_t len,
  bufferlist& bl,
  bool allow_eio)
{
    ……
    int r = lfn_open(cid, oid, false, &fd);
    ……
    got = safe_pread(**fd, bptr.c_str(), len, offset);
    //FileStore::safe_pread中调用了::pread
    ……
    lfn_close(fd);
    ……
}


Ceph是一个分布式存储系统,包括多个组件,其中包括Librbd块存储库。在Ceph中,Librbd提供了一种将RBD(块设备)映射到客户端的方法,并使客户端能够读写这些设备。在本文中,我们将分析Librbd块存储库的源代码以及RBD的读写过程。 1. Librbd源码分析 Librbd块存储库的源代码位于src/librbd目录下。其中,包括librbd.cc、ImageCtx.cc、ImageWatcher.cc、Journal.cc等多个源代码文件。这些源代码文件组成了Librbd块存储库的核心。 其中,librbd.cc是Librbd块存储库的主要源代码文件。在这个文件中,包括了Librbd的初始化、映射、卸载等方法。ImageCtx.cc则是Image上下文,用于管理Image的状态、锁定、映射等信息。ImageWatcher.cc用于监控Image的状态变化,Journal.cc则是Librbd的Journal日志管理。 2. RBD读写流程源码分析Ceph中,RBD由client和server两个部分组成。client在客户端上运行,提供了将RBD映射到客户端的方法。server在存储集群中运行,提供了RBD的存储和管理。 RBD的读写流程如下: 1)客户端向Ceph Monitor请求RBD映射信息,Monitor返回Image ID和Image特性; 2)客户端向Ceph OSD请求RBD数据块,OSD返回数据块内容; 3)客户端将数据写入或读取到本地块设备; 4)客户端向Ceph OSD写入或读取数据块,OSD返回操作结果; 5)客户端向Ceph Monitor请求解除RBD映射,Monitor返回解除结果。 在上述过程中,涉及到的源代码文件有:librbd.cc、ImageCtx.cc、ImageWatcher.cc、Journal.cc等。 总结 Librbd块存储库和RBD读写流程Ceph存储系统的核心组件之一,通过分析源代码可以更加深入地了解Ceph存储系统的实现原理。同时,对于开发者来说,也有助于在Ceph存储系统上构建更加高效、稳定的存储应用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值