转载自神龙大侠
生产环境部署方案
在企业线上生产环境中,普遍的做法是至少实施两套环境。
- 测试环境
- 线上环境
测试环境用于验证代码的正确性,当测试环境验证ok后才会部署线上环境。
鉴于CI/CD应用的普遍性,源代码一键部署是必要的。
本文是探索对DolphinScheduler源代码改造,构建测试,线上双环境一键部署和上线。
同时,我对dolphinscheduler-api进行改造,使得前端管理系统前后端分离,以使得部署更贴近生产环境,方便生产环境组件横向部署,这也让前后端并行代码开发更加便利。
如果熟悉DolphinScheduler的同学可以前面的介绍,直接跳到部署方案那里看起。
DolphinScheduler介绍
Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景,提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方案。
Apache DolphinScheduler 旨在解决复杂的大数据任务依赖关系,并为应用程序提供数据和各种 OPS 编排中的关系。 解决数据研发ETL依赖错综复杂,无法监控任务健康状态的问题。 DolphinScheduler 以 DAG(Directed Acyclic Graph,DAG)流式方式组装任务,可以及时监控任务的执行状态,支持重试、指定节点恢复失败、暂停、恢复、终止任务等操作。
工作流定义启动流程
很丝滑有木有(这里面没有alert-server的位置,不过这个也不负责具体的任务执行)
DolphinScheduler核心模块
在二进制文件部署方案中,DolphinScheduler主要是有4个核心server如下:
alert-server 提供告警服务,通过告警插件的方式实现丰富的告警手段。
master-server MasterServer采用分布式无中心设计理念,MasterServer主要负责 DAG 任务切分、任务提交监控,并同时监听其它MasterServer和WorkerServer的健康状态。 MasterServer服务启动时向Zookeeper注册临时节点,通过监听Zookeeper临时节点变化来进行容错处理。 MasterServer基于netty提供监听服务。
该服务内主要包含: DistributedQuartz分布式调度组件,主要负责定时任务的启停操作,当quartz调起任务后,Master内部会有线程池具体负责处理任务的后续操作;
MasterSchedulerService是一个扫描线程,定时扫描数据库中的t_ds_command表,根据不同的命令类型进行不同的业务操作;
WorkflowExecuteRunnable主要是负责DAG任务切分、任务提交监控、各种不同事件类型的逻辑处理;
TaskExecuteRunnable主要负责任务的处理和持久化,并生成任务事件提交到工作流的事件队列;
EventExecuteService主要负责工作流实例的事件队列的轮询;
StateWheelExecuteThread主要负责工作流和任务超时、任务重试、任务依赖的轮询,并生成对应的工作流或任务事件提交到工作流的事件队列;
FailoverExecuteThread主要负责Master容错和Worker容错的相关逻辑;
worker-server WorkerServer也采用分布式无中心设计理念,WorkerServer主要负责任务的执行和提供日志服务。 WorkerServer服务启动时向Zookeeper注册临时节点,并维持心跳。 WorkerServer基于netty提供监听服务。
api-server API接口层,主要负责处理前端UI层的请求。该服务统一提供RESTful api向外部提供请求服务。
从严格意义上来讲,api-server包含了两个模块,一个是后端接口api-server,一个是api-ui前端页面。在dolphinscheduler的二进制部署方案中ApiServer和ui是合并打包的。
在实际的生产环境中一般前后端是分离部署,一个是缩小上线改动的影响范围,上线效率更快,一个是前端和后端的部署机器没必要都保持一样的数量,分离部署更灵活,这个博文是使用最新的release版本3.2.1进行部署的。(2024年7月22日)
- api-ui
系统的前端页面,提供系统的各种可视化操作界面。
部署方案
DolphinScheduler部署主要有四种:
- 单机部署(Standalone)
- 伪集群部署(Pseudo-Cluster)
- 集群部署(Cluster)
- 快速试用 Kubernetes 部署
其中单机部署主要是用于操作体验,并不能执行工作流调度。
官网部署指南:https://dolphinscheduler.apache.org/zh-cn/docs/3.2.2/%E9%83%A...
DolphinScheduler官网提供了二进制文件部署,这种我也试了一下,安装流程很流畅,不过还是没有采用这种部署方案,主要考虑后面产品或者业务会提一些需求,需要这边基于最新的版本做一些开发。
最终决定采用如下两套部署方案:
- 伪集群部署方案 作为测试环境(stag)
- 集群部署方案 作为线上环境(prod)
下文用stag和prod作为测试环境和线上环境标志。
源代码开发pom管理有两种方案:
- 升级版本信息3.2.1到3.2.2
- 使用snapshot版本
为了不跟主线混淆主版本,也是致敬经典,我就使用snapshot作为后续的开发迭代版本了。
修改pom版本
本文基于3.2.1版本统一改成了snapshot版本,这样我自己修改的代码,重新编译之后可以在测试或者生产环境生效。
<groupId>org.apache.dolphinscheduler</groupId>
<artifactId>dolphinscheduler</artifactId>
<version>3.2.100-SNAPSHOT</version>
备注:需要修改所有子模块的pom版本信息。
修改通用环境配置
目前环境需要的依赖或者配置信息目录在根目录下的script/env下,/script/env下保存了测试环境和线上环境都要求一致的配