OMS 是否会限制增量同步中单次处理的数据量?

【 使用环境 】 测试环境
【 OB or 其他组件 】OMS
【 使用版本 】4.2.7_CE
【问题描述】 使用 OMS 配置 PGtoOB 的增量同步任务时, 当单次事务变更数据量超过一定数量,比如 100W 时, 数据未成功同步,且之后的任何变更都无法被同步。但是任务中的Store和Incr-Sync组件运行正常,只是当前拉取点位的时间不再变动,延迟时间持续增加。
日志中也只提示 :there is no data changed in the specified table of source postgresql-server.
OMS是否有参数或者配置来限制单次处理的行数或数据占用量?
PG 数据库为 15.3

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

根据文档库中的信息,OMS 社区版确实存在对单次处理数据量的限制,尤其是在增量同步场景下。以下是针对您问题的具体分析和解答:


1. OMS 是否会限制增量同步中单次处理的数据量?

是的,OMS 社区版在增量同步过程中会对单次处理的数据量进行限制。这种限制主要体现在以下几个方面:

  • Kafka 消息大小限制
    根据文档片段 7 的描述,如果单次事务变更的数据量过大(例如超过 Kafka Server 的默认限制 message.max.bytes),可能会导致 RecordTooLargeException 错误。默认情况下,Kafka Client 的最大消息大小为 1GB (max.request.size),而 Kafka Server 的默认限制为 1MB (message.max.bytes)。如果您的单次事务变更数据量超过这些限制,可能会导致数据无法成功同步。

  • 内存与并发限制
    文档片段 10 提到,OMS 的性能调优参数中涉及源端和目标端的并发配置 (source.workerNumsink.workerNum) 以及 JVM 内存配置 (coordinator.connectorJvmParam)。如果单次事务变更的数据量过大,可能会超出 OMS 的内存或线程处理能力,从而导致任务停滞。

  • 事务大小限制
    虽然 OceanBase 数据库本身对大事务没有明确的大小限制(见文档片段 6),但在实际使用中,过大的事务可能会导致内存使用激增,进而影响 OMS 的正常运行。


2. 为什么会出现“there is no data changed in the specified table of source postgresql-server”的提示?

根据您的描述,任务中的 Store 和 Incr-Sync 组件运行正常,但拉取点位的时间不再变动,延迟时间持续增加。这可能是因为以下原因:

  • Kafka 消息过大导致丢弃
    如果单次事务变更的数据量超过了 Kafka 的限制,OMS 可能会丢弃该批次的数据,并继续尝试从下一个点位拉取数据。此时,日志中可能会显示“no data changed”的提示。

  • 任务状态异常
    如果任务因数据量过大而进入异常状态(例如暂停或失败),OMS 可能会停止更新拉取点位的时间,导致延迟持续增加。


3. 如何解决此问题?

以下是针对您问题的解决方案:

(1) 调整 Kafka 参数

  • 增加 Kafka Client 的最大消息大小:
    在 OMS 配置文件中,设置 max.request.size 参数,例如:
    max.request.size=209715200  # 单位为字节,此处设置为 200MB
    
  • 增加 Kafka Server 的最大消息大小:
    修改 Kafka Server 的配置文件,设置 message.max.bytes 参数,例如:
    message.max.bytes=209715200  # 单位为字节,此处设置为 200MB
    
    修改完成后需要重启 Kafka Server。

(2) 优化事务大小

  • 在 PostgreSQL 源端,尽量避免单次事务包含过多的数据变更。可以通过分批提交事务来减少单次变更的数据量。
  • 在 OMS 配置中,启用 skipErrorCode 参数跳过特定错误码(如 RecordTooLargeException)。例如:
    skipErrorCode: [1]
    

(3) 调整 OMS 性能参数

  • 增加源端和目标端的并发数:
    根据文档片段 10 的建议,可以适当增加 source.workerNumsink.workerNum 的值。例如:
    source.workerNum: 16
    sink.workerNum: 16
    
  • 增加 JVM 内存配置:
    根据文档片段 10 的建议,调整 -Xms-Xmx-Xmn 参数。例如:
    coordinator.connectorJvmParam: "-Xms16g -Xmx16g -Xmn12g"
    

