
点亮⭐️
https://github.com/apache/
点击蓝字 关注我们
一次 ClickHouse 宕机引发的“血案”:200+ 任务疯狂重试把 CK 打挂,串行等待策略造成死锁,任务动弹不得。本文记录完整的排查过程和终极解决方案。
一、事故背景
时间线:
重启 CK 后,发现任务全部阻塞,界面一片红:

现象:
机器配置:4C 32G,资源不是问题,问题出在调度策略上。
罪魁祸首:任务执行策略配置了「串行等待」

串行等待的坑:
尝试通过「补数运行」重新执行任务,直接报错:
“已经有一个进行中的任务了”(大意如此,现场没保留)
重启 Dolphin?没用。
手动停止任务?卡在「准备停止」。
等它自己恢复?别做梦了。
二、解决方案:直接改库
既然 UI 层面无能为力,那就釜底抽薪——直接操作 MySQL 数据库。
打开 DolphinScheduler 的数据库,共 65 张表。
根据命名规律,t_ds_process_* 开头的表与任务执行相关:

核心表:

查询 t_ds_process_instance 表,找到那些阻塞的任务实例:
SELECT id, name, state, start_time, end_timeFROM t_ds_process_instanceWHERE state NOT IN (7) -- 7 = 执行成功ORDER BY id DESCLIMIT 50;

果然,一堆 state = 14(串行等待)和 state = 4(准备停止)的记录:

-- 删除阻塞的工作流实例(谨慎操作,建议先备份)DELETE FROM t_ds_process_instanceWHERE state IN (4, 14) -- 准备停止、串行等待 AND process_definition_code = <你的工作流code>;-- 同时清理对应的任务实例DELETE FROM t_ds_task_instanceWHERE process_instance_id IN ( SELECT id FROM t_ds_process_instance WHERE state IN (4, 14));
-- 将阻塞任务改为「失败」状态,释放锁UPDATE t_ds_process_instanceSET state = 6 -- 6 = 失败WHERE state IN (4, 14);
清理完数据后,回到 DolphinScheduler 界面:
工作流定义 → 点击运行 → 选择「补数」

这次终于不报错了,任务顺利执行:

三、预防措施
吃一堑长一智,总结几点避坑经验:

建议:除非业务强依赖顺序,否则用「串行抛弃」代替「串行等待」,避免任务堆积导致死锁。
给任务设置合理的超时时间,避免任务长时间卡住占用资源:
超时告警 + 超时失败
这次事故的根源是 ClickHouse 宕机。考虑:
四、总结
问题本质:串行等待策略 + 任务异常状态 = 死锁
解决思路:UI 搞不定就直接改库,清理 t_ds_process_instance 表中的异常记录
核心教训:
希望你永远用不上这篇文章的解决方案。但如果用上了,记得先备份再动手。
原文链接:https://blog.csdn.net/fengquan8866/article/details/157738868
END

用户案例

迁移实战

最新发版消息

加入社区
关注社区的方式有很多:
同样地,参与Apache DolphinScheduler 有非常多的参与贡献的方式,主要分为代码方式和非代码方式两种。
非代码方式包括:
完善文档、翻译文档;翻译技术性、实践性文章;投稿实践性、原理性文章;成为布道师;社区管理、答疑;会议分享;测试反馈;用户反馈等。
代码方式包括:
查找Bug;编写修复代码;开发新功能;提交代码贡献;参与代码审查等。


你的好友小海豚拍了拍你
并请你帮她点一下“分享”
