Ceph rgw中的元数据组织形式及存储结构分析

本来不想再写Ceph相关的文章了,最近在做ceph元数据优化研究及架构,整体思路是:将rados作为数据存储引擎,构建分布式元数据集群来管理元数据,如:将rgw或者fs相关的元数据从ceph的元数据池中抽取出来,转存到分布式元数据集群中,以此达到提升单集群处理能力的目的;要达到这个目的,有两个基础条件:1.对ceph中rgw或者fs的各CURD操作原理及IO路径非常熟悉,2.对ceph中元数据的组织及存储非常熟悉;然后才能在rgw或者mds的IO路径中进行数据及元数据的分离操作,并以合适的格式将元数据转存到分布式元数据集群中。

这篇文章将着重描述rgw中user,bucket,bucket instance以及bucket index等元数据的组织形式及数据结构,一些概念及说明请参考官方资料Rados Gateway Data Layout

对官方资料的一些补充:

  1. 存储池Pools:在新版本中,还有:
    1.1){zone}.rgw.log :用来存储gc,lc,reshard等的log信息
    1.2){zone}.rgw.otp:存储one-time password秘钥,开启MFA(Multi-Factor Authentication)是使用
    1.3){zone}.rgw.non-ec:这个存储池之前就有,用来存储multipart相关的中间结果

下文的操作在最新的Nautilus版本环境下进行

元数据分析

user元数据

通过下面的命令可以查看某个用户的元信息,包括:id,name,key,quota等信息:

radosgw-admin metadata user get user:{user}

在逻辑上,user信息存储在{zone}.rgw.meta池的users:*命名空间中,如下:
1)users.uid:存储用户id及其bucket信息
2)users.keys:存储用户的access key信息,通过它可以找到用户id
3)users.email:存储用户的email信息
4)users.swfit:存储swfit子用户信息

其中用户的基本信息(id,key,email,subuser等)包含在结构RGWUserInfo中,用户的bucket信息包含在结构cls_user_bucket_entry中,还有其他结构也包含在cls_user_types.h文件中,详情可以参考源码,物理上,这些信息都存储在存储池映射的OSD磁盘上;下面是一个示例:

users.uid命名空间

1)包含user1和user1.buckets两个对象, 其中user1包含用户的基本信息,user1.buckets包含用户的bucket信息。
显示用户id及其bucket对象
2)user1对象本身包含了用户的基本信息,基本上与用户相关的描述信息都包含在里面,只有一个扩展属性,没有omap属性。
user1的id信息
3)user1.buckets本身不包含信息,信息包含在omap属性中,没有扩展属性;用户在list bucket的时候会用到这个信息。
user1的bucket信息

users.keys命名空间

1)包含了key到uid映射信息,可以通过access key找到uid。
key到id的映射

由于没有设置email和swift用户,所以users.email和users.swift空间没有记录相应的信息。

通过radosgw-admin user命令获取的所有信息都来至于上述的命名空间,各个命令的工作过程在这里就不相信分析了(掌握各操作的IO路径也是实现元数据分布式集群很重要的一部分,留待后面分析吧

bucket元数据

通过下面的命令可以查看某个用户的元信息,包含:name,key,marker等信息:

radosgw-admin metadata bucket get bucket:{bucket}

在逻辑上,bucket信息存储在{zone}.rgw.meta池的root命名空间中,其中{bucket} 记录了bucket与instance_id的对应关系,记录是的静态信息,对应于结构RGWBucketEntryPoint,.bucket.meta.{tenent}:{bucket}:{marker} 记录bucket的寻址方式,记录的是动态信息,对应于结构RGWBucketInfo,bucket的ACL,Policy信息存放在xattr属性中,物理上,这些信息都存储在存储池映射的OSD磁盘上;下面是一个示例:
1)包含bucket1和.bucket.meta.bucket1:475c3d39-2f37-4ffd-ab72-fecc7272339c.34580.1两个对象
bucket元数据
2)bucket1对象本身包含了用户的基本信息,基本上与用户相关的描述信息都包含在里面,只有一个扩展属性,没有omap属性。
bucket的静态元信息
3).bucket.meta.bucket1:475c3d39-2f37-4ffd-ab72-fecc7272339c.34580.1对象的扩展属性中包含acl,policy等信息,对象本身包含bucket的动态信息。
acl信息
instance信息

Bucket Index

通过下面的命令可以枚举bucket下的对象信息:

radosgw-admin bucket list --bucket={bucket}

在逻辑上,bucket index信息存储在{zone}.rgw.buckets.index池中,bucket index用于维护bucket下的对象信息,存储在一个或者多个对象的omap中 - key为对象的名字,value为结构rgw_bucket_dir_entry 。bucket index对象的命名为:.dir.{bucket_id}.{shard_id}。下面是一个示例:
1)omap keys:bucket index对象中包含的object key列表。
bucket index信息
2)omap value: 某个object的信息,对应结构rgw_bucket_dir_entry
object 新型
3)omap header: 当前bucket index对象下的统计信息,对象数,总大小等。对应结构rgw_bucket_dir_header
object统计信息
通过本文,我们基本上弄清楚了user,bucket(instance),bucket index的数据结构及其存储方式,下篇介绍Ceph 中Object的组织方式。

猜你喜欢

转载自blog.csdn.net/lzw06061139/article/details/107246059