从零到一:DolphinScheduler 3.x 集群部署实战与避坑指南
1. 环境准备与基础配置
在开始部署DolphinScheduler集群之前,我们需要确保所有节点满足基本运行条件。以下是关键环境检查清单:
- 操作系统:建议使用CentOS 7+/Ubuntu 18.04+等主流Linux发行版
- JDK 1.8+:所有节点需安装相同版本的JDK并配置JAVA_HOME
- 数据库:MySQL 5.7+/PostgreSQL 8.2.15+(生产环境建议使用主从架构)
- ZooKeeper 3.4.6+:建议3节点以上集群部署
- 网络:确保节点间SSH互通,防火墙开放必要端口
重要提示:所有节点时间必须同步,建议配置NTP服务,时间偏差超过30秒可能导致ZooKeeper集群异常。
1.1 系统用户与权限配置
创建专用部署用户是生产环境的最佳实践:
# 在所有节点执行 sudo useradd -m dolphinscheduler echo "dolphinscheduler:your_password" | sudo chpasswd配置sudo免密权限:
echo 'dolphinscheduler ALL=(ALL) NOPASSWD: ALL' | sudo tee /etc/sudoers.d/dolphinscheduler sudo chmod 0440 /etc/sudoers.d/dolphinscheduler1.2 SSH互信配置
在部署节点生成密钥并分发:
su - dolphinscheduler ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa ssh-copy-id dolphinscheduler@node1 ssh-copy-id dolphinscheduler@node2 # 其他节点同理验证SSH连通性:
ssh node1 "hostname && date" ssh node2 "hostname && date"2. 集群化部署实战
2.1 软件包分发与解压
将DolphinScheduler安装包分发到所有节点:
for node in node1 node2 node3; do scp apache-dolphinscheduler-3.x.x-bin.tar.gz dolphinscheduler@$node:~ ssh dolphinscheduler@$node "tar -zxvf ~/apache-dolphinscheduler-3.x.x-bin.tar.gz -C ~/" done2.2 配置文件详解
核心配置文件位于bin/env/目录:
- install_env.sh- 集群拓扑定义
# 集群节点IP列表 ips="node1,node2,node3" # 主节点配置(建议至少2个) masters="node1,node2" # 工作节点配置(可指定分组) workers="node1:default,node2:default,node3:hadoop-group" # 告警服务器 alertServer="node1" # API服务器 apiServers="node2"- dolphinscheduler_env.sh- 环境变量配置
# JDK路径(所有节点需一致) export JAVA_HOME=/usr/java/jdk1.8.0_291 # 数据库配置(生产环境建议单独部署) export DATABASE=mysql export SPRING_DATASOURCE_URL="jdbc:mysql://db-host:3306/dolphinscheduler?useUnicode=true&characterEncoding=UTF-8" export SPRING_DATASOURCE_USERNAME=ds_user export SPRING_DATASOURCE_PASSWORD=secure_password # ZooKeeper集群配置 export REGISTRY_ZOOKEEPER_CONNECT_STRING="node1:2181,node2:2181,node3:2181"2.3 数据库初始化
执行数据库准备脚本:
mysql -hdb-host -uds_user -psecure_password -e "CREATE DATABASE dolphinscheduler DEFAULT CHARSET utf8mb4" bash tools/bin/upgrade-schema.sh常见问题:若遇到"Unknown system variable 'transaction_isolation'"错误,需在JDBC连接串添加
useSSL=false&allowPublicKeyRetrieval=true
3. ZooKeeper集群集成
3.1 推荐配置参数
在conf/zoo.cfg中添加优化参数:
# 基础配置 tickTime=2000 initLimit=10 syncLimit=5 dataDir=/data/zookeeper clientPort=2181 # 集群节点配置 server.1=node1:2888:3888 server.2=node2:2888:3888 server.3=node3:2888:3888 # 性能优化参数 maxClientCnxns=500 minSessionTimeout=4000 maxSessionTimeout=40000 syncEnabled=true autopurge.snapRetainCount=5 autopurge.purgeInterval=243.2 关键监控指标
通过zkCli.sh检查集群状态:
echo stat | nc localhost 2181 echo mntr | nc localhost 2181 | grep -E 'zk_avg_latency|zk_outstanding_requests'4. 服务部署与验证
4.1 一键部署执行
bash bin/install.sh部署完成后检查服务状态:
| 服务类型 | 检查命令 | 预期结果 |
|---|---|---|
| Master | jps | MasterServer |
| Worker | jps | WorkerServer |
| API Server | curl -I http://node2:12345 | HTTP 200 |
| Alert Server | netstat -tunlp | grep 50052 |
4.2 常见问题排查
问题1:Worker节点未注册
- 检查项:
# 在ZooKeeper节点执行 zkCli.sh ls /dolphinscheduler/nodes/worker - 解决方案:
- 确认
conf/worker.properties中分组配置正确 - 检查Worker日志
logs/worker-server.log是否有连接异常
- 确认
问题2:任务卡在"提交成功"状态
- 检查Master节点资源:
# 检查Master负载 uptime free -h # 检查任务队列 zkCli.sh ls /dolphinscheduler/tasks_queue - 优化建议:
- 调整
conf/master.properties中的master.exec.threads数量 - 增加
master.exec.task.num参数值
- 调整
5. 生产环境优化建议
5.1 性能调优参数
在conf/common.properties中添加:
# Master调度配置 master.dispatch.task.num=10 master.exec.threads=100 master.exec.task.num=20 # Worker执行配置 worker.exec.threads=50 worker.heartbeat.interval=10 worker.max.cpuload.avg=CPU核心数*2 worker.reserved.memory=2.0 # 单位GB5.2 高可用架构设计
推荐的多机房部署方案:
机房A: - Master1 + Worker1 + ZK1 - API Server1 机房B: - Master2 + Worker2 + ZK2 - Alert Server 机房C: - Worker3 + ZK3 - API Server25.3 监控集成方案
Prometheus监控指标配置:
- job_name: 'dolphinscheduler' metrics_path: '/actuator/prometheus' static_configs: - targets: ['node1:12345', 'node2:12345'] labels: group: 'api-server' - targets: ['node1:5678', 'node2:5678'] labels: group: 'master-server'关键监控指标告警规则:
- alert: MasterTaskQueueFull expr: dolphinscheduler_master_task_queue_size > 1000 for: 5m labels: severity: critical annotations: summary: "Master任务队列积压 (instance {{ $labels.instance }})" description: "任务队列大小已达到 {{ $value }},请及时扩容"6. 版本升级策略
6.1 平滑升级步骤
- 停止所有Worker节点
bash bin/stop-worker.sh - 滚动升级Master节点(每次一个)
# 单个节点操作 bash bin/stop-master.sh cp -r conf/ /tmp/ds-conf-backup/ # 替换新版本文件 bash bin/start-master.sh - 升级数据库Schema
bash tools/bin/upgrade-schema.sh - 最后升级Worker和API节点
6.2 回滚方案
- 恢复旧版本二进制文件
- 回退数据库(需提前备份)
-- 使用升级前的备份恢复 mysql -hdb-host -uds_user -p dolphinscheduler < backup_before_upgrade.sql - 按原顺序重启服务
7. 安全加固措施
7.1 网络隔离建议
| 服务类型 | 开放端口 | 访问控制建议 |
|---|---|---|
| Master | 5678 | 仅Worker节点访问 |
| Worker | 1234,50051 | 仅Master和API节点访问 |
| API Server | 12345 | 限制管理IP段 |
| ZooKeeper | 2181,2888,3888 | 仅集群内部通信 |
7.2 认证加密配置
在conf/application-api.properties中启用HTTPS:
server.ssl.enabled=true server.ssl.key-store=conf/keystore.p12 server.ssl.key-store-password=your_password server.ssl.key-store-type=PKCS12API访问令牌安全设置:
# 生成高强度随机令牌 openssl rand -base64 32 | head -c 32 > api-token.secret8. 日常运维技巧
8.1 日志分析命令
查找任务执行失败原因:
# 根据任务实例ID查找日志 grep -r "TaskInstanceId:123456" logs/worker-server.log # 统计错误类型 awk '/ERROR/ {print $6}' logs/master-server.log | sort | uniq -c | sort -nr8.2 数据库维护脚本
定期清理历史数据:
-- 保留30天内的记录 DELETE FROM t_ds_process_instance WHERE state=7 AND end_time < DATE_SUB(NOW(), INTERVAL 30 DAY); -- 优化表空间 OPTIMIZE TABLE t_ds_task_instance;8.3 备份恢复方案
全量备份命令:
# 数据库备份 mysqldump -hdb-host -uds_user -p dolphinscheduler > ds_backup_$(date +%F).sql # 配置文件备份 tar -zcvf ds_conf_$(date +%F).tgz conf/ install_path/9. 典型故障处理
9.1 ZK连接超时问题
现象:日志中出现"Connection loss"错误
解决方案:
- 检查ZK集群健康状态
echo mntr | nc zk1 2181 | grep zk_server_state - 调整ZK客户端参数
# 在conf/common.properties中增加 zookeeper.session.timeout=40000 zookeeper.connection.timeout=30000
9.2 任务积压处理
应急措施:
- 动态增加Worker线程数
# 修改所有Worker节点的conf/worker.properties worker.exec.threads=100 # 滚动重启Worker bash bin/stop-worker.sh && bash bin/start-worker.sh - 临时调整任务优先级
UPDATE t_ds_command SET priority=1 WHERE command_type=5 AND priority<3;
10. 扩展与集成
10.1 与Hadoop生态集成
在conf/common.properties中配置:
# YARN ResourceManager地址 yarn.resourcemanager.address=http://yarn-rm:8088 # HDFS配置 fs.defaultFS=hdfs://namenode:8020 hadoop.security.authentication=kerberos hadoop.security.authorization=true10.2 自定义告警插件
开发步骤:
- 实现
org.apache.dolphinscheduler.alert.plugin.AlertPlugin接口 - 打包JAR放到
lib/plugin/alert/目录 - 在UI界面配置告警实例
10.3 API自动化示例
Python调用示例:
import requests API_URL = "http://ds-api:12345/dolphinscheduler" TOKEN = "your_api_token" def trigger_workflow(project, workflow): headers = {"token": TOKEN} params = { "projectName": project, "processDefinitionName": workflow } resp = requests.post(f"{API_URL}/projects/{project}/executors/start-process-instance", headers=headers, json=params) return resp.json() # 调用示例 print(trigger_workflow("ETL", "daily_import"))11. 性能基准测试
11.1 集群容量评估
| 节点规模 | 日均任务量 | 推荐配置 |
|---|---|---|
| 小型 | <1万 | 2Master+3Worker(8C16G) |
| 中型 | 1-5万 | 3Master+5Worker(16C32G) |
| 大型 | >5万 | 5Master+10Worker(32C64G) |
11.2 压力测试方法
使用内置工具模拟任务提交:
# 启动测试工具 bash tools/bin/stress-test.sh --master node1:5678 \ --worker-group default \ --thread-count 50 \ --task-count 1000监控关键指标:
# Master任务处理速率 watch -n 1 "curl -s http://node1:5678/actuator/metrics/dolphinscheduler.master.task.dispatch.rate | jq '.measurements[0].value'" # Worker线程池使用率 ssh worker1 "curl -s http://localhost:1234/actuator/metrics/dolphinscheduler.worker.thread.pool.usage | jq '.measurements[0].value'"12. 最佳实践总结
经过多个生产环境部署经验,我们总结出以下黄金法则:
- 配置标准化:所有节点保持相同的目录结构和配置文件版本
- 容量规划:Master节点CPU核心数建议≥16,Worker节点根据任务类型配置
- 监控全覆盖:至少监控ZK连接数、任务队列深度、Worker负载三项指标
- 变更管理:任何配置修改都采用滚动更新方式
- 灾备演练:定期测试Master故障转移和数据库恢复流程
对于关键业务工作流,建议:
- 设置合理的任务超时时间
- 配置多级告警通知
- 启用工作流优先级设置
- 定期检查任务依赖关系
# 环境检查一站式脚本 #!/bin/bash check_zk() { echo stat | nc localhost 2181 | grep Mode } check_ds() { curl -s http://localhost:12345/actuator/health | jq -r '.status' } echo "ZK Status: $(check_zk)" echo "DS Health: $(check_ds)"