Debezium日常分享系列之:Debezium2.5稳定版本之Oracle数据库的查询模式、事件缓冲、SCN间隙检测、低变化频率偏移管理

本文主要是介绍Debezium日常分享系列之:Debezium2.5稳定版本之Oracle数据库的查询模式、事件缓冲、SCN间隙检测、低变化频率偏移管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Debezium日常分享系列之:Debezium2.5稳定版本之Oracle数据库的查询模式、事件缓冲、SCN间隙检测、低变化频率偏移管理

  • 一、查询模式
  • 二、事件缓冲
  • 三、Heap
  • 四、Infinispan
  • 五、Infinispan Hotrod 客户端集成
  • 六、SCN间隙检测
  • 七、低变化频率偏移管理
  • 八、Debezium技术总结

一、查询模式

Debezium Oracle 连接器默认与 Oracle LogMiner 集成。此集成需要一组专门的步骤,其中包括生成复杂的 JDBC SQL 查询以将事务日志中记录的更改作为更改事件获取。 JDBC SQL 查询使用的 V$LOGMNR_CONTENTS 视图没有任何索引来提高查询的性能,因此可以使用不同的查询模式来控制 SQL 查询的生成方式,以提高查询的执行速度。

可以使用以下其中一项配置 log.mining.query.filter.mode 连接器属性来影响 JDBC SQL 查询的生成方式:

  • none
    • (默认)此模式创建一个 JDBC 查询,该查询仅根据数据库级别的不同操作类型(例如插入、更新或删除)进行过滤。当根据架构、表或用户名包含/排除列表过滤数据时,这是在连接器内的处理循环期间完成的。
    • 当从变化不严重的数据库中捕获少量表时,此模式通常很有用。生成的查询非常简单,主要侧重于以较低的数据库开销尽可能快地读取。
  • in
    • 此模式创建的 JDBC 查询不仅可以过滤数据库级别的操作类型,还可以过滤架构、表和用户名包含/排除列表。查询的谓词是使用基于包含/排除列表配置属性中指定的值的 SQL 子句生成的。
    • 当从充满变化的数据库中捕获大量表时,此模式通常很有用。生成的查询比 none 模式复杂得多,并且侧重于减少网络开销并在数据库级别执行尽可能多的过滤。
    • 最后,不要将正则表达式指定为架构和表包含/排除配置属性的一部分。使用正则表达式将导致连接器无法根据这些配置属性匹配更改,从而导致丢失更改。
  • regex
    • 此模式创建的 JDBC 查询不仅可以过滤数据库级别的操作类型,还可以过滤架构、表和用户名包含/排除列表。但是,与 in 模式不同,此模式使用 Oracle REGEXP_LIKE 运算符生成 SQL 查询,该运算符使用合取或析取,具体取决于是否指定了包含值或排除值。
    • 当捕获可使用少量正则表达式识别的可变数量的表时,此模式通常很有用。生成的查询比任何其他模式都要复杂得多,并且侧重于减少网络开销并在数据库级别执行尽可能多的过滤。

二、事件缓冲

Oracle 按照发生的顺序将所有更改写入重做日志,包括后来被回滚丢弃的更改。因此,来自不同事务的并发更改是交织在一起的。当连接器第一次读取更改流时,由于它无法立即确定哪些更改已提交或回滚,因此它会将更改事件临时存储在内部缓冲区中。提交更改后,连接器将更改事件从缓冲区写入 Kafka。连接器会删除因回滚而丢弃的更改事件。

您可以通过设置属性 log.mining.buffer.type 来配置连接器使用的缓冲机制。

三、Heap

默认缓冲区类型是使用内存配置的。在默认内存设置下,连接器使用 JVM 进程的堆内存来分配和管理缓冲的事件记录。如果您使用内存缓冲区设置,请确保分配给 Java 进程的内存量可以容纳环境中长时间运行的大型事务。

四、Infinispan

Infinispan是一个开源的分布式内存数据网格和缓存平台。它可以在多个节点之间分配和复制数据,并提供高可用性和扩展性。Infinispan可以与Java应用程序集成,以提供快速的缓存和数据访问。它支持多种数据访问模式,包括键值存储、对象存储和查询。Infinispan还具有事务管理、分布式锁和事件通知等功能,可用于构建高性能、可靠的分布式应用程序。

Debezium Oracle 连接器还可以配置为使用 Infinispan 作为其缓存提供程序,支持嵌入式模式本地缓存存储或服务器集群上的远程缓存存储。为了使用 Infinispan,必须使用 infinispan_embedded 或 infinispan_remote 配置 log.mining.buffer.type。

为了实现 Infinispan 缓存配置的灵活性,连接器期望在使用 Infinispan 缓冲事件数据时提供一系列缓存配置属性。请参阅 log.mining.buffer.infinispan.cache 命名空间中的配置属性。这些配置属性的内容取决于连接器是与远程 Infinispan 集群集成还是使用嵌入式引擎。

例如,以下说明了在嵌入式模式下使用 Infinispan 时事务缓存属性的嵌入式配置的外观:

<local-cache name="transactions"><persistence passivation="false"><file-store read-only="false" preload="true" shared="false"><data path="./data"/><index path="./index"/></file-store></persistence>
</local-cache>

深入查看配置,缓存配置为持久化。所有缓存都应以这种方式配置,以避免在事务正在进行时连接器重新启动时丢失事务事件。此外,保存缓存的位置由路径属性定义,这应该是所有可能的运行时环境都可访问的共享位置。

重要的:

  • Infinispan 缓冲区实现利用具有不同名称的多个缓存配置。应该为事务、事件、已处理事务和模式更改定义一个缓存。每个配置都可以根据您的性能需求进行调整,或者除了缓存名称之外都相同。