(4) 监控任务状态

  • 在 OMS 的 增量同步页面,实时查看任务的延迟时间、同步流量和 RPS 等指标(见文档片段 4)。
  • 如果任务因数据量过大而进入异常状态,可以尝试暂停并恢复任务(见文档片段 5 和 9)。

4. 总结

OMS 社区版确实会对增量同步中单次处理的数据量进行限制,主要体现在 Kafka 消息大小、内存使用和事务大小等方面。针对您的问题,建议从以下几个方面入手:

  1. 调整 Kafka 参数以支持更大的消息大小;
  2. 优化 PostgreSQL 源端的事务大小;
  3. 调整 OMS 的性能参数以提升处理能力;
  4. 实时监控任务状态并及时排查异常。

如果上述方法仍无法解决问题,建议联系 OceanBase 的技术支持团队以获取进一步帮助。

检索到的文档如下:

  1. 创建 OceanBase 社区版至 RocketMQ 的数据同步任务
  2. 查看和修改同步对象
  3. 批量操作数据同步任务
  4. 查看数据同步任务的详情
  5. 启动和暂停数据同步任务
  6. 事务相关规范
  7. OMS 社区版错误码
  8. 迁移 HBase 数据库的数据至 OBKV
  9. OMS 社区版问题排查手册
1 个赞

组件进程限制数量为默认的平稳选项

根据文档库中的信息,如果您希望设置 OceanBase 组件进程限制数量为默认的平稳选项,可以参考以下内容:


1. 进程限制的相关配置

OceanBase 数据库的进程涉及多个资源限制参数,包括线程最大栈空间大小(Stack)、最大文件句柄数(Open Files)和 core 文件大小(Core File Size)。这些限制可以通过以下两种方式配置(见文档片段 1):

  • 会话级别修改
    在启动时通过命令行临时修改。例如:

    ulimit -n 65535  # 设置最大文件句柄数
    ulimit -s 65536  # 设置线程最大栈空间大小
    ulimit -c unlimited  # 设置 core 文件大小为不限制
    
  • 全局级别修改
    通过配置文件 /etc/security/limits.conf 永久生效。例如:

    oceanbase soft nofile 65535
    oceanbase hard nofile 65535
    oceanbase soft stack 65536
    oceanbase hard stack 65536
    oceanbase soft core unlimited
    oceanbase hard core unlimited
    

2. 默认的平稳选项

为了确保 OceanBase 数据库运行平稳,默认的资源限制建议如下:

  • 最大文件句柄数
    默认值为 65535,适用于大多数生产环境。如果您的系统资源充足,可以适当增加该值。

  • 线程最大栈空间大小
    默认值为 65536 KB(即 64 MB),适用于大多数场景。如果您的系统中线程数较多,可以适当降低该值以节省内存。

  • core 文件大小
    默认值为 unlimited,允许生成完整的 core 文件以便于调试。如果不需要调试功能,可以将其设置为 0


3. 总结

为了设置组件进程限制数量为默认的平稳选项,建议按照以下配置进行调整:

# 会话级别修改
ulimit -n 65535  # 最大文件句柄数
ulimit -s 65536  # 线程最大栈空间大小
ulimit -c unlimited  # core 文件大小

# 全局级别修改(写入 /etc/security/limits.conf)
oceanbase soft nofile 65535
oceanbase hard nofile 65535
oceanbase soft stack 65536
oceanbase hard stack 65536
oceanbase soft core unlimited
oceanbase hard core unlimited

如果您的系统环境特殊(例如资源受限或高并发场景),可以根据实际需求调整上述参数值。


如果您需要进一步优化或有其他疑问,请提供更多背景信息,我将尽力为您解答!

详情请参考:

  1. (可选)配置 limits.conf
  2. writing_throttling_trigger_percentage
  3. 设置并行执行参数
  4. writing_throttling_maximum_duration
  5. minor_merge_concurrency
  6. CREATE MATERIALIZED VIEW LOG
  7. merge_thread_count
  8. OceanBase 数据库多租户线程
  9. location_refresh_thread_count

(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)

你截图组件监控 看看

你是数据迁移 增量同步的时候 有问题是么?


当变更数据量达到一定值的时候,比如 100W 行。
增量拉取和增量同步组件的拉取点位都不会发生改变。
但是PG数据已经修改了,且事务已经提交,PG 中查询数据已变更和插入完成。
而且之后的所有变更,不管数据量,都不会同步到 OB 中。组件的位点时间一直不变。