Apache Dolphinscheduler - 无需重启 Master-Server 停止疯狂刷日志解决方案

记录的是一个 3.0 比较难搞的问题,相信不少使用过 3.0 的用户都遇到过 Master 服务中存在一些工作流或者任务流一直不停的死循环的问题,导致疯狂刷日志。不过本人到现在也没找到最关键的触发原因,只是看到一些连锁反应带来的结果……

影响因素

CPU飙高:每个工作流的运行在 Master 中都是一个线程,当这个线程一直没有结束时,是会占用CPU资源的,当服务中存在大量的线程死循环时,可想而知,服务器的资源压力有多大。

磁盘打满:循环的线程内存在日志打印,当大量的线程无时无刻在打印日志时,日志文件会迅速堆积,磁盘的大小是固定的,当磁盘使用率超过一定的阀值时,其他的程序也会因为磁盘可用空间不足而受影响。有些人设置了 Logback 等日志框架配置,限定了日志文件的总大小,但是这样也会引发日志快速覆盖问题,无法找到可用的日志。

数据库压力:每个循环里面都有相关的数据库查询操作,大量的查询会造成数据库压力短期内迅速增大,如果数据库性能不能很好的话,可能数据库就会先挂了。

异常分类

工作流异常:经过排查,大概率发现工作流 state = 4 状态的实例会刷日志

任务流异常:经过排查,大概率发现任务流 state = 6 状态的实例会刷日志

状态枚举异常:工作流、任务流一些异常状态会集中到一个异常状态集合里,监听该异常状态集合时,导致会刷日志

以上 3 种情况也分别对应代码里 3 个关键实体类:ProcessInstanceExecCacheManagerImpl、StreamTaskInstanceExecCacheManagerImpl、StateEventHandlerManager

我们见名知意可知,这 3 个实体类分别对应以上 3 种异常分类,而且都属于 Java 缓存级别管理类!

解决思路

基本的 master 服务处理工作流的一个事件流程,工作流的线程类(WorkflowExecuteRunnable)被放到缓存中,缓存的 key 是工作流实例的 ID,同时每一个工作流都有对应的事件,事件中存储工作流实例的 ID,每次执行事件时都会从缓存中获取线程类,当线程类执行失败时便重新创建一个事件加入事件队列中执行,依次往复,除非缓存中的数据被清除了,才会结束循环。具体流程如下图

  1. 清空异常的工作流或任务流实例(数据库),否则重启又会重新读取问题流实例数据,又开始刷……
  2. 清空以上相关的 Java 缓存(重点看异常分类的 3 个关键类),这一步是关键不重启也可解决刷日志问题,否则需要重启来替代清空缓存的操作(不优雅)

具体操作

1、进入 Master-Server 的日志目录

2、通过 grep 筛选日志中存在的问题流实例 ID(工作流实例、任务流实例)

# 工作流实例
cat dolphinscheduler-master.log |grep "ERROR" | awk -F 'WorkflowInstance-' '{print $2}'
| awk -F']' '{print $1}' | sort | uniq# 任务流实例
cat dolphinscheduler-master.log |grep "ERROR" | awk -F 'TaskInstance-' '{print $2}'
| awk -F']' '{print $1}' | sort | uniq

Tips:这里有一点要注意,如果筛选出来有『0』的实例ID,这个经排查并没用,猜测属于系统默认ID(无视即可),而且发现规律:在日志中,如果 A 或 B 等于 0 或都等于 0,其实只要关心有正常业务值实例ID一方即可,意味着每次业务主要问题是由他(工作流实例或任务流实例)引起,如果都有正常值,那么属于任务流实例问题引起

……[WorkflowInstance-A][TaskInstance-B]……

3、分别在 Api-Server 和 Master-Server 搭建 Arthas 框架,将筛选出来的实例 ID 替换 OGNL 调用函数参数

  • Arthas 快速入门见文档:快速入门 | arthas

4、删除工作流实例、任务流实例数据库数据(Api-Server 执行)

