摘要
数据库同步有3大难题:
1是如何保障目标和源数据一致性;
2是异构数据库如何做数据类型转换,导致数据同步失败的原因常常是因为数据类型不一样;
3是在数据越实时越有价值的背景下,同步过程中能否做到实时同步。
一、几种主流的数据库同步方式
方式一:基于无侵入的日志模式(如Oracle redo、Mysql binlog)
基于日志的采集方式无需在源库端部署任务代理程序(Agent)及建任何表,对源数据库无侵入和影响压力;
方式二:基于时间戳
同步过程通过特定属性(如时间戳、自增序列)来识别新插入的数据,该方式实现最简单,但无法记录删除和更新,也不具备实时的能力;
方式三:基于触发器
基于数据库的触发器机制,当执行DML相关语句时,执行动作来捕获数据,该方式会降低系统能,因此大多数场景下,生产系统不允许添加触发器。
方式四:基于快照
基于快照的方式,可以通过比较源表和快照表来获得数据变化,但需要消耗大量存储空间和计算资源。
方式五:基于离线批处理
通过jdbc查询来批量获取数据,会进行数据表的大范围扫描和数据提取,会对数据库产生大量开销。
本文主要探讨无侵入的CDC模式,并以运用这种模式的数据库同步云工具 Tapdata Cloud 举例,你要问我为啥用它举例,原因只有一个:永久免费。
二、架构及工作原理
Tapdata Cloud包含两部分:
Tapdata Cloud Manager,TCM是Tapdata Cloud的管理端,负责agent实例的安装,同步任务的配置、分发、任务状态监测。
Tapdata agent,是Tapdata Cloud数据同步服务的执行实例,负责从TCM获取任务信息,通过流式技术从源系统获取数据、处理转换数据并发送到目标系统,并在任务执行过程中监测并上报任务状态至TCM。
有朋友可能会担心这个云平台会不会把我要同步的数据泄露出去?
从Tapdata Cloud 工作原理上可以看出:
同步实例节点单向连接管控端运行服务。 Tapdata agent实例节点对外不主动暴露网络信息,只会连接 TCM管理端服务,获取任务信息、上报状态信息。
用户部署的Tapdata agent实例节点和 TCM 通信链路采用 HTTPS 协议。
自建模式下,所有数据流转均发生在受用户管理的服务器和网络环境。
可见,数据同步过程中数据泄露的问题大可不必担忧。
三、全量同步和实时增量同步机制
Tapdata Cloud 这款云同步工具支持全量同步和实时增量同步,实现的过程如下图所示:
四、源和目标
据 Tapdata Cloud 最新版本,目前支持了:
五、举例:Oracle 数据实时同步到 Elasticsearch
一般需要做全文检索的时候,会将 Oracle 数据实时同步到 Elasticsearch。
第一步:配置 Oracle 连接
点击 Tapdata Cloud 操作后台左侧菜单栏的【连接管理】,然后点击右侧区域【连接列表】右上角的【创建连接】按钮,打开连接类型选择页面,然后选择Oracle
在打开的连接信息配置页面依次输入需要的配置信息
【连 接 名 称】:设置连接的名称,多个连接的名称不能重复
【数据库地址】:数据库 IP / Host
【端 口】:数据库端口
【数据库名称】:tapdata 数据库连接是以一个 db 为一个数据源。这里的 db 是指一个数据库实例中的 database,而不是一个 schema。
【账 号】:可以访问数据库的账号
【密 码】:数据库账号对应的密码
【时 间 时 区】:默认使用该数据库的时区;若指定时区,则使用指定后的时区设置
第二步:配置 Elasticsearch 连接
同第一步操作,点击左侧菜单栏的【连接管理】,然后点击右侧区域【连接列表】右上角的【创建连接】按钮,打开连接类型选择页面,然后选择Elasticsearch
在打开的连接信息配置页面依次输入需要的配置信息,配置完成后测试连接保存即可。
第三步:建立同步任务,以全量+增量同步举例
进入Tapdata Cloud 操作后台任务管理页面,点击添加任务按钮进入任务设置流程
根据刚才建好的连接,选定源端与目标端。
根据数据需求,选择需要同步的库、表,如果你对表名有修改需要,可以通过页面中的表名批量修改功能对目标端的表名进行批量设置.
在以上选项设置完毕后,点击下方的全量+增量选项并点击确定按钮即可完成本次全量同步任务的配置,在点击确定后将自动返回任务管理页面,在任务管理页面中,点击右侧的启动按钮即可使Tapdata Agent 开始执行本次任务。在全量任务执行完毕后,Tapdata Agent 会自动进入增量同步状态。在该状态中,Tapdata Agent 会持续监听源端的数据变化(包括:写入、更新、删除),并实时的将这些数据变化写入目标端。
点击任务监控可以打开任务执行详情页面,可以查看任务执行的具体信息。
同理,其他数据库的同步操作也跟上面步骤一致,比如几个常用的场景是:
• 从业务数据库到缓存数据库的实时同步
• 不停机迁移数据库
• 将主业务中心的数据实时同步至次业务中心
• 构建只读实例
• 构建异地灾备中心
• 构建异地多活
六、目标和源数据一致性
很多人都担心同步的数据可能没法和源数据一致,Tapdata Cloud 提供了数据校验功能,包括快速count校验、表全字段值校验和关联字段值校验三种校验方式。
• 快速count:仅对源表和目标表的行数进行count校验,速度极快,但是不会展示差异的具体字段内容。
• 全表字段值校验:会对源表和目标表的全部字段进行逐行校验,能查出所有字段的差异,但是速度慢。
• 关联字段值校验:只对源表和目标表的关联字段的值进行比对校验,速度快于全表字段值校验模式。
校验操作步骤
进入数据校验菜单,点击新建校验任务创建数据校验。
【选择任务】:选择一个历史同步任务
【校验类型】:可选 快速count校验、表全字段值校验和关联字段值校验
【校验任务名】:默认与选择的同步任务名字一样
【校验频次】:设置您的校验的执行频次
【单次校验】:只执行一次校验
【重复校验】:设置校验任务重复执行,支持设置校验执行的起止时间和校验间隔
【错误数据保存条数】:当出现校验不一致的数据时,不一致数据保存的最大条数。该数值会影响到差异校验,当错误数据条数超出设置的保存条数时,将无法进行差异校验。
【校验条件】:添加需要进行校验的表。点击自动添加会自动将任务下的所有表全部添加进来。
快速count校验
创建快速count校验时只需要选择到要校验的表,无需设置关联条件。
表全字段值校验
除了要选择待校验表外,还需要针对每一个表设置索引字段。
在进行表全字段值校验时,还支持进行高级校验。通过高级校验可以添加JS校验逻辑,对源和目标的数据进行校验。
完整示例:以MongoDB查询示例
JavaScript
function validate(sourceRow){ // 第1步 var targetRow = target.executeQuery({database: "target",collection: "USER",filter: {USER_ID: sourceRow.USER_ID}}); // 第2步 if(sourceRow.USER_ID === targetRow[0].USER_ID){ // 第3步 return {result: 'passed',message: "",data: ""} }else{ return {result: 'failed',message: "记录不一致",data: targetRow} } }
关联字段值校验
创建关联字段值校验时,除了要选择待校验表外,还需要针对每一个表设置索引字段。
七、异构数据类型转换
在异构数据库之间做同步,类型转换是一大难题,也是导致数据同步失败的重要原因,Tapdata Cloud 类型映射功能,在系统推演的基础上,提供了人工调整的能力,这一点比其他数据同步工具都更方便使用。
八、总结
为了达到数据实时要求,并且不对源库造成干扰,首选 CDC 模式。
现在市面上已经陆续出现了一些数据同步工具,完全没有必要自己撸代码了,免费的用起来不香吗?
希望上文的实操图文,对你的数据库同步有帮助,有数据库相关的问题可以随时跟我交流!