ceph rgw启动过程中元数据的创建及初始化

本来不想再写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等)的初始化以及加载, 类图如下:
RGWSI_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实现,:
detail class level
当然,初始化过程中包含多个RGWServiceInstance示例对象,类图是这样的,有兴趣的读者可以自行分析:
RGWServiceInstance类图
本文,旨在简要梳理rgw服务启动过程中的元数据的初始化过程,为元数据分布式化改造提供些线索以及依据。通过上面的分析,我们已经清楚:上述元数据的IO操作都封装在RGWSI_SysObjRGWSI_SysObj_Core, RGWSI_RADOS中,这就是实现元数据分布式,我们主要修改的地方。

通过本篇以及前面的几篇文章,对于rgw中元数据的分布式改造,以及应该在rgw的那些地方进行修改,大家应该已经有了一个大概的蓝图。

猜你喜欢

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