荐 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。
对官方资料的一些补充:
- 存储池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信息。
2)user1对象本身包含了用户的基本信息,基本上与用户相关的描述信息都包含在里面,只有一个扩展属性,没有omap属性。
3)user1.buckets本身不包含信息,信息包含在omap属性中,没有扩展属性;用户在list bucket的时候会用到这个信息。
users.keys命名空间
1)包含了key到uid映射信息,可以通过access key找到uid。
由于没有设置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两个对象
2)bucket1对象本身包含了用户的基本信息,基本上与用户相关的描述信息都包含在里面,只有一个扩展属性,没有omap属性。
3).bucket.meta.bucket1:475c3d39-2f37-4ffd-ab72-fecc7272339c.34580.1对象的扩展属性中包含acl,policy等信息,对象本身包含bucket的动态信息。
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列表。
2)omap value: 某个object的信息,对应结构rgw_bucket_dir_entry
。
3)omap header: 当前bucket index对象下的统计信息,对象数,总大小等。对应结构rgw_bucket_dir_header
。
通过本文,我们基本上弄清楚了user,bucket(instance),bucket index的数据结构及其存储方式,下篇介绍Ceph 中Object的组织方式。
本文地址:https://blog.csdn.net/lzw06061139/article/details/107246059