Debezium 博客

在本篇文章中,我们将讨论一个 CDC-CQRS 管道,它连接了一个规范化的关系型数据库(MySQL)作为命令数据库,以及一个反规范化的 NoSQL 数据库(MongoDB)作为查询数据库,通过 Debezium & Kafka-Streams 实现 DDD Aggregates 的创建。

本教程最初由 QuestDB 发布,特邀贡献者 Yitaek Hwang 在其中展示了如何通过 Debezium 和 Kafka Connect 将数据变更流式传输到 QuestDB。

在 ScyllaDB,我们开发高性能的 NoSQL 数据库 Scylla,它与 Apache Cassandra、Amazon DynamoDB 和 Redis API 兼容。今年早些时候,我们在 Scylla 4.3 中引入了对 变更数据捕获 (CDC) 的支持。这项新功能似乎与 Apache Kafka 生态系统集成非常契合,因此我们使用 Debezium 框架开发了 Scylla CDC 源连接器。在这篇博文中,我们将介绍 Scylla CDC 的基本结构,我们选择 Debezium 框架的原因以及我们做出的设计决策。

我很荣幸地宣布 Debezium 1.7 系列的第二个版本,1.7.0.Beta1

此版本为 Debezium Server 带来了 NATS Streaming 支持,以及许多其他修复和增强。此版本也是第一个与 Apache Kafka 2.8 一起测试的版本。

Create new topics / pipes

当您使用Kafka Connect分布式模式时,您可能会发现一旦启动Kafka Connect,就会自动创建一些与Kafka Connect相关的内部主题。

$ kafka-topics.sh --bootstrap-server $HOSTNAME:9092 --list

connect_configs
connect_offsets
connect_statuses

这是由Kafka Connect自动为您完成的,使用了合理的、定制化的默认主题配置,以满足这些内部主题的需求。

当您启动一个Debezium连接器时,捕获事件的主题将由Kafka代理根据默认(可能经过定制)的代理配置创建,前提是代理配置中启用了auto.create.topics.enable = true

auto.create.topics.enable = true
default.replication.factor = 1
num.partitions = 1
compression.type = producer
log.cleanup.policy = delete
log.retention.ms = 604800000  ## 7 days

但是,在生产环境中,当您使用Debezium和Kafka时,通常会选择禁用Kafka的主题自动创建功能(设置auto.create.topics.enable = false),或者您希望连接器主题的配置与默认值不同。在这种情况下,您必须提前为Debezium的捕获数据源创建主题。
但是,有个好消息!从Kafka Connect版本2.6.0开始,由于KIP-158的实现,可以通过Kafka Connect实现可定制的主题创建,这使得这一过程自动化成为可能。

尽管 Debezium 可以轻松捕获数据库更改并将其记录在 Kafka 中,但您必须做出的更重要的决定之一是如何在 Kafka 中序列化这些更改事件。Kafka 中的每个消息都有一个键和一个值,对于 Kafka 来说,它们是不透明的字节数组。但是,当您设置 Kafka Connect 时,您必须说明 Debezium 事件的键和值应如何序列化为二进制形式,并且您的消费者也必须将它们反序列化回可用的形式。

Debezium 事件的键和值都是结构化的,因此 JSON 当然是一个合理的选择——它灵活、无处不在且与语言无关,但另一方面,它相当冗长。一个替代方案是 Avro,它同样灵活且与语言无关,但速度更快,生成的二进制表示更小。使用 Avro 需要您进行更多的设置工作和一些额外的软件,但其优势通常是值得的。

更新(2019年10月11日):在Kubernetes上运行Debezium(以及Apache Kafka和Kafka Connect)的一个更简单的方法是使用K8s Operator,例如Strimzi。您可以在此处找到在OpenShift上设置Debezium的说明,对于纯Kubernetes也适用类似的步骤。

我们的Debezium教程将逐步引导您完成Debezium的使用,通过安装、启动和连接运行在单个主机上的所有Docker容器。当然,您可以使用Docker Compose或自己的脚本来简化操作,但这只是自动化在单台机器上运行所有容器。您真正想要的是在多台机器的集群上运行容器。在这篇博文中,我们将使用Red Hat和Google提供的容器集群管理器Kubernetes来运行Debezium。

Kubernetes是一个容器(Docker/Rocket/Hyper.sh)集群管理工具。像许多其他流行的集群管理和计算资源调度平台一样,Kubernetes的根源在于Google,Google在运行大规模容器方面经验丰富。他们每周启动、停止和集群20亿个容器,并且他们贡献了许多使容器成为可能的核心Linux底层技术。他们一篇著名的论文讨论了一个名为Borg的内部集群管理器。有了Kubernetes,Google对大家用Java实现他们的论文感到厌倦,于是决定自己实现这篇论文:)

Kubernetes是用Go语言编写的,并且迅速成为大规模调度、管理和集群容器的实际API。这篇博文并非旨在成为Kubernetes的入门指南,因此我们建议您查阅入门指南文档以了解更多关于Kubernetes的信息。

版权所有 © Debezium 及其作者。保留所有权利。有关我们的商标详情,请访问我们的 商标政策商标列表。第三方商标属于其各自所有者,在此提及并不表示任何认可或关联。
×