ceph rgw 双活数据同步

设计

  1. 线程模型是什么样的?

    答: 一个zone对应一个线程, 参考int RGWRados::init_complete() -> RGWDataSyncProcessorThread

  2. coroutine模型是什么样的?

    答: coroutine可以根据需要指定,无固定模式

  3. 数据结构是什么样的?

    答:

image.png
  1. 同步流程?

    答:参考下图

    image

  2. 类结构?

    答:

    image

  1. 流程说明?

    答:

    • 先从datalog.sync-status.sourcezone读取同步的状态,并从datalog.sync-status.shard.sourcezone.shardid读取每个shard同步的marker.

      • 如果是init, 则为后续的全量同步以及增量同步做准备:

        1) 存储增量日志当前的标记,方便全量同步之后可以在该位置进行增量同步,避免漏掉数据。

        2) 更改状态为 BuildingFullSyncMaps

      • 如果是BuildingFullSyncMaps, 则拉取所有的bucket以及bucket对应的shard数量,为每个bucket的shard生成一条数据,再根据hash放入data.full-sync.index.sourcezone.shardid(这里的shard数量和source_zone 的datalog), 设置状态为全量同步。

      • 如果是FullSync, 则从data.full-sync.index.sourcezone.shardid拉取bucket:instance, 根据bucket.sync-status.sourcezone.bucketname.shardid读取属性信息即是同步状态以及marker,根据不同状态进入init、full或者是inc sync进行同步

      • 如果是IncSync, 进行增量同步。

    • 这里的data_log.shardid和datalog.sync-status.shard.sourcezone.shardid以及data.full-sync.index.sourcezone.shardid都是一对一的关系,bucket:shardid的映射关系也是一致的, 当data.full-sync.index.sourcezone.shardid对应的shard全量同步结束之后即可开启该shard的增量同步,即转移到跟踪data_log.shardid和datalog.sync-status.shard.sourcezone.shardid。 也由此可见各个shard都是独立进行全量和增量同步,即有的shard可能还在全量同步,有的已经在进行增量同步。

  • 无论是元数据同步还是数据同步在全量的时候都需要把所有数据拉过来再做全量同步, 目的是给这些需要全量同步的数据分shard,一是方便分为多coroutine并发处理,一是要和增量同步的shard进行对齐, 因为映射关系一致,所以某shard全量同步完该shard即可进行独立的增量同步。

你可能感兴趣的:(ceph rgw 双活数据同步)