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

相关文章

mysql数据库分区的使用

《mysql数据库分区的使用》MySQL分区技术通过将大表分割成多个较小片段,提高查询性能、管理效率和数据存储效率,本文就来介绍一下mysql数据库分区的使用,感兴趣的可以了解一下... 目录【一】分区的基本概念【1】物理存储与逻辑分割【2】查询性能提升【3】数据管理与维护【4】扩展性与并行处理【二】分区的

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

IDEA如何切换数据库版本mysql5或mysql8

《IDEA如何切换数据库版本mysql5或mysql8》本文介绍了如何将IntelliJIDEA从MySQL5切换到MySQL8的详细步骤,包括下载MySQL8、安装、配置、停止旧服务、启动新服务以及... 目录问题描述解决方案第一步第二步第三步第四步第五步总结问题描述最近想开发一个新应用,想使用mysq

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

Debian如何查看系统版本? 7种轻松查看Debian版本信息的实用方法

《Debian如何查看系统版本?7种轻松查看Debian版本信息的实用方法》Debian是一个广泛使用的Linux发行版,用户有时需要查看其版本信息以进行系统管理、故障排除或兼容性检查,在Debia... 作为最受欢迎的 linux 发行版之一,Debian 的版本信息在日常使用和系统维护中起着至关重要的作

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像