当前位置: 首页 > ai >正文

Debezium:一款基于CDC的开源数据同步工具

Debezium 是由 Red Hat 开源的一种基于变更数据捕获(CDC) 的分布式平台,专为实时捕获和传播数据库的变更事件而设计。Debezium 常见的使用场景包括:

  • 实时数据集成:将数据库变更同步到数据仓库或数据湖,支撑实时分析。
  • 维护缓存一致性:源头数据库变更时自动失效或者更新 Redis/Memcached 中的缓存条目。
  • 微服务解耦:在单体应用拆分场景中,避免多系统“双写”一致性问题,通过 CDC 触发下游业务逻辑(如更新搜索索引、发送通知等)。
  • 共享数据库:当多个应用共用同一个数据库的时候,一个应用提交的更改通常要被另一个应用感知到。Debezium 可以让每个应用直接监控数据库的更改,并且响应更改。
  • 命令查询职责分离:在命令查询职责分离(CQRS)架构模式中,Debezium 捕获数据更改并且持久化到全序流里,然后供那些需要异步更新只读视图的服务消费。

系统架构

Debezium 提供了三种部署架构:Apache Kafka Connect、独立服务器、嵌入式引擎。

Apache Kafka Connect

大多数情况下使用 Apache Kafka Connect 部署 Debezium,如上图所示。其中:

  • Debezium 作为源端连接器,将变更记录发送给 Kafka;
  • 目标连接器将记录从 Kafka 主题传播到其他系统。

例如,Debezium 提供 MySQL 或者 PostgreSQL 连接器分别用于捕获这两种数据库的变更。每个 Debezium 连接器都会建立一个对应的源端数据库连接:

  • MySQL 连接器使用客户端代码库来访问 binlog。
  • PostgreSQL 连接器从逻辑复制流读取。

Kafka Connect 作为独立的服务运行。

默认情况下,从一个数据库表中的更改被写入 Kafka 主题,主题名称与表名称对应。如果需要,可以通过配置 Debezium 的主题路由转换来调整目标主题名称。例如:

  • 将记录路由到名称与表名不同的主题;
  • 多个表的变更事件记录到一个主题中。

在 Apache Kafka 中保存事件记录后,Kafka Connect 生态中的不同连接器可以将记录传输到其他系统和数据库,例如 Elasticsearch、数据仓库和分析系统或者缓存中。

独立服务器

另外一种部署方式就是使用 Debezium 服务器,如下图所示:

用户可以配置 Debezium 服务器使用源端连接器捕获数据库变更,然后将其序列化成不同的格式(例如 JSON 或者 Apache Avro),然后将结果发送给各种消息平台,例如 Redis、Amazon Kinesis,、Google Cloud Pub/Sub 或者 Apache Pulsar。

嵌入式引擎

这种部署方式不需要依赖 Kafka Connect,而是直接将 Debezium 连接器作为一个代码库嵌入 Java 应用程序中,捕获数据变更,提供给应用程序使用,或者将数据流转给消息平台。

功能特性

Debezium 提供的主要功能如下:

  • 支持各种源端数据库,包括 MySQL、MariaDB、MongoDB、PostgreSQL、Oracle、SQL Server、Db2、Cassandra、Vitess、Spanner、Informix 等;
  • 可以捕获完整的数据变更,并且只捕获已提交的事务,避免中间状态或回滚操作,保证数据一致性。
  • 通过读取数据库事务日志而非轮询表,确保高性能和低侵入性,不影响源库性能。例如,对于 MySQL 或者 PostgreSQL,延迟在毫秒级;
  • 不需要对数据模型进行修改,例如增加 Last Updated 字段;
  • 支持数据删除操作的捕获;
  • 基于 Java 开发,资源占用低,支持分布式部署和高可用架构。通过 Kafka Connect 框架横向扩展,应对大数据量同步需求;
  • 支持模式、表、字段级别的过滤,可以指定捕获的包含列表或者排除列表;
  • 支持指定字段的数据脱敏,保护敏感信息;
  • 支持消息转换,包括路由、筛选、扁平化等;
  • 大多数连接器都可以通过 JMX 进行监控。

下载安装

Debezium 官方推荐使用 Docker 进行部署,并且给出了一个详细的安装步骤和示例,地址如下:

https://debezium.io/documentation/reference/3.1/tutorial.html

http://www.xdnf.cn/news/14931.html

相关文章:

  • 如何使用Pytest进行测试?
  • Ubuntu22.04 设置显示存在双屏却无法双屏显示
  • MS32C001-C单片机,32位ARM M0+内核,宽电压、低功耗、小封装。
  • 【图像处理基石】如何检测到画面中的ppt并对其进行增强?
  • 【问题思考总结】两个向量之和的二范数公式是什么?
  • Shell 脚本0基础教学(一)
  • 景观桥 涵洞 城门等遮挡物对汽车安全性的影响数学建模和计算方法,需要收集那些数据
  • Windows Subsystem for Linux (WSL):现代开发的终极跨平台方案
  • 专题一_双指针_有效三角形的个数
  • 【Linux | 网络】socket编程 - 使用TCP实现服务端向客户端提供简单的服务
  • 通过Tcl脚本命令:set_param labtools.auto_update_hardware 0
  • Spring Cloud服务注册与发现:架构设计与技术实践深度分析
  • VS Code侧边栏的“资源管理器找不到解决办法“、VScode重置视图位置/还原默认视图位置
  • Linux建立本地软件仓库
  • Spring Boot 扩展点深度解析:设计思想、实现细节与最佳实践
  • 【Oracle报错】[INS-13001] 环境不满足最低要求。
  • MySQL8.0基于GTID的组复制分布式集群的环境部署
  • Rust赋能美团云原生DevOps实践
  • uni-app uni-push 2.0推送图标不展示问题
  • 【HarmonyOS6】获取华为用户信息
  • 2025年人工智能、虚拟现实与交互设计国际学术会议
  • 客户端与服务端数据加密方案及实现
  • 1️⃣理解大语言模型
  • 深度学习——损失函数
  • 使用python 将多个docx文件合并为一个word
  • 电网的智能觉醒——人工智能重构能源生态的技术革命与公平悖论
  • vue3面试题(个人笔记)
  • 并发编程第一节
  • 首批 | 云轴科技ZStack加入施耐德电气技术本地化创新生态
  • Caffeine的tokenCache与Spring的CaffeineCacheManager缓存区别