debezium - Debezium Monitor 是一个项目的开源项目,然后为数据库低数据应用程序(CDC)(更改数据捕获提供了延迟的流式处理平台。一个行级别(行级别)的更改。只有已经提交的更改是可见的,所以你的应用每担心事务(事务)或被更改回滚(回滚)。

Created at: 2016-01-23 04:17:05
Language: Java
License: Apache-2.0

许可证 马文中心 用户聊天 开发者聊天 谷歌集团 堆栈溢出

版权 Debezium 作者。根据 Apache 许可证版本 2.0 进行许可。debezium-ddl-parser 模块中的 Antlr 语法在 MIT 许可证下获得许可。

英语|中文|日语|朝鲜语

德贝兹姆

Debezium是一个开源项目,为变更数据捕获(CDC)提供了一个低延迟的数据流平台。设置并配置 Debezium 以监视数据库,然后应用程序使用对数据库所做的每个行级别更改的事件。只有提交的更改才可见,因此应用程序不必担心事务或回滚的更改。Debezium 提供了所有变更事件的单一模型,因此你的应用程序不必担心每种数据库管理系统的复杂性。此外,由于 Debezium 将数据更改的历史记录记录在持久的复制日志中,因此你的应用程序可以随时停止和重新启动,并且它将能够使用在未运行时错过的所有事件,从而确保正确、完整地处理所有事件。

监控数据库并在数据更改时收到通知一直很复杂。关系数据库触发器可能很有用,但特定于每个数据库,并且通常仅限于更新同一数据库中的状态(不与外部进程通信)。一些数据库提供用于监视更改的 API 或框架,但没有标准,因此每个数据库的方法都不同,并且需要大量知识和专用代码。确保以相同的顺序查看和处理所有更改,同时将对数据库的影响降至最低,这仍然是非常具有挑战性的。

Debezium提供了为你完成这项工作的模块。一些模块是通用的,可以与多个数据库管理系统一起使用,但在功能和性能方面也受到更多限制。其他模块是为特定的数据库管理系统量身定制的,因此它们通常功能更强大,并且它们利用了系统的特定功能。

基本架构

Debezium 是一个变更数据捕获 (CDC) 平台,通过重用 Kafka 和 Kafka Connect 来实现其持久性、可靠性和容错质量。部署到 Kafka Connect 分布式、可扩展、容错服务的每个连接器都监视单个上游数据库服务器,捕获所有更改并将其记录在一个或多个 Kafka 主题(通常每个数据库表一个主题)中。Kafka 确保所有这些数据更改事件都被复制和完全排序,并允许许多客户端独立使用这些相同的数据更改事件,而对上游系统几乎没有影响。此外,客户端可以随时停止使用,并且当它们重新启动时,它们会从中断的位置恢复。每个客户端都可以确定它们是希望对所有数据更改事件进行一次传递还是至少传递一次,并且每个数据库/表的所有数据更改事件都以它们在上游数据库中发生的顺序传递。

不需要或不需要这种级别的容错、性能、可伸缩性和可靠性的应用程序可以使用 Debezium 的嵌入式连接器引擎直接在应用程序空间内运行连接器。他们仍然希望相同的数据更改事件,但更喜欢让连接器将它们直接发送到应用程序,而不是将它们保留在 Kafka 中。

常见使用案例

在很多场景中,Debezium可能非常有价值,但在这里我们只概述了其中一些更常见的情况。

缓存失效

一旦条目的记录发生更改或删除,就会自动使缓存中的条目失效。如果缓存在单独的进程(例如,Redis,Memcache,Infinispan等)中运行,则可以将简单的缓存失效逻辑放入单独的进程或服务中,从而简化主应用程序。在某些情况下,可以使逻辑更加复杂,并可以使用更改事件中的更新数据来更新受影响的缓存条目。

简化整体式应用

许多应用程序更新数据库,然后在提交更改后执行其他工作:更新搜索索引、更新缓存、发送通知、运行业务逻辑等。这通常称为“双写入”,因为应用程序正在写入单个事务之外的多个系统。不仅应用程序逻辑复杂且更难维护,如果应用程序在提交后但在执行部分/所有其他更新之前崩溃,双写入还存在丢失数据或使各种系统不一致的风险。使用变更数据捕获,当数据提交到原始数据库中时,可以在单独的线程或单独的进程/服务中执行这些其他活动。此方法对故障的容忍度更高,不会错过事件,扩展效果更好,并且更易于支持升级和操作。

共享数据库

当多个应用程序共享单个数据库时,一个应用程序了解另一个应用程序提交的更改通常并非易事。一种方法是使用消息总线,尽管非事务性消息总线存在上述“双写入”问题。但是,使用Debezium,这变得非常简单:每个应用程序都可以监视数据库并对更改做出 React 。

数据集成

数据通常存储在多个位置,特别是当它用于不同的目的并且形式略有不同时。保持多个系统同步可能具有挑战性,但简单的ETL类型解决方案可以通过Debezium和简单的事件处理逻辑快速实现。

断续器

命令查询责任分离 (CQRS) 体系结构模式使用一个数据模型进行更新,并使用一个或多个其他数据模型进行读取。当更改记录在更新端时,这些更改将被处理并用于更新各种读取表示形式。因此,CQRS 应用程序通常更复杂,特别是当它们需要确保可靠和完全有序的处理时。Debezium和CDC可以使这更加平易近人:写入记录为正常,但Debezium在持久,完全有序的流中捕获这些更改,这些流由异步更新只读视图的服务使用。写端表可以表示面向域的实体,或者当 CQRS 与事件溯源配对时,写端表是命令的仅追加事件日志。

建筑德贝兹姆

需要以下软件才能使用 Debezium 代码库并在本地构建它:

有关平台上的安装说明,请参阅上面的链接。你可以验证版本是否已安装并正在运行:

$ git --version
$ javac -version
$ mvn -version
$ docker --version

为什么选择 Docker?

许多开源软件项目使用Git,Java和Maven,但需要Docker并不常见。Debezium旨在与许多外部系统(例如各种数据库和服务)进行通信,我们的集成测试验证Debezium是否正确做到了这一点。但是,Debezium的构建系统不是期望你在本地安装了所有这些软件系统,而是使用Docker自动下载或创建必要的映像并为每个系统启动容器。然后,集成测试可以使用这些服务并验证 Debezium 的行为是否符合预期,当集成测试完成时,Debezium 的构建将自动停止它启动的任何容器。

Debezium还有一些不是用Java编写的模块,因此必须在目标操作系统上需要它们。Docker 允许我们的构建使用具有目标操作系统的映像和所有必要的开发工具来执行此操作。

使用 Docker 有几个优点:

  1. 你不必在本地计算机上安装、配置和运行每个外部服务的特定版本,也不必在本地网络上访问它们。即使你这样做了,Debezium的构建也不会使用它们。
  2. 我们可以测试外部服务的多个版本。每个模块都可以启动它需要的任何容器,因此不同的模块可以轻松使用不同版本的服务。
  3. 每个人都可以在本地运行完整的生成。你不必依赖在设置了所有必需服务的环境中运行生成的远程持续集成服务器。
  4. 所有版本都是一致的。当多个开发人员各自构建相同的代码库时,他们应该看到完全相同的结果 - 只要他们使用相同或等效的JDK,Maven和Docker版本。这是因为容器将在相同的操作系统上运行相同版本的服务。此外,所有测试都旨在连接到容器中运行的系统,因此没有人必须摆弄特定于其本地环境的连接属性或自定义配置。
  5. 无需清理服务,即使这些服务在本地修改和存储数据也是如此。Docker 映像是缓存的,因此重用它们来启动容器是快速且一致的。但是,Docker 容器永远不会被重用:它们总是以原始的初始状态启动,并在关闭时被丢弃。集成测试依赖于容器,因此会自动处理清理。

配置你的 Docker 环境

Docker Maven 插件将通过检查以下环境变量来解析 docker 主机:

export DOCKER_HOST=tcp://10.1.2.2:2376
export DOCKER_CERT_PATH=/path/to/cdk/.vagrant/machines/default/virtualbox/.docker
export DOCKER_TLS_VERIFY=1

如果使用 Docker Machine 或类似设备,则可以自动设置这些设置。

构建代码

首先通过克隆 Git 存储库来获取代码:

$ git clone https://github.com/debezium/debezium.git
$ cd debezium

然后使用 Maven 构建代码:

$ mvn clean verify

构建开始,并为不同的DBMS使用多个Docker容器。请注意,如果 Docker 未运行或未配置,则可能会收到一个神秘的错误 - 如果是这种情况,请始终验证 Docker 是否正在运行,也许可以通过 使用 来列出正在运行的容器。

docker ps

没有 Docker 在本地运行以进行构建?

你可以使用以下命令跳过集成测试和 docker 构建:

$ mvn clean verify -DskipITs

只构建工件,而不运行测试,CheckStyle等。

你可以使用“快速”构建配置文件跳过所有非必要的插件(测试,集成测试,CheckStyle,格式化程序,API兼容性检查等):

$ mvn clean verify -Dquick

这为仅生成输出工件提供了最快的方法,而无需运行任何与 QA 相关的 Maven 插件。这对于尽快生成连接器 JAR 和/或存档非常方便,例如,用于在 Kafka Connect 中进行手动测试。

使用 wal2json 或 pgoutput 逻辑解码插件运行 Postgres 连接器的测试

Postgres 连接器支持三个逻辑解码插件,用于将更改从数据库服务器流式传输到连接器:解码器bufs(默认值)、wal2json 和 pgoutput。要使用 wal2json 运行 PG 连接器的集成测试,请启用“wal2json-decoder”构建配置文件:

$ mvn clean install -pl :debezium-connector-postgres -Pwal2json-decoder

要使用 pgoutput 运行 PG 连接器的集成测试,请启用“pgoutput-decoder”和“postgres-10”构建配置文件:

$ mvn clean install -pl :debezium-connector-postgres -Ppgoutput-decoder,postgres-10

目前,一些测试在使用 wal2json 插件时未通过。查找对 中定义的类型的引用以查找这些测试。

io.debezium.connector.postgresql.DecoderDifferences

使用特定的 Apicurio 版本运行 Postgres 连接器的测试

要使用wal2json或pgoutput逻辑解码插件以及特定版本的Apicurio运行PG连接器的测试,可以将测试属性传递为:

$ mvn clean install -pl debezium-connector-postgres -Pwal2json-decoder 
      -Ddebezium.test.apicurio.version=1.3.1.Final

在没有该属性的情况下,将获取Apicurio的稳定版本。

针对外部数据库(例如 Amazon RDS)运行 Postgres 连接器的测试

请注意,如果要针对非 RDS 集群进行测试,则此测试需要是超级用户,并且不仅具有登录到 中的数据库的权限。它还要求包在目标服务器上可用,以便某些测试通过。

<your user>
replication
all
pg_hba.conf
postgis

$ mvn clean install -pl debezium-connector-postgres -Pwal2json-decoder \
     -Ddocker.skip.build=true -Ddocker.skip.run=true -Dpostgres.host=<your PG host> \
     -Dpostgres.user=<your user> -Dpostgres.password=<your password> \
     -Ddebezium.test.records.waittime=10

根据需要调整超时值。

请参阅 Amazon RDS 上的 PostgreSQL,了解有关在 RDS 上设置数据库以进行测试的详细信息。

使用 Oracle XStream 运行 Oracle 连接器的测试

$ mvn clean install -pl debezium-connector-oracle -Poracle-xstream,oracle-tests -Dinstantclient.dir=<path-to-instantclient>

使用非 CDB 数据库运行 Oracle 连接器的测试

$ mvn clean install -pl debezium-connector-oracle -Poracle-tests -Dinstantclient.dir=<path-to-instantclient> -Ddatabase.pdb.name=

运行MongoDB的测试,并从IDE捕获oplog

在没有 maven 的情况下运行测试时,请确保将正确的参数传递给执行。在 中查找正确的参数,并将它们追加到 JVM 执行参数,并在它们前面加上 前缀。由于执行将在生命周期执行之外进行,因此你需要从MongoDB连接器目录中手动启动MongoDB容器

.github/workflows/mongodb-oplog-workflow.yml
debezium.test

$ mvn docker:start -B -am -Passembly -Dcheckstyle.skip=true -Dformat.skip=true -Drevapi.skip -Dcapture.mode=oplog -Dversion.mongo.server=3.6 -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -Dmaven.wagon.http.pool=false -Dmaven.wagon.httpconnectionManager.ttlSeconds=120 -Dcapture.mode=oplog -Dmongo.server=3.6

该行的相关部分将类似于以下内容:

java -ea -Ddebezium.test.capture.mode=oplog -Ddebezium.test.version.mongo.server=3.6 -Djava.awt.headless=true -Dconnector.mongodb.members.auto.discover=false -Dconnector.mongodb.name=mongo1 -DskipLongRunningTests=true [...]

贡献

Debezium社区欢迎任何想要以任何方式提供帮助的人,无论是报告问题,帮助编写文档,还是贡献代码更改以修复错误,添加测试或实现新功能。有关详细信息,请参阅此文档

非常感谢所有Debezium贡献者!