RadosGW的Sync Module浅析
参考资料
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的基本改动
- 继承RGWSyncModule,而实现一个定制的SyncModule类(如RGWElasticSyncModule)
- 主要是用于注册
- 继承RGWSyncModuleInstance,而实现一个定制的SyncModuleInstance类(如RGWElasticSyncModuleInstance)
- 主要是作为一个工厂类生成对应的DataSyncModule对象
- 继承RGWDataSyncModule,而实现一个定制的DataSyncModule类(如RGWElasticDataSyncModule)
- 主要是实现定制化的数据操作sync_object、remove_object和create_delete_marker
- 在rgw_register_sync_modules中添加代码,注册新的SyncModule