ognl  '@org.apache.dolphinscheduler.service.bean.SpringApplicationContext@applicationContext.getBean("processServiceImpl").deleteWorkProcessInstanceById("工作流实例ID")'
ognl  '@org.apache.dolphinscheduler.service.bean.SpringApplicationContext@applicationContext.getBean("processServiceImpl").deleteAllSubWorkProcessByParentId("工作流实例ID")'
ognl  '@org.apache.dolphinscheduler.service.bean.SpringApplicationContext@applicationContext.getBean("processServiceImpl").deleteWorkProcessMapByParentId("工作流实例ID")'
ognl  '@org.apache.dolphinscheduler.service.bean.SpringApplicationContext@applicationContext.getBean("processServiceImpl").deleteWorkTaskInstanceByProcessInstanceId("工作流实例ID")'

如果不想清空数据库实例,我们刚讲过主要也是因为 state = 4 引起的问题,可以通过改工作流数据库状态也是可以的

UPDATE t_ds_process_instance SET state = 5 WHERE state = 4 AND id = 工作流实例ID;

5、清空 Java 缓存(Master-Server 执行)

# 工作流实例缓存
ognl  '@org.apache.dolphinscheduler.service.bean.SpringApplicationContext@applicationContext.getBean("processInstanceExecCacheManagerImpl").removeByProcessInstanceId("工作流实例ID")'# 任务流实例缓存
ognl  '@org.apache.dolphinscheduler.service.bean.SpringApplicationContext@applicationContext.getBean("streamTaskInstanceExecCacheManagerImpl").removeByTaskInstanceId("任务流实例ID")'# 异常枚举缓存
ognl  '@org.apache.dolphinscheduler.server.master.event.StateEventHandlerManager@stateEventHandlerMap.clear()'

Tips:最后一步因为一刀切可能会误伤正常业务状态,所以最好等到只剩这些异常业务的时候再执行,也可进一步做一些定位异常业务的工作流实例ID进行精准清空(后续更新……)

附加

  • ​​​​​​Arthas - Can not read arthas version from: https://arthas.aliyun.com/api/latest_version
  • Arthas - Unable to open socket file: target process not responding or HotSpot VM not loaded
  • 近期在跟社区的沟通中,3.1.9 和 3.2.0 版本都有涉及过该 BUG 的代码修复,使得该问题已经得到解决,感兴趣可以了解最新版本

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/279079.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十届教育技术前沿国际会议(ICFET 2024)即将召开!

ICFET 2024 | Malacca, MalaysiaInstallation Documentation for your Bootstrap Templatehttp://www.ICFET.org/ 组织单位: 会议主题: 整合教育技术 社交媒体和社交网络 语义网 3.0 播客播放视频讲座 播客向学生提供反馈 Wiki 和博客在高等教育中的…

MySQL最实用面试题(2024-3-14持续更新中)

MySQL篇面试题 一、介绍 ​ 这是由小龙同学自己总结领悟的mysql面试题的解析,也是面试宝典 二、题目 1.数据库三大范式: –作用: ​ 使表结构清晰,减少数据冗余(简单讲就是重复),提高查询…

《探索AI辅助研发的未来之路》

在当今科技飞速发展的时代,人工智能(AI)已经逐渐渗透到各个领域,其中之一便是研发领域。AI辅助研发正以惊人的速度改变着我们对于创新和发现的理解。本文将从技术进展、行业应用、挑战与机遇、未来趋势、法规影响以及人才培养等方…

STP环路避免实验(华为)

思科设备参考:STP环路避免实验(思科) 一,技术简介 Spanning Tree Protocol(STP),即生成树协议,是一种数据链路层协议。主要作用是防止二层环路,并自适应网络变化和故障…

Vue+SpringBoot打造民宿预定管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色2.2.2 房主角色2.2.3 系统管理员角色 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿4.3 新增民宿评价4.4 查询留言4.5 新增民宿订单 五、免责说明 一、摘要 1.1 项目介绍 基于…

GPT-5:人工智能的下一个前沿即将到来

当我们站在人工智能新时代的门槛上时,GPT-5即将到来的呼声愈发高涨且迫切。作为革命性的GPT-3的继任者,GPT-5承诺将在人工智能领域迈出量子跃迁式的进步,其能力可能重新定义我们与技术的互动方式。 通往GPT-5之路 通往GPT-5的旅程已经标记着…

鸿蒙-自定义组件的生命周期

