MySQL 5.7 引入了一种新的数据类型,用于 存储和处理 JSON 数据。客户端可以定义带有新 JSON 数据类型 列的表,并可以使用 SQL 语句和新的内置 JSON 函数来存储和读取 JSON 数据,这些函数可以从其他关系型列构建 JSON 数据,内省 JSON 值的结构,以及在 JSON 数据中进行搜索和操作。可以为表定义生成列,其值从同一表中的另一个列的 JSON 值计算得出,然后为这些生成列定义索引。总的来说,这是 MySQL 中一个非常强大的功能。
Debezium 的 MySQL 连接器将在即将发布的 0.3.4 版本中支持 JSON 数据类型。JSON 文档、数组和标量值将作为字符串出现在变更事件中,模式名称为 io.debezium.data.json。这将使消费者能够方便地处理 JSON 数据。顺便说一句,这与 MongoDB 连接器用于表示 JSON 数据的语义模式类型相同。
这听起来很简单,我们希望也是如此。但是 实现这一点 需要大量的工作。这是因为尽管 MySQL 以字符串形式向客户端应用程序公开 JSON 数据,但它在内部以一种特殊的二进制形式存储所有 JSON 数据,这种形式允许 MySQL 引擎在查询、JSON 函数和生成列中高效地访问 JSON 数据。所有 JSON 数据也以这种二进制形式出现在 binlog 中,这意味着如果我们想提取更有用的字符串表示形式,就必须自己解析二进制形式。编写和测试这个解析器花费了一些时间和精力,最终我们将其捐赠给了连接器内部用于读取 binlog 事件的优秀MySQL binlog 客户端库。
我们要感谢 Stanley Shyiko 在解析 binlog 中的 JSON 时指导我们并帮助我们调试最终问题,感谢他将我们提出的更改合并到他的库中,并在需要时迅速发布了他的库,以及他对我和其他问题的及时响应!
关于 Debezium
Debezium 是一个开源的分布式平台,可以将现有数据库转变为事件流,使应用程序能够几乎即时地看到并响应数据库中已提交的每个行级更改。Debezium 构建在 Kafka 之上,并提供了 Kafka Connect 兼容的连接器,用于监控特定的数据库管理系统。Debezium 将数据更改的历史记录在 Kafka 日志中,这样您的应用程序可以随时停止和重新启动,并可以轻松地消费在未运行时错过的所有事件,确保所有事件都被正确且完整地处理。Debezium 在 Apache 许可证 2.0 下是 开源 的。