注意:

  • 将 XML 配置作为 JSON 连接器属性值提供时,必须省略换行符或用 \n 字符替换。

另一个示例,下面说明了使用 Infinispan 集群配置的相同缓存:

<distributed-cache name="transactions" statistics="true"><encoding media-type="application/x-protostream" /><persistence passivation="false"><file-store read-only="false" preload="true" shared="false"><data path="./data"/><index path="./index"/></file-store></persistence>
</distributed-cache>

就像前面示例中的嵌入式本地缓存配置一样,该配置也被定义为持久性的。所有缓存都应以这种方式配置,以避免在事务正在进行时连接器重新启动时丢失事务事件。

然而,与注意有一些差异。首先,缓存被定义为分布式缓存而不是本地缓存。其次,缓存被定义为使用 application/x-protostream 编码,这是所有 Debezium 缓存所必需的。最后,文件存储定义中不需要路径属性,因为 Infinispan 集群将自动处理此问题。

重要的:

  • Infinispan 缓冲液类型被视为正在孵化;缓存格式可能会因版本而异,并且可能需要重新快照。迁移注释将指示是否需要这样做。
  • 此外,当删除使用 Infinispan 缓冲区的 Debezium Oracle 连接器时,持久缓存文件不会自动从磁盘中删除。如果新连接器部署将使用相同的缓冲区位置,则应在部署新连接器之前手动删除这些文件。

五、Infinispan Hotrod 客户端集成

Debezium Oracle 连接器利用 Hotrod 客户端与 Infinispan 集群进行通信。以 log.mining.buffer.infinispan.client 为前缀的任何连接器属性。将使用 infinispan.client 直接传递到 Hotrod 客户端。命名空间,允许完全自定义客户端与集群交互的方式。

使用此 Infinspan 模式时,必须提供至少一个必需的配置属性:

  • log.mining.buffer.infinispan.client.hotrod.server_list
    • 使用 <主机名>:<端口> 格式指定 Infinispan 服务器主机名和端口组合的列表。

六、SCN间隙检测

当 Debezium Oracle 连接器配置为使用 LogMiner 时,它会使用基于系统更改编号 (SCN) 的开始和结束范围从 Oracle 收集更改事件。连接器自动管理此范围,根据连接器是否能够近乎实时地传输更改,或者由于数据库中的大量事务而必须处理积压的更改,来增加或减少范围。

在某些情况下,Oracle 数据库会以异常高的量提高 SCN,而不是以恒定速率增加 SCN 值。 SCN 值的这种跳跃可能是由于特定集成与数据库交互的方式或热备份等事件导致的。

Debezium Oracle 连接器依赖以下配置属性来检测 SCN 间隙并调整挖掘范围。

  • log.mining.scn.gap.detection.gap.size.min:指定最小间隙尺寸。
  • log.mining.scn.gap.detection.time.interval.max.ms:指定最大时间间隔。

连接器首先比较当前SCN与当前挖矿范围内最高SCN的变化次数差异。如果当前 SCN 值与最高 SCN 值之间的差值大于最小间隙大小,则连接器可能检测到 SCN 间隙。为了确认是否存在间隙,连接器接下来会比较当前 SCN 和上一个挖掘范围末尾的 SCN 的时间戳。如果时间戳之间的差值小于最大时间间隔,则确认存在SCN间隙。

当出现 SCN 间隙时,Debezium 连接器会自动使用当前 SCN 作为当前挖掘会话范围的终点。这使得连接器能够快速赶上实时事件,而无需挖掘中间较小的范围,因为 SCN 值增加了意外的大量,因此不会返回任何更改。当连接器执行上述步骤以响应 SCN 间隙时,它会忽略 log.mining.batch.size.max 属性指定的值。连接器完成挖掘会话并捕获实时事件后,它会恢复执行最大日志挖掘批量大小。

注意:

  • 仅当连接器运行并处理近实时事件时发生较大 SCN 增量时,SCN 间隙检测才可用。

七、低变化频率偏移管理

Debezium Oracle 连接器跟踪连接器偏移中的系统更改编号,以便在连接器重新启动时,它可以从上次中断的位置开始。这些偏移量是每个发出的更改事件的一部分;但是,当数据库更改频率较低(每隔几个小时或几天)时,如果事务日志中不再提供系统更改编号,则偏移量可能会过时并阻止连接器成功重新启动。

对于使用非 CDB 模式连接到 Oracle 的连接器,您可以启用 heartbeat.interval.ms 来强制连接器定期发出心跳事件,以便偏移量保持同步。

对于使用CDB模式连接Oracle的连接器来说,维护同步更加复杂。不仅要设置heartbeat.interval.ms,还需要设置heartbeat.action.query。需要指定这两个属性,因为在 CDB 模式下,连接器仅专门跟踪 PDB 内部的更改。需要一种补充机制来触发可插入数据库内的更改事件。每隔一段时间,心跳操作查询就会导致连接器插入新的表行,或更新可插入数据库中的现有行。 Debezium 检测表更改并为其发出更改事件,确保偏移量保持同步,即使在不经常处理更改的可插入数据库中也是如此。

注意:

  • 为了让连接器对不属于连接器用户帐户的表使用 heartbeat.action.query,您必须授予连接器用户对这些表运行必要的 INSERT 或 UPDATE 查询的权限。

八、Debezium技术总结

更多Debezium技术请参考:

  • Debezium技术专栏

这篇关于Debezium日常分享系列之:Debezium2.5稳定版本之Oracle数据库的查询模式、事件缓冲、SCN间隙检测、低变化频率偏移管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/845872

相关文章

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、