OB 大事务把 memstore 撑爆导致合并,有什么办法提前发现?

业务偶尔会跑一个批量更新,几十万行一把梭,跑完 memstore 直接飙升触发合并,整个集群那几分钟响应都变慢。

想请教下:

  • 有没有办法在 SQL 层面把大事务拆小(比如分批提交)?OB 有没有类似限制单事务行数的参数?
  • freeze_trigger_percentage 调低一点是不是反而更平滑?
  • 监控上主要盯哪些指标能提前预警?

有处理过大事务的朋友分享下经验。

1 个赞

@论坛小助手

针对大事务导致 MemStore 撑爆的解决办法

根据您的描述,确实存在因大事务批量更新导致内存使用激增从而触发合并的情况。下面针对您提到的问题逐一解答:

1. SQL 层面拆分大事务

  • 分批提交 是一种有效的策略来避免单个事务过大。在应用代码层面可以实现将大批量更新分割成多个小批量的操作,每个小批量操作作为一个独立的事务进行提交。比如,如果一次更新了几十万行数据,可以改为每次更新几千或几万行,并且在每批次后提交事务。
  • OceanBase 并没有提供直接限制单个事务行数的参数,但可以通过编程方式控制事务规模。

2. freeze_trigger_percentage 调整的影响

  • 降低 freeze_trigger_percentage 参数值可能会使得 MemStore 更早地达到触发合并的条件,这看似能够让合并更频繁也更平滑。但实际上,过于频繁的合并同样会带来一定的性能开销,因此需要权衡设置该参数的具体数值以找到最佳平衡点。
  • 适当调整这个参数可能有助于减轻单次大事务带来的压力,但是最根本的解决方案还是应该从源头上优化业务逻辑,通过分批处理等方式减小事务大小。

3. 监控关键指标预警

  • MemStore 使用率:监控当前 MemStore 占用的百分比(如 writing_throttling_trigger_percentage),当接近设定阈值时发出警报。
  • 写入速率:注意观察系统整体及各个租户的写入速度变化趋势,异常快速增加可能是即将发生大规模事务的前兆。
  • 事务持续时间:长期运行的大事务也是一个重要信号,可以设置阈值报警机制。
  • clog 写入速率:作为两阶段提交的一部分,clog 的写入速率也是衡量事务大小的一个参考指标。

4. 经验分享

  • 对于处理过类似问题的朋友来说,通常建议采取以下措施:
    • 合理规划资源:确保有足够的资源来应对高峰期的工作负载。
    • 优化SQL语句:尽可能使用高效的查询和更新语句,减少不必要的索引扫描等操作。
    • 定期维护:定期检查并调整相关配置项,保持系统健康状态。
    • 测试与验证:对于任何重大变更(包括参数调整、代码修改等),都应先在测试环境中充分验证其效果后再推广到生产环境。

希望以上信息能够帮助您解决当前遇到的问题。如果有更多具体细节想要了解,请随时提问!

详情请参考:

  1. 事务相关规范
  2. OceanBase 数据库性能的影响因素
  3. SQL 性能问题的典型场景和排查思路
  4. 手动控制合并
  5. MAJOR 和 MINOR
  6. 合并管理概述
  7. merge_stat_sampling_ratio
  8. 自适应合并
  9. 修改合并配置
  10. SQL 调优典型场景和案例