数据库同步有3大难题:
1是如何保障目标和源数据一致性;
2是异构数据库如何做数据类型转换,导致数据同步失败的原因常常是因为数据类型不一样;
3是在数据越实时越有价值的背景下,同步过程中能否做到实时同步。
方式一:基于无侵入的日志模式(如Oracle redo、Mysql binlog)
基于日志的采集方式无需在源库端部署任务代理程序(Agent)及建任何表,对源数据库无侵入和影响压力;
方式二:基于时间戳
同步过程通过特定属性(如时间戳、自增序列)来识别新插入的数据,该方式实现最简单,但无法记录删除和更新,也不具备实时的能力;
方式三:基于触发器
基于数据库的触发器机制,当执行DML相关语句时,执行动作来捕获数据,该方式会降低系统能,因此大多数场景下,生产系统不允许添加触发器。
方式四:基于快照
基于快照的方式,可以通过比较源表和快照表来获得数据变化,但需要消耗大量存储空间和计算资源。
方式五:基于离线批处理
通过jdbc查询来批量获取数据,会进行数据表的大范围扫描和数据提取,会对数据库产生大量开销。
本文主要探讨无侵入的CDC模式,并以运用这种模式的数据库同步云工具 Tapdata Cloud 举例,你要问我为啥用它举例,原因只有一个:永久免费。
Tapdata Cloud包含两部分:
(Tapdata Cloud 工作原理图)
有朋友可能会担心这个云平台会不会把我要同步的数据泄露出去?
从Tapdata Cloud 工作原理上可以看出:
Tapdata Cloud 这款云同步工具支持全量同步和实时增量同步,实现的过程如下图所示:
据 Tapdata Cloud 最新版本,目前支持了:
数据库
版本
作为源
作为目标
是否可用
mysql
5.x,8.x
支持
支持
是
oracle
9i, 10g, 11g, 12c
支持
支持
是
sqlsever
2005, 2008, 2012, 2014, 2016, 2017
支持
支持
是
mongodb
3.2, 3.4, 3.6, 4.0, 4.2
支持
支持
是
PostgreSQL
9.x, 10.x,11.x,12.x,13.x
支持
支持
是
Elastic
5.x, 6.x, 7.x
暂不支持
支持
是
达梦数据库
7,8
支持
支持
是
Kafka
2.3.x及以上
暂不支持
支持
是
Redis
2.x, 3.x, 4.x
暂不支持
支持
即将上线
DB2
9.7 LUW版本
支持
支持
即将上线
Sybase
Sybase ASE 15.7 及以上
支持
支持
即将上线
Gbase
支持
支持
即将上线
一般需要做全文检索的时候,会将 Oracle 数据实时同步到 Elasticsearch。
第一步:配置 Oracle 连接
【连 接 名 称】:设置连接的名称,多个连接的名称不能重复
【数据库地址】:数据库 IP / Host
【端 口】:数据库端口
【数据库名称】:tapdata 数据库连接是以一个 db 为一个数据源。这里的 db 是指一个数据库实例中的 database,而不是一个 schema。
【账 号】:可以访问数据库的账号
【密 码】:数据库账号对应的密码
【时 间 时 区】:默认使用该数据库的时区;若指定时区,则使用指定后的时区设置
第二步:配置 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 模式。
现在市面上已经陆续出现了一些数据同步工具,完全没有必要自己撸代码了,免费的用起来不香吗?
希望上文的实操图文,对你的数据库同步有帮助,有数据库相关的问题可以随时跟我交流!
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