Debezium发布历史09

原文地址: https://debezium.io/blog/2016/09/19/Serializing-Debezium-events-with-Avro/

Debezium 0.2.2 发布
2016 年 6 月 22 日, 兰德尔·豪奇 (Randall Hauch)
发布 mysql docker

欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯.

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

Debezium 事件键和值都是结构化的,因此 JSON 无疑是一个合理的选择 - 它灵活、普遍且与语言无关,但另一方面它又相当冗长。一种替代方案是 Avro,它也很灵活且与语言无关,而且速度更快并且可以生成更小的二进制表示形式。使用 Avro 需要您进行更多的设置工作和一些额外的软件,但其优点通常是值得的。

Kafka 序列化器和反序列化器
在深入讨论之前,让我们回顾一下 Kafka 生产者和消费者通常如何进行序列化和反序列化。由于键和值是简单的不透明字节数组,因此您可以使用任何内容作为键和值。例如,考虑这样一种情况:我们使用简单的整数作为键,使用字符串作为值。在这里,这些消息的生产者将使用长序列化器将键转换long为二进制形式,并使用字符串序列化器将值转换String为二进制形式。同时,消费者使用长反序列化器将二进制键转换为可用long值,并使用字符串反序列化器将二进制值转换回String对象。

如果键和/或值需要更加结构化,则可以编写生产者和消费者以使用键和/或值的 JSON 结构,并使用 Kafka 提供的JSON 序列化器和反序列化器来进行转换来自存储在 Kafka 消息中的二进制形式。正如我们之前所说,使用 JSON 作为键和/或值非常灵活且与语言无关,但它也会生成相对较大的键和值,因为 JSON 值的字段和结构也需要编码。

Avro 序列化
Avro是一种数据序列化机制,它使用模式来定义数据结构。Avro 在将数据写入二进制格式时依赖于此模式,并且该模式允许它以更紧凑的形式对数据中的字段进行编码。Avro 在读取数据时也依赖于模式。但有趣的是,Avro 模式旨在不断发展,因此实际上可以使用与写入模式略有不同的模式进行读取。此功能使 Avro 成为 Kafka 序列化和反序列化的绝佳选择。

Confluence提供了使用 Avro和单独的Schema Registry的 Kafka 序列化器和反序列化器,它的工作原理如下:当要序列化数字或字符串对象时,Avro 序列化器将确定给定类型对应的 Avro Schema,向 Schema 注册表注册该 schema 及其使用的主题,获取 schema 的唯一标识符,然后以二进制形式编码 schema 的唯一标识符和编码后的内容价值。下一条消息可能具有相同的类型和架构,因此序列化程序可以快速编码该消息的架构标识符和值,而无需与架构注册表通信。仅当需要序列化尚未见过的模式时,Avro 序列化程序才会与模式注册表进行通信。因此,这不仅速度快,而且还产生非常紧凑的二进制形式,并允许生产者不断发展随着时间的推移,它的键和/或值模式。Schema 注册表还可以配置为仅当新版本的 schema 与 Avro schema 演化规则兼容时才允许注册,从而确保生产者不会生成消费者无法读取的消息。

与此同时,消费者使用Avro 反序列化器,它以类似的方式工作,尽管是向后的:当它读取键或值的二进制形式时,它首先查找模式标识符,如果之前没有看到它,则询问架构的架构注册表,然后使用该架构将二进制表示的其余部分解码为其对象形式。同样,如果解串器之前已经看到特定的模式标识符,则它已经具有解码数据所需的模式,并且不必查阅模式注册表。

Kafka 连接转换器
Kafka Connect 与许多 Kafka 生产者/消费者有点不同,因为键和值通常是结构化的。Kafka Connect 不需要连接器来处理 JSON 对象,而是定义了自己的轻量级框架,用于使用模式定义数据结构,从而使编写连接器来处理结构化数据变得更加容易。Kafka Connect 定义了自己的转换器,类似于 Kafka(反)序列化器,不同之处在于 Kafka Connect 的转换器了解这些结构和模式,并且可以将键和值序列化为二进制形式。Kafka Connect 提供JSON 转换器它将结构转换为 JSON,然后使用普通的 Kafka JSON 序列化器,因此下游消费者只需使用普通的 Kafka JSON 反序列化器并获取 Kafka Connect 结构和模式的 JSON 表示。这正是Debezium 教程所使用的,并且watch-topic消费者知道如何使用 JSON 反序列化器。

Kafka Connect 的一大功能是连接器仅提供结构化消息,Kafka Connect 负责使用配置的转换器对它们进行序列化。这意味着您可以将任何 Kafka Connect转换器与任何 Kafka Connect 连接器一起使用,包括 Debezium 的所有连接器。

Kafka Connect 的模式系统是专门为 Avro 设计的,因此 Kafka Connect 模式和 Avro 模式之间存在一对一的映射。Confluence 为 Kafka Connect 提供了一个Avro 转换器,它将连接器提供的 Kafka Connect 结构序列化为紧凑的 Avro 二进制表示形式,再次使用 Schema 注册表,就像 Avro 序列化器一样。如上所述,消费者只需使用普通的 Avro 解串器即可。

使用 Avro 对 Debezium 事件进行序列化带来了几个显着的优势:

Debezium 事件的编码二进制形式明显小于 JSON 表示形式。结构化数据不仅以更紧凑的形式编码,而且与该结构化数据关联的模式以二进制形式表示为单个整数。

将 Debezium 事件编码为其 Avro 二进制形式的速度很快。仅当转换器看到新模式时,才必须咨询模式注册表;否则,模式已经被看到并且其编码逻辑已经被预先计算。

Avro Converter for Kafka Connect 生成带有 Avro 编码键和值的消息,任何使用 Avro 反序列化器的 Kafka 消费者都可以读取这些消息。

Debezium 事件结构基于捕获更改的表的结构。当源表的结构发生变化时(例如,因为ALTER对其应用了语句),事件的结构和模式也会发生变化。如果这样做的方式使得新的 Avro 模式与旧的 Avro 模式兼容,那么消费者将能够在不中断的情况下处理事件,即使事件结构随着时间的推移而变化。

Avro 的 schema 机制比自由格式的 JSON 结构更加正式和严格,并且在比较任意两条消息时可以清楚地识别 schema 的变化。

Avro 转换器、Avro(反)序列化器和架构注册表都是开源的。

确实,使用 Avro 转换器和反序列化器需要一个正在运行的架构注册表,并且该注册表将成为流媒体基础设施的组成部分。然而,为了获得上述好处,这只是一个很小的代价。

将 Avro 转换器与 Debezium 结合使用
如上所述,为了使 Debezium 教程尽可能简单,我们避免在教程中使用架构注册表或 Avro 转换器。我们还没有在 Docker 镜像中包含 Avro 转换器,尽管这种情况很快就会改变。

尽管如此,当您将连接器安装到 Confluence Platform 或您自己安装的 Kafka Connect 中时,绝对可以将 Avro Converter 与 Debezium 连接器一起使用。只需配置Kafka Connect 工作线程即可使用 Avro 转换器来获取键和值:

key.converter=io.confluent.connect.avro.AvroConverter
value.converter=io.confluent.connect.avro.AvroConverter
而且,如果您想使用 Avro Converter 来处理 Kafka Connect 内部消息,也请设置这些:

internal.key.converter=io.confluent.connect.avro.AvroConverter
internal.value.converter=io.confluent.connect.avro.AvroConverter
再次强调,无需对 Debezium 连接器进行任何不同的配置。

你可能感兴趣的:(debezium,CDC,FlinkCDC,数据库,大数据,运维,java)