Ceph RGW multisite代码实现

multisite代码中大量使用了Boost的协程,在了解协程的使用方法后,整体代码结构还是比较清晰的。

协程实现

rgw中的协程库使用的是boost库,boost库中corotuine实现原理是由基类保存函数当前执行位置,每次运行时根据switch判断要执行的位置,具体可参考boost coroutine 实现原理记录

一次同步操作是由多个RGWCoroutine实例完成,每个RGWCoroutine作为一个基础的op由一个RGWCoroutineStack管理,一个stack内会有多个op,但只有最新加入的op能获得执行机会,op执行完成后会被移除出stack队列,进而stack中下一个op获得执行机会。一个RGWCoroutineManager实例分层管理多个stack集合,最新层stack集合中的每个stack都有同等运行机会,一次RGWCoroutineManger::run()方法会新建一层stack集合,直到集合中的所有stack(即stack中的全部op)执行完毕后返回。一个op调用另一个op有两种方式:callspawncall方法在当前op隶属的stack上加入新的op,直到新op执行完后才会继续执行自己的代码;spawn方法会将新的op放到新建的stack中,新stack会被放到manager的当前层(最新层),从而两个op能并发执行(由于stack是顺序遍历的,所以两个op也是顺序执行的)。

每个coroutine op都要实现自己的operate()方法,manager在遍历stack list时会调用RGWCoroutine::operate(),一般情况下operate()方法结束时会调用set_cr_error()set_cr_done()表示op已经完成,但对于RGWMetaSyncShardCR等op,operate()返回时并没有设置完成标志,因此这个op会一直执行(重复被调用operate()方法),其parent也会一直处于waiting_for_child状态。

rgw中的协程设计

同步实现

multisite的功能是实现一个zone group内多个zone的数据同步。这里的数据被分成了两类:

  • meta data同步。包括bucket相关对象和user相关对象(user.uid namespace 下的uid信息和root namespace下的bucket以及bucket-instance信息),位于.rgw.meta pool中。元数据同步可以类比为手动在本地zone创建bucket和user。
  • data同步。即每个bucket下的对象。data数据同步可以类比为手动在本地上传/删除bucket下的对象。

启动rgw 实例时在RGWRados::initialize()中会启动相关的同步组件。对于meta data,每个rgw启动一个单独线程来执行同步,而对于data数据的同步,由于每个zone都需要向其他所有zone进行同步,因此会启动n-1个同步线程,每个线程负责本地到另外一个zone的同步。

三个zone时rgw同步线程的状态

meta data的同步

目的:rgw.metapool下的bucket对象,bucket-instance对象以及uid对象拷贝到本地,且为每个bucket创建shard对象。

辅助结构:
.rgw.log pool中的mdlog.sync-status对象存储本zone当前的元数据同步状态。
.rgw.log pool中的mdlog.sync-status.<shard>对象存储每个shard当前同步进度(用marker表示)。
.rgw.log pool中的meta.full-sync.index.<shard>对象用omap来存储从master zone的.rgw.meta pool拉取的数据(pool下的对象名, full-sync时使用)
.rgw.log pool中的meta.log.<period>.<shardid>对象用omap来存储元数据操作log,比如创建bucket时,master zone的对象上会增加一条log记录,slave zone从master zone来获取这些记录,从而得到需要从master拉取的数据的列表(bucket名字),然后对bucket元数据做同步。这种同步方式属于incremental-sync。

代码实现

metasync流程RGWRemoteMetaLog::run_sync()

data的同步

目的:将每个bucket下的对象拷贝到本地bucket下

辅助结构:
.rgw.log pool中的datalog.sync-status.<zone>对象存储本zone到目标zone当前的数据同步状态。
.rgw.log pool中的datalog.sync-status.<zone>.<shard>对象存储本zone到目标zone当前的数据同步进度。
.rgw.log pool中的data.full-sync.index.<zone>.<shard>对象的omap用来存储从目标zone的拉取的bucket-info信息
.rgw.log pool中的data_log.<shard>对象的omap中存放对象操作日志。当对bucket进行对象操作时,会在omap上新建一条"1_"+<timestamp> 开头的日志,表明这个bucket被修改过,增量同步时会根据这些日志判断出哪些bucket被更改过,进而再针对每个bucket进行同步。
.rgw.log pool中的bucket.sync-status.<src-zone>:<[tenant/][bucket-name:][bucket-id:][bucket-shard]>使用xattr存放对应bucket的同步状态
bucket shard对象omap中0x80+"0_"命名空间下的key记录了此bucket的对象操作日志,用于增量同步时使用。

代码实现:

data数据同步
一个bucket的同步过程

注意:
当zone之间的sync 网络不可用时,每个zone是可以本地操作上传和删除对象的。在网络恢复后,各个zone最后存在的版本将是modify-time最新的那次上传的版本。网络故障期间如果有个别zone执行了del操作,即使操作时间是最新的,此次del操作最终会被其他put操作覆盖掉。如果多个put操作的modify-time相同且文件内容不同,则按照short_zone_id大小比较(代码实现见obj_time_weight::operator<)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容