配置 Infinispan 的 Oracle 连接器¶
概述¶
默认情况下,Debezium 的 Oracle 连接器使用 JVM 堆缓存传入的变更事件,然后再将它们传递给 SynchDB 进行处理。最大堆大小通过 synchdb.jvm_max_heap_size
GUC 控制。当 JVM 堆内存不足时(尤其是在处理大型事务或包含大量列的模式时),连接器可能会出现 OutOfMemoryError 错误,这使得堆大小调整成为一项关键的调优挑战。
作为替代方案,Debezium 可以配置使用 Infinispan 作为其缓存层。Infinispan 支持 JVM 堆和堆外(直接内存)的内存存储,从而提供更大的灵活性。此外,它还支持钝化功能,允许在达到内存限制时将多余的数据溢出到磁盘。这使得它在高负载下更具弹性,并确保能够优雅地处理大型事务或模式变更,而不会耗尽内存。
synchdb_add_infinispan()
¶
签名:
synchdb_add_infinispan(
connectorName NAME, -- 连接器名称
memoryType NAME, -- 内存类型,可以是“堆”或“非堆”
memorySize INT -- 预留为缓存的内存大小(以 MB 为单位)
)
为给定的连接器注册一个由 Infinispan 支持的缓存配置。这允许连接器使用 Infinispan 缓冲更改事件,并支持基于堆和堆外内存分配以及溢出到磁盘(钝化)。
注意:
- 如果在当前正在运行的连接器上调用,则该设置将在下次重启时生效。
- 如果连接器已存在 Infinispan 缓存,它将被替换。
- memoryType='off_heap' 使用本机(直接)内存,不受 JVM 堆限制,但应谨慎调整大小。
- 当内存填满时,缓存将自动支持钝化到磁盘。
示例:
SELECT synchdb_add_infinispan('oracleconn', 'off_heap', 2048);
synchdb_del_infinispan()
¶
签名:
synchdb_add_infinispan(
connectorName NAME -- 连接器名称
)
删除指定连接器的 Infinispan 缓存配置及其相关的磁盘元数据。此操作将删除:
- 所有缓存文件
- 所有钝化(溢出到磁盘)状态
- 相关的 Infinispan 配置
注意:
- 此函数只能在连接器停止时执行。
- 在连接器处于活动状态时尝试运行此函数将导致错误。
- 永久禁用或重新配置连接器的缓存后端后,使用此命令进行清理。
Example:
SELECT synchdb_del_infinispan('oracleconn');
钝化
¶
钝化简单来说就是,如果缓存已满,infinispan 会弹出并将数据写入磁盘。只要内存中有足够的空间来保存更改事件,就不会发生磁盘写入。数据将写入 $PGDATA/pg_synchdb/ispn_[连接器名称]_[目标数据库名称]
用于测试 Infinispan 大型事务的 Oracle SQL 示例¶
在 Oracle 中创建测试表:
CREATE TABLE big_tx_test (
id NUMBER PRIMARY KEY,
payload VARCHAR2(4000),
created DATE DEFAULT SYSDATE
);
创建一个相对较大的交易:
BEGIN
FOR i IN 1..100000 LOOP
INSERT INTO big_tx_test (id, payload)
VALUES (i, RPAD('x', 4000, 'x'));
END LOOP;
COMMIT;
END;
/
大事务下的行为
未设置 infinispan + 低 JVM heap size (128)
- → 将发生 OutOfMemory 错误
低 JVM heap size (128) + 高 infinispan heap size (2048)
- → 大型事务成功处理
低 JVM heap size (128) + 低 infinispan heap size (128)
- → 将发生钝化
- →
ispn_[连接器名称]_[目标数据库名称]
大小在处理过程中会增加,大型事务处理完成后会减小 - → 大型事务已成功处理,但速度较慢。
低 JVM heap size (128) + 高 infinispan heap size (2048)
- → 将发生 OutOfMemory 错误
- → 请勿将 infinispan 配置 heap size 超过 JVM 最大 heap 内存
较低的 JVM heap size (128) + 较低的 infinispan heap size (64)
- → 将发生钝化
- →
ispn_[连接器名称]_[目标数据库名称]
的大小将在处理过程中增加,并在大型事务处理完成后减小。 - → 不建议使用,因为 infinispan 可能会占用一半的 JVM heap,而剩余空间可能不足以用于其他 Debezium 操作。
低 JVM heap size (128) + 相同的 infinispan heap size (128)
- → 不建议使用,因为 infinispan 可能会占用所有 JVM 堆空间,最终导致 OutOfMemory 错误。
高 JVM heap size (2048) + 低 infinispan heap size (128)
- → 将发生钝化。
- →
ispn_[连接器名称]_[目标数据库名称]
的大小在处理过程中会增加,并在大型事务处理完成后减小。 - → 大型事务处理成功。
- → 效率低下 - 因为只有一小部分 JVM heap 空间用作缓存 + 不必要的钝化。