DolphinScheduler 3.1.3 跨越升级 3.4.1:基于 API 的自动化迁移方案
一、背景为什么要跨越大版本旧环境情况当前 DolphinScheduler 版本3.1.3当前 seatunnel 版本2.1.3部署规模1台Master 2台Worker工作流定义3700日均调度任务量20000使用年限已经稳定运行3年升级驱动因素功能需求因业务需求增大当前版本的架构设计缺陷、元数据库处理限制以及服务器资源不足社区支持官方推荐使用最新稳定版本获得更好的技术支持性能优化3.4.1版本在调度性能和稳定性方面有显著提升为什么不用官方升级方案版本跨度太大3.1.3 → 3.2.0 → 3.3.0 → 3.4.1需要多次中间升级生产环境限制无法接受多次停机窗口业务连续性要求高架构变更风险资源中心重构、元数据库表结构变更等存在较高迁移风险工作量考量任务数量多手动重建工作流工作量巨大需要自动化方案二、整体迁移思路绕开官方升级路径采用「重建API」方案2.1 核心思想不追求「逐步升级」而是「换新环境数据迁移」旧环境3.1.3继续稳定运行不影响业务新环境3.4.1全新部署保证架构干净编写脚本代码通过旧版本API读取工作流定义和任务配置通过新版本的API批量创建工作流切换业务任务到新环境2.2 方案优势与风险对比维度官方升级方案本方案重建API停机时间多次升级累计停机可能数小时甚至是数天切换时停旧任务启动新任务基本是无缝衔接】回滚难度困难数据库已变更简单旧环境完好随时切回数据一致性需验证所有表结构迁移只迁移核心业务数据工作流定义历史执行记录不迁移版本适配需处理中间版本的所有兼容性问题直接适配3.4.1只改造必要参数工作量需多次验证主要集中在脚本开发适用场景小版本升级大版本跨越、任务量大三、详细实施步骤3.1 环境准备阶段3.1.1 新环境部署搭建全新的3.4.1版本环境配置数据库、Registry等依赖弃用zk注册中心改用Jdbc配置必要的组件datax、seatunnel等了解新版本的特性如个人关注点在集成seatunnel 2.1.3启动方式从引擎从spark改成start-seatunnel-spark.sh默认参数配。如租户、工作组、环境等在项目管理设置里面配置偏好参数传递变化。新版必须在下游节点添加“IN”类型的参数才可以接收上游变量值验证新环境基本功能正常另外选取代表性任务手动创建执行验证3.1.2 API访问配置在新环境中配置API访问权限令牌管理创建新的令牌获取管理员token用于API调用验证API接口连通性3.2 元数据库基础数据配置表数据复制按照旧版本元数据表的基本配置复刻基础数据到新元数据库表包括id这样在开发还原任务脚本的时候能减少很多改动。核对事项表租户表t_ds_tenant项目表t_ds_project用户表t_ds_user环境表t_ds_environmentt_ds_environment_worker_group_relation工作组t_ds_worker_group数据源表。t_ds_datasource3.3 数据迁移脚本开发3.3.1 前期准备测试先对自己的任务分类模板化的任务非模板化的任务选取代表性的任务在新版本上创建运行保证任务的正常运行同步后的表的数据正常。3.3.2 代码开发-读取原任务定义... //获取整个 循环处理 String processDefinitionUrl OLD_URL /dolphinscheduler/projects/ oldProjectCode /process-definition/query-process-definition-list; MapString, String map new HashMap(); map.put(projectCode, oldProjectCode); String pdRes httpClientUtilOld.doGetRequest(processDefinitionUrl, map); ArrayListJSONObject dataList parseResDataToList(pdRes); for (JSONObject job : dataList) { String oldWFCode job.get(code).toString(); MapString, String mapPara new HashMap(); String oldurl OLD_URL /dolphinscheduler/projects/ oldProjectCode /process-definition/ oldWFCode; mapPara.put(code, oldWFCode); mapPara.put(projectCode, oldProjectCode); String res httpClientUtilOld.doGetRequest(oldurl, mapPara); JSONObject jsonObject JSON.parseObject(res); JSONObject data (JSONObject) jsonObject.get(data); JSONObject processDefinition data.getJSONObject(processDefinition); JSONArray processTaskRelationList data.getJSONArray(processTaskRelationList); JSONArray taskDefinitionList data.getJSONArray(taskDefinitionList); //todo 获取 n个编码替换旧任务编码 //填充 信息创建任务 createWF(processDefinition, processTaskRelationList, taskDefinitionList, NEW_IP, newProjectCode);3.3.3 API创建新工作流//看原工作流的任务有几个 获取任务编码 int taskCnt taskDefinitionList.size(); ListString taskCodeList taskDefinitionList.stream() .map(obj - (JSONObject) obj) .map(obj - obj.getString(code)) .collect(Collectors.toList()); try { // todo 获取 任务编码 String taskCodeUrl NEW_URL /dolphinscheduler/projects/ newProjectCode /task-definition/gen-task-codes; HashMapString, String taskCodeMap new HashMap(); //需要创建n个任务 taskCodeMap.put(genNum, String.valueOf(taskCnt)); String codeData httpClientUtilNew.doGetRequest(taskCodeUrl, taskCodeMap); Object codes JSON.parseObject(codeData).get(data); JSONArray taskCodeArr JSON.parseArray(codes.toString()); //根据实际任务 添加任务下游接收参数 for (int i 0; i taskDefinitionList.size(); i) { JSONObject logTask (JSONObject) taskDefinitionList.get(i); if (“判断逻辑”)) { JSONObject taskParams logTask.getJSONObject(taskParams); JSONArray localParams taskParams.getJSONArray(localParams); // 构造 hiveAmount JSONObject hiveParam new JSONObject(); hiveParam.put(prop, hiveAmount); hiveParam.put(direct, IN); hiveParam.put(type, VARCHAR); hiveParam.put(value, ); localParams.add(hiveParam); logTask.put(taskParamList, localParams); JSONObject paramMap new JSONObject(); for (Object obj : localParams) { JSONObject param (JSONObject) obj; paramMap.put(param.getString(prop), param.getString(value)); } logTask.put(taskParamMap, paramMap); .... // 替换必要参数 code 和seatunnel执行引擎参数 for (int i 0; i taskCodeList.size(); i) { String oldCode taskCodeList.get(i); String newCode taskCodeArr.getString(i); //替换编码 // 替换sea引擎SPARK start-seatunnel-spark.sh taskDefinitionListJsonStr taskDefinitionListJsonStr .replace(\code\: oldCode ,, \code\: newCode ,) .replace(\engine\:\SPARK\,, \startupScript\:\start-seatunnel-spark.sh\,); taskRelationListJsonStr taskRelationListJsonStr .replace(TaskCode\: oldCode ,, TaskCode\: newCode ,); locationsJsonStr locationsJsonStr .replace(oldCode, newCode); ... } MapString, String map new HashMap(); map.put(taskDefinitionJson, taskDefinitionListJsonStr); map.put(taskRelationJson, taskRelationListJsonStr); map.put(locations, locationsJsonStr); map.put(name, processDefinition.getString(name)); map.put(tenantCode, omm);//processDefinition.getString(tenantCode) map.put(executionType, processDefinition.getString(executionType)); map.put(description, processDefinition.getString(description) null ? : processDefinition.getString(description)); map.put(globalParams, processDefinition.getString(globalParams)); map.put(timeout, processDefinition.getString(timeout)); String processDefinitionUrl NEW_URL /dolphinscheduler/projects/ newProjectCode /workflow-definition; String processDefinitionRes httpClientUtilNew.doPostRequest(processDefinitionUrl, map);3.4 迁移执行阶段3.4.1 流程备份旧版本调度表t_ds_schedules_20260416_10选择试点项目选择一个任务量适中、业务影响小的项目作为试点迁移任务定义迁移200个任务定义包括定时配置上线任务不上线定时先上线任务定义但不启用定时调度手动提交验证分批手动提交运行注意和原集群的任务是否冲突因为大部分是天/时/15分钟定时一般不冲突核查处理失败任务分析失败原因修复问题后重新运行上线定时配置所有任务验证无误后上线这些任务的定时下线原集群定时确认新环境稳定运行后下线原集群对应任务的定时分项目、分批次迁移3.4.2 迁移实施按照流程先找个任务少并且有代表性的项目199个任务迁移后试运行一段时间测试稳定性运行一周没有问题。后续迁移完成50个项目总共约3700个任务耗时10天左右表格记录序号项目名项目code任务数处理进度备注1项目113*******1990416完成2项目2..............................50...............3.4.3 运行情况目前已经运行了近1个月时间。以前调度延迟的问题几乎是10秒到1分钟甚至更严重现在几乎没有调度延迟调度缺失实例的问题目前也未发生。目前一切运行良好暂未发现问题后续持续观察。四、风险控制与应急预案4.1 主要风险点数据丢失风险迁移过程中可能遗漏部分配置兼容性问题旧版本特有配置在新版本不支持业务中断风险切换期间可能出现调度延迟4.2 应急预案4.2.1 回滚方案立即停止新环境调度恢复旧环境调度服务分析问题原因修复后重新尝试4.2.2 数据备份完整备份旧环境数据库备份新环境初始配置

