1. 项目概述
今天想和大家分享一个我在实际工作中验证过的轻量级任务调度方案——使用Docker快速部署DolphinScheduler单机版。这个方案特别适合20人以下的中小技术团队,能在30分钟内完成从零到可用的部署,而且资源占用极低(2核4G的云服务器就能流畅运行)。
DolphinScheduler作为Apache顶级开源项目,提供了可视化的工作流调度、任务编排和监控能力。相比传统的Crontab方案,它支持更复杂的依赖关系、失败重试和报警机制;而对比Airflow等重量级方案,它的学习曲线平缓得多。我团队用这套方案已经稳定运行了半年多,每天调度200+个ETL任务,期间零宕机。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与工具选型
2.1 硬件配置建议
虽然标题说是"一把梭",但合理的基础配置还是必要的。根据我们的压力测试结果:
- 最低配置:2核CPU/4GB内存/50GB磁盘(适合每天<100个任务)
- 推荐配置:4核CPU/8GB内存/100GB SSD(支持每天500+任务)
- 网络要求:需要开放3306(MySQL)、5672(RabbitMQ)、12345(API)端口
注意:磁盘IO性能直接影响任务日志的写入速度,建议优先考虑SSD。我们曾用机械硬盘测试,当并行任务超过20个时会出现明显延迟。
2.2 软件版本选择
这是经过我们生产验证的版本组合:
| 组件 | 版本 | 选择理由 |
|---|---|---|
| Docker | 20.10.14 | 兼容性最好的稳定版 |
| Docker-Compose | 1.29.2 | 匹配Docker版本 |
| DolphinScheduler | 2.0.5 | 当前最稳定的长期支持版本 |
| MySQL | 5.7 | 官方推荐,8.0有兼容性问题 |
| RabbitMQ | 3.8-management | 带Web管理界面 |
3. 详细部署步骤
3.1 一键部署脚本
先上我们优化过的docker-compose.yml(已处理了中文乱码和时区问题):
yaml复制version: '3'
services:
dolphinscheduler:
image: apache/dolphinscheduler:2.0.5
container_name: dolphinscheduler
environment:
- TZ=Asia/Shanghai
- SPRING_PROFILES_ACTIVE=mysql
- DATABASE_HOST=mysql
- DATABASE_PORT=3306
- DATABASE_USERNAME=root
- DATABASE_PASSWORD=123456
- DATABASE_PARAMS=useUnicode=true&characterEncoding=UTF-8
volumes:
- ./logs:/opt/dolphinscheduler/logs
- ./resources:/opt/dolphinscheduler/resources
ports:
- "12345:12345"
depends_on:
- mysql
- rabbitmq
mysql:
image: mysql:5.7
container_name: mysql
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=dolphinscheduler
volumes:
- ./mysql:/var/lib/mysql
ports:
- "3306:3306"
rabbitmq:
image: rabbitmq:3.8-management
container_name: rabbitmq
environment:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=admin
ports:
- "5672:5672"
- "15672:15672"
执行命令:
bash复制mkdir -p {logs,resources,mysql} # 创建持久化目录
docker-compose up -d # 后台启动
3.2 初始化配置
容器启动后需要执行数据库初始化(约2分钟):
bash复制docker exec dolphinscheduler bash -c "sh /opt/dolphinscheduler/script/create-dolphinscheduler.sh"
常见问题处理:
- 如果卡住超过5分钟,检查MySQL日志是否有连接失败
- 内存不足会导致初始化中断,建议先执行
docker-compose down后增加swap空间
3.3 登录与基础配置
访问 http://服务器IP:12345,默认账号密码是admin/dolphinscheduler123
首次登录必做设置:
- 工作流执行队列:资源中心 -> 队列管理 -> 添加(建议命名为default)
- Worker分组:安全中心 -> Worker分组 -> 添加(单机部署填写服务器IP)
- 邮件报警:安全中心 -> 告警实例 -> 添加SMTP信息(实测QQ邮箱最稳定)
4. 生产级优化技巧
4.1 性能调优参数
在resources/application-mysql.yml中添加:
yaml复制spring:
datasource:
hikari:
maximum-pool-size: 20 # 默认10太小
connection-timeout: 30000
master:
exec:
threads: 10 # 主节点调度线程数
worker:
exec:
threads: 20 # 工作节点线程数
task:
fetch: 5 # 单次获取任务数
重启生效:
bash复制docker-compose restart dolphinscheduler
4.2 日志清理策略
在crontab添加(每天凌晨清理7天前日志):
bash复制0 0 * * * find /path/to/logs -name "*.log" -mtime +7 -exec rm -f {} \;
4.3 备份方案
建议的备份策略:
- 数据库:每天mysqldump全量备份
- 工作流定义:使用项目导出功能(支持JSON格式)
- 资源文件:rsync同步到备份服务器
5. 典型使用场景
5.1 数据仓库ETL调度
我们最常用的模式——串联多个数据清洗任务:
code复制[Shell] 拉取原始数据 ->
[Spark] 数据清洗 ->
[Hive] 加载到分区表 ->
[Python] 数据质量检查 ->
[邮件] 发送日报
关键配置:
- 设置任务超时时间(避免僵尸任务)
- 开启失败自动重试(建议3次)
- 下游任务配置上游依赖
5.2 微服务健康检查
定时探测服务可用性:
python复制# 探测脚本示例
import requests
response = requests.get('http://service:8080/health', timeout=5)
if response.status_code != 200:
raise Exception('服务异常!')
5.3 文件自动化处理
监控FTP目录并处理新文件:
shell复制#!/bin/bash
inotifywait -m /ftp/incoming -e create |
while read path action file; do
if [[ "$file" =~ .*csv$ ]]; then
python /scripts/process.py "$path$file"
fi
done
6. 踩坑实录与解决方案
6.1 时区不一致问题
现象:任务实际执行时间比设定时间晚8小时
解决:除了容器设置TZ外,还需修改MySQL时区:
sql复制SET GLOBAL time_zone = '+8:00';
6.2 资源不足导致任务堆积
现象:Worker日志出现"dispatch task failed"
处理步骤:
- 检查
worker.exec.threads是否已调大 - 观察服务器
free -h内存使用 - 紧急情况可以kill -9最耗资源的任务
6.3 数据库连接泄漏
现象:运行一段时间后出现"Too many connections"
根治方案:
sql复制-- 在MySQL中执行
SET GLOBAL wait_timeout = 1800;
SET GLOBAL interactive_timeout = 1800;
7. 监控与维护
7.1 健康检查接口
bash复制curl -X GET "http://localhost:12345/dolphinscheduler/actuator/health"
正常返回:
json复制{"status":"UP","components":{"db":{"status":"UP"},"diskSpace":{"status":"UP"},"ping":{"status":"UP"}}}
7.2 Prometheus监控配置
在application.yml添加:
yaml复制management:
endpoints:
web:
exposure:
include: "*"
metrics:
tags:
application: dolphinscheduler
Grafana面板导入ID:12877(官方模板)
7.3 日常维护清单
建议每周检查:
/opt/dolphinscheduler/logs目录大小- MySQL慢查询日志
- RabbitMQ队列积压情况
- 各Worker节点的负载均衡
这套方案在我们团队已经服务了半年多,最直观的感受是再也不用凌晨起来处理失败的Crontab任务了。对于中小团队来说,能在不增加运维复杂度的情况下获得企业级调度能力,确实是个性价比极高的选择。如果刚开始接触,建议先从简单的Shell任务开始,逐步过渡到复杂的工作流编排。
