从零到一:DolphinScheduler 3.x 集群部署实战与避坑指南(含Zookeeper配置)
2026/6/14 10:58:07 网站建设 项目流程

从零到一: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/dolphinscheduler

1.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 ~/" done

2.2 配置文件详解

核心配置文件位于bin/env/目录:

  1. 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"
  1. 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=24

3.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

部署完成后检查服务状态:

服务类型检查命令预期结果
MasterjpsMasterServer
WorkerjpsWorkerServer
API Servercurl -I http://node2:12345HTTP 200
Alert Servernetstat -tunlpgrep 50052

4.2 常见问题排查

问题1:Worker节点未注册

  • 检查项:
    # 在ZooKeeper节点执行 zkCli.sh ls /dolphinscheduler/nodes/worker
  • 解决方案:
    1. 确认conf/worker.properties中分组配置正确
    2. 检查Worker日志logs/worker-server.log是否有连接异常

问题2:任务卡在"提交成功"状态

  • 检查Master节点资源:
    # 检查Master负载 uptime free -h # 检查任务队列 zkCli.sh ls /dolphinscheduler/tasks_queue
  • 优化建议:
    1. 调整conf/master.properties中的master.exec.threads数量
    2. 增加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 # 单位GB

5.2 高可用架构设计

推荐的多机房部署方案:

机房A: - Master1 + Worker1 + ZK1 - API Server1 机房B: - Master2 + Worker2 + ZK2 - Alert Server 机房C: - Worker3 + ZK3 - API Server2

5.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 平滑升级步骤

  1. 停止所有Worker节点
    bash bin/stop-worker.sh
  2. 滚动升级Master节点(每次一个)
    # 单个节点操作 bash bin/stop-master.sh cp -r conf/ /tmp/ds-conf-backup/ # 替换新版本文件 bash bin/start-master.sh
  3. 升级数据库Schema
    bash tools/bin/upgrade-schema.sh
  4. 最后升级Worker和API节点

6.2 回滚方案

  1. 恢复旧版本二进制文件
  2. 回退数据库(需提前备份)
    -- 使用升级前的备份恢复 mysql -hdb-host -uds_user -p dolphinscheduler < backup_before_upgrade.sql
  3. 按原顺序重启服务

7. 安全加固措施

7.1 网络隔离建议

服务类型开放端口访问控制建议
Master5678仅Worker节点访问
Worker1234,50051仅Master和API节点访问
API Server12345限制管理IP段
ZooKeeper2181,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=PKCS12

API访问令牌安全设置:

# 生成高强度随机令牌 openssl rand -base64 32 | head -c 32 > api-token.secret

8. 日常运维技巧

8.1 日志分析命令

查找任务执行失败原因:

# 根据任务实例ID查找日志 grep -r "TaskInstanceId:123456" logs/worker-server.log # 统计错误类型 awk '/ERROR/ {print $6}' logs/master-server.log | sort | uniq -c | sort -nr

8.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"错误

解决方案

  1. 检查ZK集群健康状态
    echo mntr | nc zk1 2181 | grep zk_server_state
  2. 调整ZK客户端参数
    # 在conf/common.properties中增加 zookeeper.session.timeout=40000 zookeeper.connection.timeout=30000

9.2 任务积压处理

应急措施

  1. 动态增加Worker线程数
    # 修改所有Worker节点的conf/worker.properties worker.exec.threads=100 # 滚动重启Worker bash bin/stop-worker.sh && bash bin/start-worker.sh
  2. 临时调整任务优先级
    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=true

10.2 自定义告警插件

开发步骤:

  1. 实现org.apache.dolphinscheduler.alert.plugin.AlertPlugin接口
  2. 打包JAR放到lib/plugin/alert/目录
  3. 在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. 最佳实践总结

经过多个生产环境部署经验,我们总结出以下黄金法则:

  1. 配置标准化:所有节点保持相同的目录结构和配置文件版本
  2. 容量规划:Master节点CPU核心数建议≥16,Worker节点根据任务类型配置
  3. 监控全覆盖:至少监控ZK连接数、任务队列深度、Worker负载三项指标
  4. 变更管理:任何配置修改都采用滚动更新方式
  5. 灾备演练:定期测试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)"

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询