Debezium日常分享系列之:Debezium 3.1.0.Beta1发布
Debezium日常分享系列之:Debezium 3.1.0.Beta1发布
- 新特性和改进
- Debezium 平台的首次发布
- Percona 的最小锁定
- 新的 Oracle 源信息 SCN 和时间戳字段
- Vitess Epoch/零日期列解析的变化
- Vitess 二进制排序的 tiny、medium 和 long 文本列的变化
- CloudEvent traceparent 支持
- WASM 转换中的模式访问支持
- 条件性包含 connect-base 镜像中的组件
- PubSub 源支持并发和压缩
- PubSub 源支持区域性端点
- RabbitMQ 源支持基于键的路由
此版本包含了许多特性和改进,包括但不限于 Debezium Server UI 的首个官方发布、CloudEvent traceparent 支持、Debezium 的 PubSub 和 RabbitMQ 源的新功能、WASM 转换中的模式访问,以及许多其他特性。让我们深入了解这些新特性和改进。
新特性和改进
升级到 Debezium 3.1.0.Beta1 在多个组件中引入了若干新特性和改进:
Debezium 平台的首次发布
一年前,我们开始了这一令人难以置信的旅程,旨在为 Debezium Server 创建一个现代化的用户界面,以简化在 Kubernetes 上部署 Debezium 的过程。我们很高兴地宣布,Debezium 3.1 将是这一多年努力的首个官方发布版本。
新的 Debezium 平台提供了一种基于现代管道的方法,可以在几秒钟内设计源和目标配置、转换链等。可以使用 Helm 按如下方式安装 Debezium 平台
helm install debezium-platform --set domain.url=<your-domain> --version 3.1.0-beta1 oci://quay.io/debezium-charts/debezium-platform
此外,此版本特别为用户界面添加了一些最终的完善功能,包括新的搜索/列表视图切换、显示应用的转换和编辑连接器管道,以及在配置管道时为有经验的用户提供智能编辑器。
Percona 的最小锁定
为 MySQL Percona 用户,Debezium 添加了一个新的 snapshot.locking.mode,以减少在快照过程中发生的锁定量。新的模式 minimal_percona_no_table_locks 与 minimal_percona 提供相同的语义,但额外省略了表级锁定。这为一些不允许表锁定的环境提供了一个替代方案。
新的 Oracle 源信息 SCN 和时间戳字段
Debezium 为 Oracle 变更事件的源信息块添加了几个新字段,包括:
- commit_ts_ms这指定了事件的事务提交的时间(以毫秒为单位)。
- start_scn这指定了事件的事务中观察到的第一个事件的 SCN。
- start_ts_ms这指定了事件的事务中第一个事件由用户更改的时间(以毫秒为单位)。
这些新字段是可选的,因此使用模式注册表的用户应发现这些更改是向后兼容的。
Oracle 的 SCN 值不是唯一的,因此多个事件可能具有相同的 SCN 值和时间戳。在使用这些值进行任何类型的事件排序时应谨慎。
Vitess Epoch/零日期列解析的变化
当 Vitess 值转换器发出一个设置为零日期值的日期列时,根据列的可选性,该字段可能会被发出为 null 或 Unix 元年。这为消费者应用程序创建了一个问题,因为它们无法区分元年值是真正的元年值还是因为源列是零日期而产生的哨兵值。
Debezium 3.1 为 Vitess 用户引入了一个新的配置属性:override.datetime.to.nullable。
默认值为 false,继续使用旧的行为发出日期列,即如果列不为 null,则使用 Unix 元年而不是 null。这意味着消费者将继续无法区分这两种情况。
当设置为 true 时,所有日期和 datetime 列都被设为可选,这意味着无论源数据库中列的可选性如何设置,它们都可以被序列化为 null。这意味着如果源系统中设置了一个零日期,连接器将始终使用 null 来表示这种情况,而不再使用基于元年的值,除非字段被填充了一个实际的非零日期值。
Vitess 二进制排序的 tiny、medium 和 long 文本列的变化
在 Debezium 3.1.0.Alpha2 中,我们引入了一个更改,将 Vitess 二进制排序的文本、枚举和集合列类型作为字符类型字段在变更事件中发出。这不幸地只涵盖了部分列类型,而在此次发布中,我们扩展了这一范围,包括 tinytext、mediumtext 和 longtext 类型)。
请注意,如果使用模式注册表,二进制排序的文本、tinytext、mediumtext、longtext、枚举和集合列类型在序列化方式上的变化可能会引入模式的向后兼容性问题。
CloudEvent traceparent 支持
Debezium 的 CloudEvents 支持已更新,增加了对 traceparent 属性的支持,这使得可以与 OpenTelemetry 集成,将跟踪详细信息作为事件的一部分传递。
通过将 opentelemetry.tracing.attributes.enabled 配置属性设置为 true,并在 metadata.source 中包含 traceparent:header,这些信息将被提供给 CloudEvents 转换器。
可以自定义转换器填充字段的方式,通过更改默认值并指定相应头部中的字段值。例如:
{
"value.converter.metadata.source": "value,id:header,type:header,traceparent:header,dataSchemaName:header"
}
WASM 转换中的模式访问支持
现在,您可以使用 WASM 转换来在 TinyGo 程序中访问一些模式细节。新增了两个方法来支持时间:GetSchemaName 和 GetSchemaType。
TinyGo 模式访问器示例:
package main
import( "githu.com/debezuim/debezium-smt-go-pdk" )
//export process
func process(proxyPtr uint32) uint32 {
var valueSchemaType = debezium.GetSchemaName(debezium.Get(proxyPtr, "valueSchema"))
var opType = debezium.GetSchemType(debezium.Get(proxyPtr, "valueSchema.op"))
// Filter where schema type or opType match
return debezium.SetBool(valueSchemaType == "dummy.Envelope" || opType == "string")
}
func main() {}
条件性包含 connect-base 镜像中的组件
Debezium 的 kafka 和 connect 镜像都源自一个名为 connect-base 的单一通用镜像。默认情况下,这个基础镜像会安装 Apicurio、Jolokia 和 OpenTelemetry 依赖。这对于测试目的非常有用,但如果您希望使用 Debezium 的镜像作为自己项目的基镜像,可能希望在这些依赖对您的环境不必要时将其省略。
现在,connect-base 镜像可以有条件地省略这些依赖。可以通过将 OTL_ENABLED、APICURIO_ENABLED 和 JOLOKIA_ENABLED 环境变量设置为 no,在构建镜像时省略这些依赖,从而创建更小的镜像。
默认情况下,connect-base 镜像将继续安装这些依赖,因此开箱即用时镜像的行为不会发生变化
PubSub 源支持并发和压缩
为了提高与 Google PubSub 的吞吐量和容量,我们引入了几个新的配置属性,以支持 PubSub 的并发和压缩。这些新的配置属性可以在任何现有的 PubSub 配置中使用。
pubsub.concurrency.threads
这指定了用于向 Google PubSub 发布消息的线程数。这可以用来扩展或限制由 Google PubSub 客户端库创建的 PubSub 线程数量。默认情况下,PubSink 使用客户端库的默认行为。
pubsub.compression.threshold.bytes
当设置为 0 或更大的值时,PubSub 源启用可选的压缩,以传输事件批次到 PubSub 端点。是否使用压缩由提供的阈值定义。如果批次的总字节数小于阈值,将不使用压缩。如果批次的总字节数等于或大于阈值,则使用压缩。
PubSub 源支持区域性端点
在使用 PubSub 源时,pubsub.address 通常不足以满足生产系统中可能需要与特定地区(即区域)端点交互的需求。为了解决这一问题,Debezium 3.1 引入了一个新的配置属性,pubsub.region。
新的 pubsub.region 属性允许指定要连接的 Google Cloud 区域,例如 us-central1 或 asia-northeast1。指定后,Debezium 将使用格式为 <region>-pubsub.googleapis.com:443 的区域性端点。这使得可以连接到特定区域的端点,而不是全局端点。
pubsub.region 和 pubsub.address 配置属性是互斥的。如果在配置中提供了 pubsub.address,pubsub.region 将被忽略。
RabbitMQ 源支持基于键的路由
在 Debezium 3.1 中,我们改变了使用配置路由事件的方式。这一新方法采用了基于策略的设计,保留了旧的行为并引入了新的基于键的路由机制。
首先,rabbitmq.routingKeyFromTopicName 已被弃用,并将在未来的版本中移除。此功能已合并到新的 rabbitmq.routingKey.source 配置属性中,可以设置为以下值之一:
static
使用静态路由源时,RabbitMQ 源将使用在 sink 配置中指定的 rabbitmq.routingKey 静态值。由于此值在配置中设置并在 sink 启动时读取,因此该值在整个运行期间保持不变。
topic
使用主题路由源时,RabbitMQ 源将根据目标主题名称生成路由键。此模式替换了旧的 rabbitmq.routingKeyFromTopicName 配置属性行为,该属性现已弃用。
key
使用新的键路由源时,RabbitMQ 源将根据事件的记录键生成路由键。这提供了灵活性,可以控制 RabbitMQ 使用原始的 Debezium 变更事件的键,或者在将事件发送到 RabbitMQ 之前通过自定义转换来更改事件的键。