业务偶尔会跑一个批量更新,几十万行一把梭,跑完 memstore 直接飙升触发合并,整个集群那几分钟响应都变慢。
想请教下:
- 有没有办法在 SQL 层面把大事务拆小(比如分批提交)?OB 有没有类似限制单事务行数的参数?
-
freeze_trigger_percentage 调低一点是不是反而更平滑?
- 监控上主要盯哪些指标能提前预警?
有处理过大事务的朋友分享下经验。
1 个赞
论坛小助手
#4
针对大事务导致 MemStore 撑爆的解决办法
根据您的描述,确实存在因大事务批量更新导致内存使用激增从而触发合并的情况。下面针对您提到的问题逐一解答:
1. SQL 层面拆分大事务
-
分批提交 是一种有效的策略来避免单个事务过大。在应用代码层面可以实现将大批量更新分割成多个小批量的操作,每个小批量操作作为一个独立的事务进行提交。比如,如果一次更新了几十万行数据,可以改为每次更新几千或几万行,并且在每批次后提交事务。
- OceanBase 并没有提供直接限制单个事务行数的参数,但可以通过编程方式控制事务规模。
2. freeze_trigger_percentage 调整的影响
- 降低
freeze_trigger_percentage 参数值可能会使得 MemStore 更早地达到触发合并的条件,这看似能够让合并更频繁也更平滑。但实际上,过于频繁的合并同样会带来一定的性能开销,因此需要权衡设置该参数的具体数值以找到最佳平衡点。
- 适当调整这个参数可能有助于减轻单次大事务带来的压力,但是最根本的解决方案还是应该从源头上优化业务逻辑,通过分批处理等方式减小事务大小。
3. 监控关键指标预警
-
MemStore 使用率:监控当前 MemStore 占用的百分比(如
writing_throttling_trigger_percentage),当接近设定阈值时发出警报。
-
写入速率:注意观察系统整体及各个租户的写入速度变化趋势,异常快速增加可能是即将发生大规模事务的前兆。
-
事务持续时间:长期运行的大事务也是一个重要信号,可以设置阈值报警机制。
-
clog 写入速率:作为两阶段提交的一部分,clog 的写入速率也是衡量事务大小的一个参考指标。
4. 经验分享
- 对于处理过类似问题的朋友来说,通常建议采取以下措施:
-
合理规划资源:确保有足够的资源来应对高峰期的工作负载。
-
优化SQL语句:尽可能使用高效的查询和更新语句,减少不必要的索引扫描等操作。
-
定期维护:定期检查并调整相关配置项,保持系统健康状态。
-
测试与验证:对于任何重大变更(包括参数调整、代码修改等),都应先在测试环境中充分验证其效果后再推广到生产环境。
希望以上信息能够帮助您解决当前遇到的问题。如果有更多具体细节想要了解,请随时提问!
详情请参考:
- 事务相关规范
- OceanBase 数据库性能的影响因素
- SQL 性能问题的典型场景和排查思路
- 手动控制合并
- MAJOR 和 MINOR
- 合并管理概述
- merge_stat_sampling_ratio
- 自适应合并
- 修改合并配置
- SQL 调优典型场景和案例