步骤
- 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
- full_sync()
- 从meta.full-sync.index.shardid获取列表数据
- 遍历每个数据, 每个marker开启RGWMetaSyncSingleEntryCR去远程拉取数据并同步到本地
- 更新状态为IncrementalSync , 更新next_step_marker 到 marker
- 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 存放的是元数据操作日志
网友评论