常见的10种 CDC 组件和方案

2024-04-18 12:39:46 浏览数 (1)

一、CDC 实现机制

目前实现 CDC 的机制主要有两种,即:

1. 基于查询的 CDC
  • 每次通过查询去获取表中最新的数据
  • 数据一致性无法保证,查的过程中有可能数据已经发生了多次变更
  • 数据实时性无法保证
2. 基于日志的 CDC
  • 采用流处理的方式,能够实时监听数据的变化,比如 mysql 的 binlog 日志
  • 可以保证数据一致性,因为 binlog 文件包含了所有历史变更明细
  • 可以保证数据实时性,因为 binlog 的日志文件是可以流式消费的

下面,我们来对常见的几种 CDC 组件的原理以及优缺点进行说明。

二、基于查询的 CDC 方案

1. Sqoop

① 原理

Sqoop 是一个用于在 Hadoop 和关系型数据库之间进行数据传输的工具。它的原理是通过将关系型数据库中的数据转换为 Hadoop 支持的格式(如 Avro、Parquet 等),然后将数据导入到 Hadoop 集群中。同样地,Sqoop 也支持将 Hadoop 中的数据导出到关系型数据库中。其底层其实是将导入或导出命令翻译成 mapreduce 程序。

② 优点

  • 简化数据传输:Sqoop 提供了简单易用的命令行界面,可以轻松地将数据从关系型数据库导入到 Hadoop 中,或者将数据从 Hadoop 导出到关系型数据库中。
  • 高效传输性能:Sqoop 使用并行处理技术,可以同时从多个关系型数据库表中提取数据,并将其导入到 Hadoop 中,提高了数据传输的效率。
  • 数据完整性保证:Sqoop 支持将关系型数据库中的数据导入到 Hadoop 中,并保持数据的完整性和一致性。

③ 缺点

  • 错误率无法控制:由于 Sqoop 底层运行的是 MapReduce 任务,只能做批量数据同步,且支持一个完整的事务,任务成功则全部成功,任务失败则全部失败。
  • 数据类型转换限制:由于 Hadoop 和关系型数据库之间的数据类型差异,Sqoop 在进行数据传输时可能会遇到数据类型转换的限制,这可能导致一些数据丢失或格式错误。
  • 依赖关系:Sqoop 依赖于关系型数据库的 JDBC 驱动程序来连接和传输数据。因此,如果没有适当的驱动程序,或者驱动程序不兼容,就无法使用 Sqoop 进行数据传输。
  • 扩展性限制:Sqoop 在处理大规模数据传输时可能会遇到一些扩展性限制。由于其依赖于关系型数据库的连接和查询能力,当数据量非常大时,可能会影响性能和吞吐量。
2. Datax

① 原理

DataX 作为离线数据同步框架,采用 Framework plugin 架构构建。将数据源读取和写入抽象成为 Reader/Writer 插件。

  • Reader:数据采集模块,负责采集数据源的数据,将数据发送给 Framework
  • Writer:数据写入模块,负责不断向 Framework 取数据,并将数据写入到目的端
  • Framework:用于连接 reader 和 writer,并处理缓冲,流控,并发,数据转换等核心技术问题。

② 优点

  • 丰富的 reader 和 writer支持:DataX 支持多种数据源和数据目标,包括关系型数据库、Hadoop、Hive、HBase等。这使得它适用于各种不同的数据同步场景。
  • 高效的传输性能:DataX 使用分布式架构,可以同时处理多个任务,提高了数据同步的效率。
  • 灵活性:DataX 提供了丰富的配置选项,可以根据不同的需求进行灵活配置和扩展。

③ 缺点

  • 学习成本较高:DataX 需要用户具备一定的编程和配置能力,因此对于一些非技术人员来说,学习和使用成本较高。
  • 对网络带宽和计算资源的要求:DataX 在进行数据同步时需要大量的网络带宽和计算资源,如果网络带宽或计算资源不足,就可能会影响性能和吞吐量。
3. Kettle

① 原理

Kettle(也称为Pentaho Data Integration)是一款开源的 ETL 工具,用于将数据从各种来源提取、转换和加载到目标系统中。它的原理是通过使用一系列预定义的转换步骤,将数据从源系统中提取出来,经过一系列的转换和清洗操作后,将其加载到目标系统中。

② 优点

  • 易于使用:Kettle 提供了直观的可视化界面,用户可以通过简单的拖放操作来构建数据转换流程,而无需编写复杂的代码。
  • 高效性能:Kettle 使用高度优化的 ETL 引擎,可以快速处理大量数据,并提供了多种并行处理选项,以提高数据转换的效率。
  • 灵活性:Kettle 支持多种数据源和数据目标,包括关系型数据库、Hadoop、NoSQL数据库等,同时也提供了丰富的转换步骤和插件,可以根据不同的需求进行灵活配置和扩展。

③ 缺点

  • 学习成本较高:虽然 Kettle 提供了直观的可视化界面,但是对于一些非技术人员来说,学习和使用成本仍然较高。
  • 对计算资源的要求:Kettle 在进行数据转换时需要大量的计算资源,如果计算资源不足,就可能会影响性能和吞吐量。
  • 对数据质量的限制:Kettle虽然提供了一些数据清洗和转换步骤,但是对于一些较为复杂的数据清洗和转换操作,可能需要用户编写自定义代码来实现。

三、基于日志的 CDC 方案

1. Canal

① 原理

Canal 是一个开源的数据库数据同步工具,主要用于实时获取数据库的增量数据变更,并将这些变更传递给其他应用或系统。它的原理是通过解析数据库的 binlog 日志,捕获数据库的增删改操作,并将这些操作转化为可读的数据格式,比如 json,以便其他应用程序进行消费和处理。

② 优点

  • 实时性:Canal 可以实时地捕获数据库的增量数据变更,保证了数据同步的及时性。
  • 灵活性:Canal 支持配置多个数据库和表进行同步,可以根据需求进行灵活的配置和管理。
  • 可靠性:Canal 通过解析数据库的日志,确保了数据同步的准确性和一致性。
  • 高性能:Canal 使用高效的日志解析算法,可以处理大量的数据库操作,并保持较低的延迟。

③ 缺点

  • 学习成本较高:使用 Canal 需要一定的数据库和日志解析的知识,对于初次接触的用户来说,可能需要一定的学习和理解。
  • 配置复杂性:在处理复杂的数据库同步场景时,配置和管理 Canal 可能会变得复杂,需要仔细设计和调试。
  • 依赖性:Canal 需要依赖于数据库的日志服务,如 MySQL 的 binlog,这可能增加了部署和维护的复杂性。
  • 局限性:想要使用 canal,必须要对相关账号开启日志复制权限,这对于对数据控制比较严格的企业来说是比较难以实现的。
2. Maxwell

① 原理

Maxwell 的原理和 canal 差不多,都是通过监听数据库的 binlog 日志文件,然后转换成可读的格式,比如 json,来提供给其他程序进行消费和处理。不同的是 Maxwell 更轻量级,性能更高,支持更多的数据类型和配置方式,同时还提供了更加友好和灵活的API和命令行工具。

② 优点

  • 实时性:Maxwell能够实时地捕获数据库的增量数据变更,确保数据同步的及时性。
  • 支持多种数据类型:Maxwell 支持多种数据类型,包括 JSON、AVRO、CSV 等,可以根据需要自由选择。
  • API和命令行工具支持:Maxwell提供了友好的API和命令行工具,用户可以通过简单的命令就能方便地完成binlog解析和数据输出。
  • 可靠性:通过解析数据库的日志,Maxwell确保数据同步的准确性和一致性。
  • 高性能:Maxwell使用高效的日志解析算法,可以处理大量的数据库操作,并保持较低的延迟。

③ 缺点

  • 依赖 binlog:Maxwell 需要依赖 MySQL 的 binlog 进行数据解析,如果 MySQL 的 binlog 出现问题,Maxwell 也会受到影响。
  • MySQL 版本要求:Maxwell 只支持 MySQL 5.5 及以上版本,对于低版本的 MySQL 不支持。
  • 学习成本较高:使用 Maxwell 需要一定的数据库和日志解析知识,对于初次接触的用户来说,可能需要一定的学习和理解。
3. Debezium

① 原理

Debezium 是一个由 Red Hat 开源的、分布式的 CDC 工具,能够从多种数据库中捕获数据变更事件,并将其转换为可消费的消息格式。Debezium 支持 MySQL、PostgreSQL、Oracle、SQL Server 等多种数据库。Debezium 底层会启动一个 Connector 来监听指定的数据库,并监视其中的变更事件,然后将这些事件转换为 json 格式发送到 kafka 或其他介质供用户使用。

② 优点

  • 实时性:Debezium能够实时捕获数据库的变更事件,并将其转化为实时的数据流,确保数据同步的及时性。
  • 可靠性:通过连接到数据库的事务日志,Debezium能够确保数据变更的准确性和一致性。
  • 灵活性:Debezium 支持多种数据库,包括 MySQL、PostgreSQL、MongoDB 等,可以适应不同的数据库环境和需求。
  • 可扩展性:Debezium的架构设计支持水平扩展,可以处理大规模的数据变更。