目录 自定义组件的生命周期 1.aboutToAppear 2.aboutToDisappear 3.onPageShow 4.onPageHide 5.onBackPress 日志输出 1.显示页面 2.页面点击返回按钮 3.页面跳转 4.页面返回 自定义组件的生命周期 先来一段列子 import router from ohos.router Entry Component…

如何对医院运营管理进行3D可视化监控?推荐帆软智慧医院建设

智慧医院是运用云计算、大数据、物联网、移动互联网和人工智能等技术,通过建立互联、物联、感知、智能的医疗服务环境,整合医疗资源,优化医疗服务流程,规范诊疗行为,提高诊疗效率,辅助临床决策和医院管理决…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Text)

显示一段文本的组件。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 可以包含Span和ImageSpan子组件。 接口 Text(content?: string | Resource, value?: TextOptions) 从API versi…

四.排序(冒泡/选择)

目录 11-排序介绍 常见排序算法: 12-冒泡排序介绍 代码要求: 思路: 13-冒泡排序 代码: 14-选择排序 简单写法: 好的写法: 11-排序介绍 排序:将一组“无序”的记录序列调整为“有序”的记录序列。 列表排序:将无序列表变为有序列表 输入&#…

Samtec科普 | 一文了解患者护理应用连接器

【摘要/前言】 通过医疗专业人士为患者提供护理的种种需求,已经不限于手术室与医院的各种安全状况。当今许多患者的护理都是在其他环境进行,例如医生办公室、健康中心,还有越来越普遍的住家。尤其是需要长期看护的患者,所需的科技…

达梦数据库SQL

达梦JSON函数技术文档 SQL中关键词处理 -- 必须要使用双引号包裹 select id,"comment" from t_cmp_rd_process;select id,"commit" from t_cmp_rd_gjj_eva;JSON_EXTRACT函数 -- party_sup_other_json 是包含JSON数据的列名。 -- $.content_abstract 是J…

Vue.js 应用实现监控可观测性最佳实践

本文由观测云团队编写~ 前言 Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue 都可以胜任。 …

DNF的概念和操作命令

yum是linux系统中基于rpm包管理的一种软件管理工具。 在dnf.conf文件中,我们可以配置某个网络服务器位软件源仓库。配置的方法,就是用vim编辑/etc/dnf/dnf.conf这个文件。

可视化展示与交互编辑:探索3D Web轻量化平台HOOPS WEB Platform在BIM中的新可能性

随着数字技术的飞速发展,建筑行业也在不断迈向数字化转型的道路。在这个过程中,BIM(Building Information Modeling,建筑信息模型)技术已经成为建筑设计、施工和管理领域中的一项重要工具。 而在BIM的应用中&#xff…

【01】htmlcssgit网络基础知识

一、html&css 防脱发神器 一图胜千言 使用border-box控制尺寸更加直观,因此,很多网站都会加入下面的代码 * {margin: 0;padding: 0;box-sizing: border-box; }颜色的 alpha 通道 颜色的 alpha 通道标识了色彩的透明度,它是一个 0~1 之间的取值,0 标识完全透明,1…

机器学习-04-分类算法-03KNN算法

总结 本系列是机器学习课程的系列课程,主要介绍机器学习中分类算法,本篇为分类算法与knn算法部分。 本门课程的目标 完成一个特定行业的算法应用全过程: 懂业务会选择合适的算法数据处理算法训练算法调优算法融合 算法评估持续调优工程化…

【计算机网络篇】物理层(2)传输方式

文章目录 🍔传输方式⭐串行传输和并行传输⭐同步传输和异步传输🎈同步传输🎈异步传输 ⭐单向通信,双向交替通信和双向同时通信 🍔传输方式 在物理层中,传输方式是指数据在传输介质中传输的方式和方法。常见…

js判断对象是否有某个属性

前端判断后端接口是否返回某个字段的时候 <script>var obj { name: "John", age: 30 };console.log(obj.hasOwnProperty("name")); // 输出 trueconsole.log(obj.hasOwnProperty("email")); // 输出 falselet obj11 { name: "Joh…

小土堆深度学习笔记

pytorch安装&#xff0c;请查看上篇博客。 读取图片操作 from PIL import Imageimg_path "D:\\pythonProject\\learn_pytorch\\dataset\\train\\ants\\0013035.jpg" img Image.open(img_path) img.show()dir_path"dataset/train/ants" import os img_pa…