当你第一次看到DolphinScheduler的Web界面时,那种"终于安装成功"的喜悦往往伴随着新的困惑——这个看似功能强大的调度系统,真的准备好迎接生产环境的挑战了吗?作为经历过三次DolphinScheduler生产部署的老兵,我必须告诉你:从"能运行"到"稳定可靠"之间,还有五个关键步骤等着你去完成。
刚安装好的DolphinScheduler就像一栋没有换锁的新房,admin/dolphinscheduler123这样的默认凭证相当于把钥匙插在门上。去年某金融公司就曾因未修改默认密码导致调度系统被入侵,最终造成数百万损失。
登录后立即进入"安全中心→用户管理",为admin用户设置符合企业规范的强密码。建议密码包含:
bash复制# 密码强度检查示例(返回0表示弱密码)
echo "YourPassword123!" | cracklib-check | grep -q "OK" || echo "弱密码"
在conf/application.yaml中添加SSL配置:
yaml复制server:
ssl:
enabled: true
key-store: conf/keystore.p12
key-store-password: yourpassword
key-store-type: PKCS12
使用OpenSSL生成证书:
bash复制openssl pkcs12 -export -in server.crt -inkey server.key -out conf/keystore.p12
没有告警的调度系统就像没有警报器的仓库,等发现问题时往往为时已晚。某电商企业曾因未配置任务失败告警,导致促销活动数据延迟12小时才被发现。
在conf/alert.properties中配置SMTP:
properties复制mail.protocol=SMTP
mail.server.host=smtp.yourcompany.com
mail.server.port=587
mail.sender=ds-alert@yourcompany.com
mail.user=ds-alert
mail.passwd=yourpassword
mail.smtp.starttls.enable=true
mail.smtp.ssl.trust=*
测试配置是否生效:
sql复制-- 在SQL控制台执行
CALL test_send_mail('recipient@example.com', '测试主题', '测试内容');
告警消息模板示例:
code复制[任务告警] ${processDefinitionName}
状态: ${status}
开始时间: ${startTime}
结束时间: ${endTime}
耗时: ${duration}
详情: ${url}
默认的Worker配置就像给跑车加92号汽油,可能能跑但绝对发挥不出性能。我们曾遇到一个案例:某视频处理平台的任务频繁超时,最后发现是Worker内存分配不足导致。
修改conf/worker.properties关键参数:
| 参数 | 默认值 | 生产建议 | 说明 |
|---|---|---|---|
| worker.exec.threads | 100 | CPU核心数×2 | 并发执行线程数 |
| worker.memory.limit | 1G | 物理内存的70% | 单任务内存上限 |
| worker.heartbeat.interval | 10s | 30s | 心跳间隔 |
| worker.max.cpuload.avg | -1 | CPU核心数×1.5 | 最大负载阈值 |
bash复制# 计算建议值的快捷方式
echo "建议worker.exec.threads: $(($(nproc)*2))"
echo "建议worker.memory.limit: $(($(free -g | awk '/Mem:/{print $2}')*7/10))G"
在conf/worker.properties中添加:
properties复制worker.groups=default,highmem
worker.group.highmem.worker.memory.limit=8G
worker.group.highmem.worker.exec.threads=20
然后在任务定义中指定worker组:
json复制{
"workerGroup": "highmem",
"taskParams": {
"resourceList": []
}
}
独立运行的调度系统就像没有接轨的高铁,再快也跑不出站台。某制造企业曾因未对接LDAP,导致每个新员工都需要手动创建账号,每年浪费数百工时。
在conf/datasource.properties中优化:
properties复制spring.datasource.druid.initialSize=5
spring.datasource.druid.minIdle=5
spring.datasource.druid.maxActive=20
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.druid.validationQuery=SELECT 1
创建专用数据库用户(避免使用dolphinscheduler/dolphinscheduler):
sql复制CREATE USER 'ds_prod'@'%' IDENTIFIED BY 'Complex@Pass123';
GRANT SELECT, INSERT, UPDATE, DELETE ON dolphinscheduler.* TO 'ds_prod'@'%';
FLUSH PRIVILEGES;
在conf/application.yaml中添加:
yaml复制security:
authentication:
type: LDAP
ldap:
urls: ldap://ldap.yourcompany.com:389
base-dn: dc=yourcompany,dc=com
username: cn=admin,dc=yourcompany,dc=com
password: your_ldap_password
user-search-filter: (uid={0})
测试LDAP连接:
bash复制ldapsearch -x -H ldap://ldap.yourcompany.com -b "dc=yourcompany,dc=com" -D "cn=admin,dc=yourcompany,dc=com" -w your_ldap_password "(uid=testuser)"
等到系统出问题再查日志就像车祸后才装行车记录仪。我们曾用日志分析提前发现了一个ZooKeeper连接泄漏问题,避免了生产环境崩溃。
| 日志类型 | 路径 | 监控要点 |
|---|---|---|
| Master | logs/master-server.log | 任务派发延迟 |
| Worker | logs/worker-server.log | 任务执行异常 |
| API | logs/api-server.log | 接口响应时间 |
| Alert | logs/alert-server.log | 告警发送失败 |
bash复制# 日志分析常用命令
tail -f logs/master-server.log | grep -A 3 -B 3 ERROR
grep "Task timeout" logs/worker-server.log | awk '{print $1}' | sort | uniq -c
在conf/application.yaml中启用Prometheus:
yaml复制metrics:
enabled: true
prometheus:
enabled: true
endpoint: /actuator/prometheus
示例Grafana监控面板配置:
json复制{
"panels": [{
"title": "任务执行统计",
"targets": [{
"expr": "sum(dolphinscheduler_task_instance_total) by (state)",
"legendFormat": "{{state}}"
}]
}]
}
记得定期备份这些关键数据: