RadosGW的Sync Module浅析

本文深入剖析了RadosGW的SyncModule工作原理,详细介绍了模块的载入、初始化及数据操作过程。SyncModule作为RadosGW多站点同步机制的核心,通过定制化实现,能够针对不同场景提供灵活的数据同步策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RadosGW的Sync Module浅析

参考资料

  1. Ceph RGW远程同步(multisite)机制研究
  2. Ceph RGW multisite代码实现
  3. Realm和Period
  4. Ceph v12.2.12
  5. RadosGW的Coroutine浅析

Sync Module的载入

如下两个调用栈,在RadosGW启动时,根据Zone中的tier_type选择Sync Module,放入RGWRados中,然后在数据同步线程从RGWRados中取得该Sync Module

main() // rgw_main.cc
  RGWStoreManager::get_storage()
    RGWStoreManager::init_storage_provider
      RGWRados::initialize()
        RGWRados::init_rados()
          sync_modules_manager = new RGWSyncModulesManager()
          rgw_register_sync_modules(sync_modules_manager)
            RGWSyncModulesManager::register_module()
              // rgw: RGWDefaultSyncModule
              // log: RGWLogSyncModule
              // elasticsearch: RGWElasticSyncModule
        RGWRados::init_complete()
          RGWSyncModulesManager::create_instance(cct,
                                                 zone_public_config.tier_type,
                                                 zone_params.tier_config,
                                                 &sync_module)
            // zone_public_config.tier_type ==> name
            RGWSyncModulesManager::get_module(name, &module)
            // Assuming name=="elasticsearch"
            RGWElasticSyncModule::create_instance()
              instance->reset(new RGWElasticSyncModuleInstance(cct, config))

RGWDataSyncProcessorThread::process()
  RGWDataSyncStatusManager::init()
    sync_module = RGWRados::get_sync_module()

Sync Module的初始化

如下的调用栈所示,每次启动数据同步协程,都会调用Sync Module中的init()方法进行一些简单的配置载入;只有在StateBuildingFullSyncMaps阶段,才会调用init_sync()方法进行更费时的的初始化操作。

RGWDataSyncProcessorThread::process()
  RGWDataSyncStatusManager::run()
    RGWRemoteDataLog::run_sync()
      RGWDataSyncControlCR
        RGWDataSyncCR
          // Assuming RGWElasticDataSyncModule is used
          data_sync_module = RGWElasticSyncModuleInstance::get_data_handler()
          RGWElasticDataSyncModule::init()
            ElasticConfig::init_instance()
              // index_path
          if StateBuildingFullSyncMaps
            RGWElasticDataSyncModule::init_sync()
              RGWElasticInitConfigCBCR

Sync Module的数据操作

RadosGW的multisite本质上就是根据源站Bucket Index和Bucket Index Log上的一条条记录,在目标站采取对应的操作。从下面的代码节选看到,一个Sync Module需要实现sync_object、remove_object和create_delete_marker三中方法以应对所有的情况,以实现不同的定制化的行为。

RGWBucketSyncSingleEntryCR
  if (XXXX)
  else if (op == CLS_RGW_OP_ADD || op == CLS_RGW_OP_LINK_OLH) 
    // 源站上传删除了一个对象,或修改了多版本对象的头部
    data_sync_module->sync_object(sync_env,
                                  *bucket_info,
                                  key,
                                  versioned_epoch,
                                  &zones_trace)
  else if (op == CLS_RGW_OP_DEL || op == CLS_RGW_OP_UNLINK_INSTANCE)
    // 源站删除了一个对象,或者删除了多版本对象的一个版本
    data_sync_module->remove_object(sync_env,
                                    *bucket_info,
                                    key,
                                    timestamp,
                                    versioned,
                                    versioned_epoch,
                                    &zones_trace)
  else if (op == CLS_RGW_OP_LINK_OLH_DM)
    // 源站在多版本对象上创建了一个delete marker
    data_sync_module->create_delete_marker(sync_env,
                                           *bucket_info,
                                           key,
                                           timestamp,
                                           owner,
                                           versioned,
                                           versioned_epoch,
                                           &zones_trace)  

实现一个Sync Module的基本改动

  1. 继承RGWSyncModule,而实现一个定制的SyncModule类(如RGWElasticSyncModule)
    • 主要是用于注册
  2. 继承RGWSyncModuleInstance,而实现一个定制的SyncModuleInstance类(如RGWElasticSyncModuleInstance)
    • 主要是作为一个工厂类生成对应的DataSyncModule对象
  3. 继承RGWDataSyncModule,而实现一个定制的DataSyncModule类(如RGWElasticDataSyncModule)
    • 主要是实现定制化的数据操作sync_object、remove_object和create_delete_marker
  4. 在rgw_register_sync_modules中添加代码,注册新的SyncModule
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值