相关新闻

深入解析Roundcube安全响应机制:从漏洞披露到实战升级

深入解析Roundcube安全响应机制:从漏洞披露到实战升级

1. 项目概述:为什么需要深入理解Roundcube的安全响应机制?如果你负责管理一个使用Roundcube Webmail的邮件系统,或者你是一名安全研究员,那么“安全响应机制”这个词对你来说,绝不应该只是一个模糊的概念。它直接关系到…

2026/7/3 7:34:15阅读更多 →
2026青岛靠谱小儿推拿推荐,家长口碑认证这几家

2026青岛靠谱小儿推拿推荐,家长口碑认证这几家

养娃路上,最怕的就是孩子生病。尤其是换季时,感冒、咳嗽、积食、睡不好……每次孩子不舒服,当爹妈的就跟着揪心。去医院打针吃药,孩子遭罪,家长也累。这几年,越来越多家长把目光转向小儿推拿——不吃药、不…

2026/7/3 7:34:15阅读更多 →
重组胶原蛋白供应厂家怎么选?从评价标准到实战选型指南

重组胶原蛋白供应厂家怎么选?从评价标准到实战选型指南

- 不同规模企业在选型时有哪些差异化考量?- 四川昂宇医疗器械有限公司在供应体系中扮演什么角色?- 未来行业趋势对供应厂家选择有何影响?结论摘要:- 评价需综合原料纯度与活性、产品线覆盖度、服务与合规能力三个核心维度。- 四川…

