【TiDB 使用环境】生产
【TiDB 版本】v8.0.0
【问题描述】
业务存在部分运行时间很长的事务,想了解长事务会给 TiDB 集群带来哪些具体风险。同时咨询生产环境下,有哪些参数、监控、业务改造手段,用来识别、限制、管控长事务,规避集群故障。
【期望得到的帮助】
- 长事务对 GC、MVCC、内存、锁、Raft 副本的影响
- 生产可用的管控配置与最佳实践
- 如何快速定位是谁产生了长事务
【TiDB 使用环境】生产
【TiDB 版本】v8.0.0
【问题描述】
业务存在部分运行时间很长的事务,想了解长事务会给 TiDB 集群带来哪些具体风险。同时咨询生产环境下,有哪些参数、监控、业务改造手段,用来识别、限制、管控长事务,规避集群故障。
【期望得到的帮助】
长事务在生产上确实是个头疼的问题,我直接给你说重点:
风险影响
管控配置
tidb_gc_life_time 默认 10m,配合 tidb_gc_max_wait_time 控制 GC 等待tidb_enable_async_commit 和 tidb_enable_1pc 减少两阶段提交开销tidb_mem_quota_query 限制单事务内存,超限自动取消tidb_server_memory_limit 防止 OOM定位长事务
information_schema.tidb_trx 表,过滤 STATE='Running' 且时间长的prewrite 耗时长的 SQL,配合 tidb_slow_log_threshold 调低阈值业务改造
先按这个排查,有问题再贴具体监控截图。
长事务会挡住 GC、堆 MVCC、占内存和锁,严重时拖复制。用 INFORMATION_SCHEMA.TIDB_TRX / 慢日志找超长事务,设 tidb_max_txn_ttl 并监控 lock wait。业务拆批、尽快提交;分析类查询不要包在大事务里。
oracle 对于大事务,或者长事务,也会有相同的问题,这些经验一样可以借鉴
设置 tidb_gc_life_time 默认 10m,配合 tidb_gc_max_wait_time 控制 GC 等待
长事务风险
生产管控手段
对大事务进行监控,然后拆成分批小事务
配置脚本,把定期kill长事务。
直接KILL感觉有风险呀
部分场景,确定可以这么做的,不能是全局的。
长事务会引发 MVCC 垃圾堆积、OOM 等集群风险,生产上应通过设置 max-execution-time / tidb_mem_quota_query 等参数硬性限流。