【故障排查】10分钟解决Quartz重复调度的疑难杂症
原文中文,约15200字,阅读约需36分钟。
📝
内容提要
本文介绍了使用Apache DolphinScheduler作为调度结构时,解决Quartz重复调度问题的过程。通过排查日志和分析数据库的锁记录,发现问题是由于Tidb数据库在RR隔离级别下,读取的是之前的Read View导致的。解决方案是切换到Mysql数据库或将Tidb数据库更改为RC隔离级别。
🎯
关键要点
-
使用Apache DolphinScheduler作为调度结构时,出现Quartz重复调度问题。
-
问题源于Tidb数据库在RR隔离级别下读取的是之前的Read View。
-
Quartz的底层调度结构导致同名同调度任务被执行两次。
-
通过排查日志和数据库锁记录,确认问题是Quartz引起的。
-
建议的解决方案是切换到Mysql数据库或将Tidb数据库更改为RC隔离级别。
❓
延伸问答
Quartz重复调度问题的原因是什么?
Quartz重复调度问题源于Tidb数据库在RR隔离级别下读取的是之前的Read View。
如何确认Quartz重复调度是由什么引起的?
通过排查日志和分析数据库的锁记录,确认是Quartz引起的重复调度。
解决Quartz重复调度问题的建议是什么?
建议切换到Mysql数据库或将Tidb数据库更改为RC隔离级别。
在使用Apache DolphinScheduler时,Quartz的底层调度结构是什么?
Quartz的底层调度结构是QRTZ_TRIGGERS和QRTZ_FIRED_TRIGGERS表。
为什么Tidb和Mysql在RR隔离级别下的行为不同?
Tidb在开启事务时会立即创建Read View,而Mysql在同一事务中的第一个快照读才会创建Read View。
如何通过日志排查Quartz重复调度的问题?
可以通过开启MVCC日志和全量日志,分析QRTZ_TRIGGERS和QRTZ_FIRED_TRIGGERS表的记录来排查问题。