数据库同步有哪些方式?☀️怎么保障目标和源数据一致性☀️

Posted 曲鸟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库同步有哪些方式?☀️怎么保障目标和源数据一致性☀️相关的知识,希望对你有一定的参考价值。

摘要

数据库同步有3大难题:
1是如何保障目标和源数据一致性;
2是异构数据库如何做数据类型转换,导致数据同步失败的原因常常是因为数据类型不一样;
3是在数据越实时越有价值的背景下,同步过程中能否做到实时同步。

一、几种主流的数据库同步方式

方式一:基于无侵入的日志模式(如Oracle redo、Mysql binlog)
基于日志的采集方式无需在源库端部署任务代理程序(Agent)及建任何表,对源数据库无侵入和影响压力;

方式二:基于时间戳
同步过程通过特定属性(如时间戳、自增序列)来识别新插入的数据,该方式实现最简单,但无法记录删除和更新,也不具备实时的能力;

方式三:基于触发器
基于数据库的触发器机制,当执行DML相关语句时,执行动作来捕获数据,该方式会降低系统能,因此大多数场景下,生产系统不允许添加触发器。

方式四:基于快照
基于快照的方式,可以通过比较源表和快照表来获得数据变化,但需要消耗大量存储空间和计算资源。

方式五:基于离线批处理
通过jdbc查询来批量获取数据,会进行数据表的大范围扫描和数据提取,会对数据库产生大量开销。

本文主要探讨无侵入的CDC模式,并以运用这种模式的数据库同步云工具 Tapdata Cloud 举例,你要问我为啥用它举例,原因只有一个:永久免费。

二、架构及工作原理

Tapdata Cloud包含两部分:

  1. Tapdata Cloud Manager,TCM是Tapdata Cloud的管理端,负责agent实例的安装,同步任务的配置、分发、任务状态监测。
  2. Tapdata agent,是Tapdata Cloud数据同步服务的执行实例,负责从TCM获取任务信息,通过流式技术从源系统获取数据、处理转换数据并发送到目标系统,并在任务执行过程中监测并上报任务状态至TCM。

(Tapdata Cloud 工作原理图)

有朋友可能会担心这个云平台会不会把我要同步的数据泄露出去?

从Tapdata Cloud 工作原理上可以看出:

  1. 同步实例节点单向连接管控端运行服务。 Tapdata agent实例节点对外不主动暴露网络信息,只会连接 TCM管理端服务,获取任务信息、上报状态信息。
  2. 用户部署的Tapdata agent实例节点和 TCM 通信链路采用 HTTPS 协议。
  3. 自建模式下,所有数据流转均发生在受用户管理的服务器和网络环境。
    可见,数据同步过程中数据泄露的问题大可不必担忧。

三、全量同步和实时增量同步机制

Tapdata Cloud 这款云同步工具支持全量同步和实时增量同步,实现的过程如下图所示:


四、源和目标

据 Tapdata Cloud 最新版本,目前支持了:

数据库版本作为源作为目标是否可用
mysql5.x,8.x支持支持
oracle9i, 10g, 11g, 12c支持支持
sqlsever2005, 2008, 2012, 2014, 2016, 2017支持支持
mongodb3.2, 3.4, 3.6, 4.0, 4.2支持支持
PostgreSQL9.x, 10.x,11.x,12.x,13.x支持支持
Elastic5.x, 6.x, 7.x暂不支持支持
达梦数据库7,8支持支持
Kafka2.3.x及以上暂不支持支持
Redis2.x, 3.x, 4.x暂不支持支持即将上线
DB29.7 LUW版本支持支持即将上线
SybaseSybase ASE 15.7 及以上支持支持即将上线
Gbase支持支持即将上线

五、举例:Oracle 数据实时同步到 Elasticsearch

一般需要做全文检索的时候,会将 Oracle 数据实时同步到 Elasticsearch。

第一步:配置 Oracle 连接

  1. 点击 Tapdata Cloud 操作后台左侧菜单栏的【连接管理】,然后点击右侧区域【连接列表】右上角的【创建连接】按钮,打开连接类型选择页面,然后选择Oracle

  1. 在打开的连接信息配置页面依次输入需要的配置信息

【连 接 名 称】:设置连接的名称,多个连接的名称不能重复
【数据库地址】:数据库 IP / Host
【端 口】:数据库端口
【数据库名称】:tapdata 数据库连接是以一个 db 为一个数据源。这里的 db 是指一个数据库实例中的 database,而不是一个 schema。
【账 号】:可以访问数据库的账号
【密 码】:数据库账号对应的密码
【时 间 时 区】:默认使用该数据库的时区;若指定时区,则使用指定后的时区设置

第二步:配置 Elasticsearch 连接

  1. 同第一步操作,点击左侧菜单栏的【连接管理】,然后点击右侧区域【连接列表】右上角的【创建连接】按钮,打开连接类型选择页面,然后选择Elasticsearch

  1. 在打开的连接信息配置页面依次输入需要的配置信息,配置完成后测试连接保存即可。

第三步:建立同步任务,以全量+增量同步举例
进入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 模式。
现在市面上已经陆续出现了一些数据同步工具,完全没有必要自己撸代码了,免费的用起来不香吗?
希望上文的实操图文,对你的数据库同步有帮助,有数据库相关的问题可以随时跟我交流!

以上是关于数据库同步有哪些方式?☀️怎么保障目标和源数据一致性☀️的主要内容,如果未能解决你的问题,请参考以下文章

canal同步中源端数据类型为tinyint的字段同步异常-目标端值变为1

canal同步中源端数据类型为tinyint的字段同步异常-目标端值变为1

数据一致性问题

Navicat 数据传输和数据同步的区别

fastcopy同步操作命令是不是有参数可以排除指定目录

java 数据同步 日志怎么记