版权 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 代码库并在本地构建它:
./mvnw
有关平台上的安装说明,请参阅上面的链接。你可以验证版本是否已安装并正在运行:
$ git --version $ javac -version $ mvn -version $ docker --version
许多开源软件项目使用Git,Java和Maven,但需要Docker并不常见。Debezium旨在与许多外部系统(例如各种数据库和服务)进行通信,我们的集成测试验证Debezium是否正确做到了这一点。但是,Debezium的构建系统不是期望你在本地安装了所有这些软件系统,而是使用Docker自动下载或创建必要的映像并为每个系统启动容器。然后,集成测试可以使用这些服务并验证 Debezium 的行为是否符合预期,当集成测试完成时,Debezium 的构建将自动停止它启动的任何容器。
Debezium还有一些不是用Java编写的模块,因此必须在目标操作系统上需要它们。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 构建:
$ mvn clean verify -DskipITs
你可以使用“快速”构建配置文件跳过所有非必要的插件(测试,集成测试,CheckStyle,格式化程序,API兼容性检查等):
$ mvn clean verify -Dquick
这为仅生成输出工件提供了最快的方法,而无需运行任何与 QA 相关的 Maven 插件。这对于尽快生成连接器 JAR 和/或存档非常方便,例如,用于在 Kafka Connect 中进行手动测试。
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
要使用wal2json或pgoutput逻辑解码插件以及特定版本的Apicurio运行PG连接器的测试,可以将测试属性传递为:
$ mvn clean install -pl debezium-connector-postgres -Pwal2json-decoder -Ddebezium.test.apicurio.version=1.3.1.Final
在没有该属性的情况下,将获取Apicurio的稳定版本。
请注意,如果要针对非 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 上设置数据库以进行测试的详细信息。
$ mvn clean install -pl debezium-connector-oracle -Poracle-xstream,oracle-tests -Dinstantclient.dir=<path-to-instantclient>
$ mvn clean install -pl debezium-connector-oracle -Poracle-tests -Dinstantclient.dir=<path-to-instantclient> -Ddatabase.pdb.name=
在没有 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贡献者!