2026/7/3 7:34:15阅读更多 →
apate文件伪装工具:如何快速安全地绕过文件格式限制

apate文件伪装工具:如何快速安全地绕过文件格式限制

apate文件伪装工具:如何快速安全地绕过文件格式限制 【免费下载链接】apate 简洁、快速地对文件进行格式伪装 项目地址: https://gitcode.com/gh_mirrors/apa/apate 你是否遇到过需要上传特定格式文件却被系统限制的情况?或者想要保护敏感文件不被…

2026/7/3 9:04:38阅读更多 →
【无标题】PostgreSQL零基础入门:MySQL老手的快速上手指南

【无标题】PostgreSQL零基础入门:MySQL老手的快速上手指南

适用人群:有MySQL基础,零PostgreSQL经验 教程类型:实操入门教程 难度等级:⭐ 入门级 预计学习时间:1-2小时 📖 教程导读 如果你熟悉MySQL,学PostgreSQL会非常快!本教程专为MySQL用户设计,通过对比学习,让你在最短时间内掌握PostgreSQL的安装、配置和基本操作。 你…

2026/7/3 9:04:38阅读更多 →
C++ 11/14/17 线程资源同步对象

C++ 11/14/17 线程资源同步对象

在 C/C 语言中直接使用操作系统提供的多线程资源同步 API 虽然功能强大,但毕竟存在诸多限制,且同样的代码却不能同时兼容 Windows 和 Linux 两个平台;再者 C/C 这种传统语言的使用份额正在被 Java、python、go 等语言慢慢蚕食,很大…

2026/7/3 9:04:38阅读更多 →
全面战争模组制作终极指南:用RPFM轻松打造你的游戏世界

全面战争模组制作终极指南:用RPFM轻松打造你的游戏世界

全面战争模组制作终极指南:用RPFM轻松打造你的游戏世界 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项目地址: https://gi…

2026/7/3 9:04:38阅读更多 →
数据科学团队协作全链路实战指南

数据科学团队协作全链路实战指南

1. 为什么“团队协作是数据科学的核心”不是一句空话,而是每天都在发生的现实“Teamwork is Essential in Data Science”——这句话听起来像职场培训PPT里的标准标语,但如果你真在数据科学一线干过三年以上,就会发现它根本不是口号&#xff…

2026/7/3 9:04:38阅读更多 →
三步实现B站视频下载:解锁大会员4K和充电专属内容的完整解决方案

三步实现B站视频下载:解锁大会员4K和充电专属内容的完整解决方案

三步实现B站视频下载:解锁大会员4K和充电专属内容的完整解决方案 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 你是否经…

2026/7/3 8:59:38阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/2 12:10:34阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/7/2 12:10:34阅读更多 →
LV3296与PIC18F45K22的UART通信与USB扩展方案

LV3296与PIC18F45K22的UART通信与USB扩展方案

1. LV3296与PIC18F45K22的硬件搭档解析在嵌入式数据采集系统中,LV3296条形码扫描模块与PIC18F45K22微控制器的组合堪称经典搭配。LV3296作为一款工业级条码扫描头,其核心是一颗高性能CMOS图像传感器,配合专用解码芯片,能自动识别包…

2026/7/3 0:03:41阅读更多 →
AI初创生存指南:6个月完成可信度验证闭环

AI初创生存指南:6个月完成可信度验证闭环

1. 这不是“逆袭指南”,而是一份AI初创公司真实生存手记“How To Beat Odds As an AI Startup?”——这个标题乍看像一句热血口号,但在我带过7个从0到1的AI产品团队、亲手踩过融资失败、技术债崩盘、客户POC卡在最后一公里等23类典型坑之后,…

2026/7/3 0:03:41阅读更多 →
多模态+推理链+RAG 2.0+智能体:工业级AI系统落地四支柱

多模态+推理链+RAG 2.0+智能体:工业级AI系统落地四支柱

1. 这不是又一篇“AI趋势速览”,而是一份实操者手记:当多模态、推理链、检索增强与智能体协作真正撞进工程现场“LAI #73”这个编号本身就像一个暗号——它不属于某家大厂的白皮书,也不是学术会议的议程表,而是长期泡在模型训练集…

2026/7/3 0:03:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/3 1:12:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/3 1:36:36阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/3 2:08:15阅读更多 →