解决关系型数据库的数据同步难题

Overview

关系型数据库,以OLTP(Online Transaction Process)形式在存储和实体逻辑关联领域带来的价值毋庸置疑,然而在搜索,缓存,数据分析等场景却并不见长。

关系型数据库作为企业重要的数据源,为了丰富数据的应用场景,由此产生了数据同步的需求。

下文以搜索场景的数据同步为例说明

Solutions

1、同步双写

以搜索系统建设的场景为例,业务侧应用中触发的dml事件,同时应用于rdb和Search,将dml的事件上下文以同步的形式分发到需要扩展的目标数据源,以满足Search的数据要求。

问题:

1)能力复用:数据同步的能力复用性不够。

2)耦合性:业务的侵入性较大,开发阶段和运行时,对应用侧都有额外的开销。

3)一致性:双写成功率的保证,需要额外的工作去实现。

2、批量更新

通过可调度的批量任务,拉取并加工数据,推送到指定的异构系统(Search),

以满足对数据需要。

问题:

1)同步时延:同步延时受scheduled job的周期影响,需要根据场景定制。

2)耦合:同步任务的开发质量影响rdb的资源。

3)可复用的能力不够,不同场景需要多次介入;比如:同步的目标数据源是Cache、Queue、Hive。

Syner

我们的方案,整体采用事件驱动模式,设计如下:

binlog-parser:通过同步binlog-parser(databus,canal)模拟rdb从库解析binlog,实时感知dml操作的变化,将rdb的binlog当成是事件源,解决同步延时的问题。

Queue:事件驱动模式中,很重要的一部分是事件存储,我们通过MQ来做的实现。存储基于数据库表的维度来做Queue的切分,以保证表级别的事件顺序。

Syner:核心能力是将具体的事件映射到N个目标异构系统(Search,Cache…)。简单的逻辑映射如下,左侧表示事件的来源,其本质是rdb表的行的变更(binlog基于row模式解析),右侧表示目标系统(异构系统的数据建模考虑,留待其他文章讨论)。

Syner的工作过程:

1)获取存储层的事件信息

2)过滤异构系统不关注的事件信息

3)基于事件的数据模型,转换事件的数据模型(普遍情况下与目标异构系统数据模型存在差异,源事件需要一个转换的过程)以满足异构系统的模型要求

4)基于转换后的数据,下沉到异构系统

Syner的行为抽象:

1)连接存储层获取事件

2)事件分发到应用场景,并依据“规则”转换

3)下沉数据到异构系统

规则引擎模式是流程自动化

基于抽象,在步骤相对确定的情况下,通过规则引擎模式来表达整个过程,可以使得整体流程趋于自动化,达到降低开发和接入成本的目标。

确定以规则引擎的建设思路后,工作内容分为了以下两个大的部分:

定义规则

1)subscribe:表示当前规则“感兴趣”的事件源范围,细化到field级别

2)mapping:包含两个部分:

    a.事件源与目标异构系统之间的数据模型映射;

    b.事件的数据模型,普遍情况下与目标异构系统数据模型存在差异,需要有一个转换的过程,这个过程通过业务侧提供的api来实现;api的设计目标有两个:其一、将数据转换的过程从Syner脱离出来,业务侧自由定制,提高灵活性;其二、api的去向也是一种默认的sink方向(此处结合下文提到的“命令模式”理解)

3)sinker:表示需要数据需要被分发的目标异构系统。

实现引擎

相对上一步来说,解析规则是引擎的一个部分工作内容,另外还需考虑:

1)规则本身的生命周期的管理

2)可用性:错误隔离,资源分配(比如:线程数量,队列大小,网络IO timeout 等等)

3)吞吐量:数据一致性问题对吞吐量的影响

4)API动态集成:对转换API的动态集成与管理

5)同步过程管理:全量、增量、修复、校验...

6)监控、告警


整体架构如下

admin:负责规则生命周期的管理,同步过程的管理(未来可包括引擎本身的动态调优)

api-srv:负责提供指定的api接口实现,并注册到服务发现集群

如何保证数据一致性?

1)binlog本身的记录方式基于时间的全局序列事件;

2)Queue,存储以表维度的拆分binlog的全局序列,保证局部有序即可;用table hash mode 可能存在Queue数据量倾斜问题,未来可通过一致性hash等的思路来解决数据平衡的问题;

3)Syner作为事件驱动模型的dispatcher部分,为了提高吞吐量,使用的是异步多线程模型,未解决数据的不一致问题,引入趋势递增的序列号(原理借鉴snowflake)。趋势递增序列号为什么能解决这个问题?binlog本质上还是数据的snapshot,而且在到达Queue之前是严格的时间顺序,比如某一行数据x=a,第一次update之后 x=b,第二次update之后x=c,第一次update事件标记序列号为1,第二次标记为2(趋势递增必定>=2),从数据的最终一致性来理解,编号2的事件才是数据的最终版本。因此事件在最终消费时,只消费编号>=上一次的事件即可解决多线程消费下的数据一致问题。基于这个思路,还可以优化事件容量,原理类似Redis的AOF重写,一段时间内多个事件可以聚合为一个最终事件。

针对高可用的工作内容

1)binlog-parser的集群多节点主备,主备节点自动切换;

2)Syner集群在规则引擎之间的相互隔离;

3)enrich api的异步使用(结合Queue)

4)enrich api的response的使用命令模式(SAVE、UPDATE、DELETE、NONE、ASYNC)编排sink行为

5)同步过程中各环节数据的修复能力(自动和手动形式结合)

命令模式

这是一个整体的tradeoff,Syner可在不关注invoke的结果的情况下,将目标数据源的操作行为全部交由api-srv自行处理,如下图的一种实现方案(实际并未采用

tradeoff

1)成本:中等规模团队首要发展,仍以业务迭代为主,且对于异构数据源API学习成本偏高,投入产出相对不高

2)质量:API的实现质量因人而异

3)安全:目标异构源的安全性(对一个中小型团队来说仍然需要不少工作内容)。

命令模式(指令)的划分

Syner统一实现对于目标异构源的操作(写操作无外乎增、删、改),invoke api的返回结构中包含两个部分:1)转换后的数据内容;2)将数据内容应用于目标数据源的操作指令。

SAVE、UPDTE、DELETE 理解为针对写的常规操作;

NONE:表示当前事件,无需执行任何后续的操作;

ASYNC:表示异步模式,收到当前请求后立即结束后续流程;

NONE与ASYNC的区别在于:NONE表示不存在任何后续的操作行为,ASYNC表示收到当下的请求返回,即可结束,但是会存在异步线程处理数据结果。

最终效果

通过管理端(admin)对规则的定义,Syner自动感知规则生命周期变化,并动态管理规则引擎无需重启。通过已经注册好的enriche api实现数据模型的转换。同时在admin中管理同步过程。

对于用户来说,整体过程的感知只有以下两个步骤:

1)开发enriche api

2)可视化的规则配置

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

推荐阅读更多精彩内容