Cephfs数据池数据对象命名规则解析

众所周知,cephfs的数据和元数据是分离的,处于不同的pool池里头,而无论是rgw、cephfs、rbd底层的数据池的存储都是基于RADOS(Reliable Autonomic Distributed Object Store),Ceph存储集群的基础,RADOS层的一切都是以对象的形式存储着的,无论上层是文件、对象还是块。

主要说说cephfs的文件在数据池中是如何分布的,下面以cephfs的内核客户端为例进行分析。

以下图文件为例,先找到这个文件的inode号1099511627776,转换为16进制为10000000000,从数据池中找到这个对象,对象的名称为文件的inode号.编号(数据位置/对象大小object_size(默认4M),从0开始编号)
image.png

Cephfs读数据转换osd请求

struct ceph_file_layout {
    /* file -> object mapping */
    u32 stripe_unit;   /* stripe unit, in bytes */
    u32 stripe_count;  /* over this many objects */
    u32 object_size;   /* until objects are this big */
    s64 pool_id;        /* rados pool id */
    struct ceph_string __rcu *pool_ns; /* rados pool namespace */
};

文件的layout的属性,位于每个文件的inode属性中,是用来计算文件实际对象分布的条件。

客户端(linux内核客户端)位于文件的扩展属性xattr当中,通过set_xattr流程(客户端入口函数__ceph_setxattr和服务端mds入口函数为Server::handle_client_setxattr)进行修改。

可以使用getxattr命令查看默认值,命令和回显如下:

getfattr -n ceph.file.layout ceph-debuginfo-Lakestor_v2.1.0.18-0.el7.x86_64.rpm

ceph.file.layout="stripe_unit=4194304 stripe_count=1 object_size=4194304 pool=cephfs-data”

读流程从linux内核客户端向osd服务端发起请求:
入口函数为
|__ceph_read_iter
|____ceph_get_caps(获取文件的cap,如果cap不满足条件就发送getattr的req向mds服务端去获取最新的inode元数据,服务端处理完成回请求时客户端使用handle_reply最终fill_inode,将最新的元数据信息填写到客户端inode缓存里)
|______ceph_direct_read_write(如果客户端dcache没有对应位置缓存,就向osd发请求获取)

|__ceph_direct_read_write:
|____ceph_osdc_new_request(calc_layout-|______ceph_calc_file_object_mapping[ceph_oid_printf(&req->r_base_oid, "%llx.%08llx", vino.ino, objnum);])
|________ceph_osdc_start_request
...

|__ceph_osdc_new_request:
|____calc_layout(layout, off, plen, &objnum, &objoff, &objlen):
|______ceph_calc_file_object_mapping
重要入参:1,inode中的layout结构,2,要写的偏移位置 off和3,要写的长度plen。
出参:1,要写的对象编号objnum,2,对象内的偏移objoff,。
|________ceph_oid_printf(&req->r_base_oid, "%llx.%08llx", vino.ino, objnum);(将inode号.对象编号拼接起来形成要写的对象名)

车水... manong...

0 声望
5 粉丝
0 条评论
推荐阅读
Cephfs的MDS侧元数据池和mdcache存储数据结构分析
查看名为vdb.1_1.dir(目录下有100万个文件)的目录的inode号为1099511627788,转换为16进制为1000000000C

barrychen3阅读 1.2k

开务数据库分布式存储的负载均衡
开务数据库是浪潮开源的 NewSQL 分布式数据库,拥有强一致、高可用的分布式架构。在高负载的情况下,分布式数据库能够将负载压力平衡到不同的物理机节点上,充分利用不同节点的资源。本文将介绍开务数据库在面对...

KaiwuDB阅读 1.3k

封面图
软硬件结合,分布式数据库 KaiwuDB 存储架构优化实践
KaiwuDB 是开放原子开源基金会旗下的首个分布式数据库项目,由浪潮大数据团队开源并捐赠。本文将介绍 KaiwuDB 的存储架构,以及 KaiwuDB 技术团队在其 KV 存储引擎基础上所做的优化实践。

KaiwuDB阅读 1.2k

封面图
【寻人启事】达坦科技持续招人ing
达坦科技(DatenLord)专注于打造新一代开源跨云存储平台。通过软硬件深度融合的方式打通云云壁垒,实现无限制跨云存储、跨云联通,建立海量异地、异构数据的统一存储访问机制,为云上应用提供高性能安全存储支持...

Datenlord阅读 1.1k

封面图
Elasticsearch查询及聚合类DSL语句宝典
随着使用es场景的增多,工作当中避免不了去使用es进行数据的存储,在数据存储到es当中以后就需要使用DSL语句进行数据的查询、聚合等操作,DSL对SE的意义就像SQL对MySQL一样,学会如何编写查询语句决定了后期是否...

京东云开发者1阅读 423

封面图
FreeBSD - ext2 文件系统磁盘块和 inode 的申请
磁盘块与文件 inode entry 的申请和释放的处理机制总体上是一致的,所以就放到一起进行分享。在之前的文章中介绍了ext2文件系统磁盘的的总体布局,为了方便说明,这里就假设磁盘只有一个块组。

Douyiya阅读 799

io_uring技术在分布式云原生数据库中的应用
异步I/O是计算机操作系统对输入输出的一种处理方式:发起I/O请求的线程不等待I/O操作完成,就继续执行随后的代码,I/O结果用其他方式通知发起I/O请求的程序。

KaiwuDB阅读 769

封面图

车水... manong...

0 声望
5 粉丝
宣传栏