rgw元数据同步流程

步骤

  • RGWMetaSyncProcessorThread, 最开始从这个线程开始
  • RGWMetaSyncStatusManager.run() thread 调用该接口开启元数据同步
  • RGWRemoteMetaLog.run_sync()
  • 获取master的信息,在结构体rgw_mdlog_info中,包含num_shards、period、realm_epoch
  • 获取本地同步状态rgw_meta_sync_status
  • 比较period和realm_epoch, 如果本地period为空或者本地的realm_epoch小于master的,则初始化同步状态为StateInit
  • 如果状态是StateInit,初始化同步信息,参考RGWInitSyncStatusCoroutine
  • 持久化rgw_meta_sync_info信息到本地
  • 根据period获取所有shard远程日志位置,主要是marker, 对应结构体为RGWMetadataLogInfo
  • 记录远程marker信息到rados: mdlog.sync-status.shard.x中,对应结构体为rgw_meta_sync_marker.next_step_marker, 在增量同步的时候使用该marker为起点
  • 进入StateBuildingFullSyncMaps状态
  • 全量获取元数据,参考:RGWFetchAllMetaCR
  • 获取锁 // 都是去获取rados对象mdlog.sync-status的锁,锁名为sync_lock
  • 去远程通过/admin/metadata请求获取sections
  • 遍历每个section,获取每个section下的数据,并按照shardid存入meta.full-sync.index.shardid中,参考RGWShardedOmapCRManager
  • 更新所有的shard的同步状态对应的marker的total_entries
  • 更新状态为StateSync
  • 获取period所在位置cursor
  • 运行RGWMetaSyncCR
  • 通过cursor,遍历每个period
  • 更新next
  • 根据period获取RGWMetadataLog
  • 遍历每个shard对应的rgw_meta_sync_marker
  • 如果next存在,获取period_marker,如果period_marker为空表示当前period没有元数据变更,并continue。// 间接说明period_marker存的是上个period最大的marker
  • 开启RGWMetaSyncShardControlCR, 进行该shard的全量以及增量同步,实际是通过RGWMetaSyncShardCR
    1. full_sync()
  • 从meta.full-sync.index.shardid获取列表数据
  • 遍历每个数据, 每个marker开启RGWMetaSyncSingleEntryCR去远程拉取数据并同步到本地
  • 更新状态为IncrementalSync , 更新next_step_marker 到 marker
    1. incremental_sync()
  • 对比period_marker(代表该period最大的marker)和远程的mdlog_marker(已经拉取远程的日志marker), 如果period_marker非空且period_marker<=mdlog_marker, 则退出增量同步
  • 1.如果已经同步到最新的远程marker,需要拉取远程的日志到本地
  • 2.通过对比marker,如果拉取到本地日志还有没有增量同步的进行增量同步
  • 3.不断循环,重复1和2的步骤,一直到该period的日志结束

结构体

  • mdlog.sync-status 存放的是总体的同步状态信息,对应结构体rgw_meta_sync_info
  • mdlog.sync-status.shard.shardid 存放的是每个shard的同步状态信息,对应结构体为rgw_meta_sync_marker
  • meta.full-sync.index.shardid 存放的是需要进行全量同步的任务列表,实际上是在omap中存在了string列表
  • meta.log.period.shardid 存放的是元数据操作日志

你可能感兴趣的:(rgw元数据同步流程)