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一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

oracle 11g导入\导出(expdp impdp)之导入过程

《oracle11g导入导出(expdpimpdp)之导入过程》导出需使用SEC.DMP格式,无分号;建立expdir目录(E:/exp)并确保存在;导入在cmd下执行,需sys用户权限;若需修... 目录准备文件导入(impdp)1、建立directory2、导入语句 3、更改密码总结上一个环节,我们讲了

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

Ubuntu如何升级Python版本

《Ubuntu如何升级Python版本》Ubuntu22.04Docker中,安装Python3.11后,使用update-alternatives设置为默认版本,最后用python3-V验证... 目China编程录问题描述前提环境解决方法总结问题描述Ubuntu22.04系统自带python3.10,想升级

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service