本来不想再写Ceph相关的文章了,最近在做ceph元数据优化研究及架构,整体思路是:将rados作为数据存储引擎,构建分布式元数据集群来管理元数据,如:将rgw或者fs相关的元数据从ceph的元数据池中抽取出来,转存到分布式元数据集群中,以此达到提升单集群处理能力的目的;要达到这个目的,有两个基础条件:1.对ceph中rgw或者fs的各CURD操作原理及IO路径非常熟悉,2.对ceph中元数据的组织及存储非常熟悉;然后才能在rgw或者mds的IO路径中进行数据及元数据的分离操作,并以合适的格式将元数据转存到分布式元数据集群中。
本篇是第二项基础条件中的第二篇,也是最后一篇:rgw启动过程中元数据的创建及初始化概述
下文的操作在最新的Nautilus版本环境下进行。
rgw启动元数据初始化
在上一篇文章中,我将rgw的架构在逻辑上分为两层,其中第二层:负责rgw数据对象的定义、处理以及对librados::rados
的封装,并将数据持久化到后端OSD中。在rgw程序启动过程中,其中一个工作是实例化RGWRados
对象并进行初始化,该对象作为最外层的wrapper,会生成多个RGWServiceInstance
服务例程来进行具体的初始化工作,其中RGWSI_Zone
负责rgw服务启动过程中元数据(如:realm,zonegroup,zone等)的初始化以及加载, 类图如下:
在RGWRados
对象初始化过程中,会创建RGWSI_Zone
对象并初始化,主要过程如下:
1)通过RGWRealm获取当前(默认的或者rgw_realm
参数指定)的realm信息:首先从.rgw.root
池的default.realm
或者realms_names.{realm_name}
对象中获取realm id,然后从realms.{realm_id}
对象中获取realm的信息
2)如果realm存在,通过RGWPeriod获取当前的period信息:从上述的RGWRealm中获取period id,然后从period.{period_id}.latest_epoch
对象中获取最新的epoch,最后从periods.{period_id}.{epoch}
对象中获取period的信息
3.1)如果realm存在,通过RGWZoneGroup从period中获取zonegroup的信息:从default.zonegroup.{realm_id}
或者zonegroups_names.{zonegroup_name}
对象中获取zonegroup id,然后从zonegroup_info.{zonegroup_id}
对象中获取zonegroup的信息, 通过RGWZoneParams获取zone信息:从zone_names.{zone_name}
或者default.zone.{realm_id}
对象中获取zone id,然后从zone_info.{zone_id}
对象中获取zone的信息
3.2) 如果realm不存在,通过RGWZoneGroup创建默认zonegroup:首先通过RGWZoneParams创建zone:先创建zone_info.{zone_id}
对象,然后创建zone_names.{zone_name}
对象,接着创建zoengroup:先创建zonegroup_info.{zonegroup_id}
,然后创建zonegroups_names.{zonegroup_name}对象
如果对类关系进行穿透,可以看到对realm,zonegroup等的操作,最终都是通过librados::Rados
实现,:
当然,初始化过程中包含多个RGWServiceInstance
示例对象,类图是这样的,有兴趣的读者可以自行分析:
本文,旨在简要梳理rgw服务启动过程中的元数据的初始化过程,为元数据分布式化改造提供些线索以及依据。通过上面的分析,我们已经清楚:上述元数据的IO操作都封装在RGWSI_SysObj
,RGWSI_SysObj_Core
, RGWSI_RADOS
中,这就是实现元数据分布式,我们主要修改的地方。
通过本篇以及前面的几篇文章,对于rgw中元数据的分布式改造,以及应该在rgw的那些地方进行修改,大家应该已经有了一个大概的蓝图。