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

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

一、查询模式

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技术请参考:

  • 22
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最笨的羊羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值