③ 缺点

  • 配置复杂性:Debezium 的配置相对复杂,需要了解数据库的事务日志和相关配置参数。
  • 依赖性:Debezium 依赖于数据库的事务日志,需要确保数据库日志的可靠性和稳定性。
  • 性能影响:由于Debezium 需要实时监控数据库的变更日志,可能会对数据库的性能产生一定的影响。
4. Databus

① 原理

Databus 是 LinkedIn 开源的一款数据总线平台,用于实时数据的采集、传输和处理。Databus 启动一个 Agent 进程来监视指定的数据源,并捕获其中的数据变更事件。当数据库中的表发生增删改操作时,Agent 会将这些变更事件转换成 JSON 格式,并发送到 kafka 等消息队列中。

② 优点

  • 高可靠性:Databus采 用了多种机制保证数据的可靠性,包括数据检验、数据重传、数据压缩等,确保数据不会丢失或损坏。
  • 高扩展性:Databus 支持水平扩展,可以通过增加节点来提高处理能力,同时支持多种数据源和目标,方便用户进行定制化配置。
  • 高性能:Databus 采用了多种优化策略,包括数据压缩、内存缓存等,可以提高数据传输和处理的效率。
  • 灵活的配置方式:Databus 提供了多种配置方式,包括命令行参数、配置文件等,方便用户进行定制化配置。

③ 缺点

  • 对系统资源要求较高:Databus 需要占用一定的系统资源,包括CPU、内存和磁盘空间等,如果系统资源不足可能会影响其性能。
  • 学习成本较高:Databus 的使用需要一定的学习成本,包括系统架构、配置文件等,需要一定的时间和精力进行学习和掌握。
5. Apache SeaTunnel

① 原理

Apache SeaTunnel 是一个非常受欢迎的数据集成同步组件。其可以支持全量和增量,支持流批一体。SeaTunnel 的使用是非常简单的,零编写代码,只需要写一个配置文件脚本提交命令即可,同时也使用分布式的架构,可以依托于 Flink,Spark 以及自身的 Zeta 引擎的分布式完成一个任务在多个节点上运行。其内部也有类似 Flink checkpoint 的状态保存机制,用于故障恢复,sink 阶段的两阶段提交机制也可以做到 Excatly-once。

② 优点

  • 简单易用,灵活配置,无需开发
  • 模块化和插件化
  • 支持利用SQL做数据处理和聚合
  • 利用spark和flink分布式框架对于异构数据源的兼容,可以实现快速的异构数据源同步和接入
  • 高度抽象业务处理逻辑,减少代码的冗余和重复开发

③ 缺点

  • 数据清洗逻辑比较简单,无法支持复杂的数据清洗需求
  • Spark 和 flink 的版本适配问题需要自己解决
  • Spark作业虽然可以很快配置,但相关人员还需要懂一些参数的调优才能让作业效率更优
6. Chunjun

① 原理

纯钧(ChunJun,原名FlinkX),是一款稳定、易用、高效、批流一体的数据集成框架, 是在是袋鼠云内部广泛使用的基于 flink 的分布式离线数据同步框架,实现了多种异构数据源之间高效的数据迁移。不同的数据源头被抽象成不同的 Reader 插件,不同的数据目标被抽象成不同的 Writer 插件。

② 优点

  • 基于flink,实时性比较好
  • 分布式数据同步框架,性能比较高
7. Flink CDC

① 原理

将数据库的全量和增量数据一体化地同步到消息队列和数据仓库中;也可以用于实时数据集成,将数据库数据实时入湖入仓;无需像其他的 CDC 工具一样需要在服务器上进行部署,减少了维护成本,链路更少;完美套接 Flink 程序,CDC 获取到的数据流直接对接 Flink 进行数据加工处理,一套代码即可完成对数据的抽取转换和写出,既可以使用 flink 的 DataStream API 完成编码,也可以使用较为上层的 FlinkSQL API 进行操作。

  • 全量同步使用了 mysql dump
  • 增量同步是监听数据库的 binlog 日志来实现的

① 优点

  • 本身就是个jar包,无需部署
  • 原生支持 flink,可以使用 flink datastream,也可以使用 flink sql
  • 实时性也是比较好的

四、写在最后

总结一下,本文介绍了10种常见的 CDC 组件和方案,个人觉得还不错,如果还有其他好用的 CDC 组件,欢迎在评论区分享分享。

  • 基于查询的 CDC 方案主要有:Sqoop 、 Datax 和 Kettle;
  • 基于日志的 CDC 方案主要有:Canal、Maxwell、Debezium、Databus、Apache SeaTunnel、Chunjun 和 Flink CDC。

大家可以根据自己需求选择相应的 CDC 方案,由于篇幅限制,我只是简单的介绍了一下各自的原理以及优缺点,关于具体的使用方法和详细原理可以参考各自的官方网站。

0 人点赞