DolphinScheduler 高可用集群部署指南
概述
本指南介绍如何在三台 Linux 虚拟机上部署 DolphinScheduler 3.4.1 高可用集群,采用角色分离部署方式,适合准生产环境。
架构特点:
- 2 个 Master 节点实现高可用故障转移
- 2 个 Worker 节点负载均衡执行任务
- 外置 ZooKeeper 集群实现分布式协调
- 外置 PostgreSQL 数据库存储元数据
一、环境规划
1.1 节点配置(角色分离部署)
| 节点名称 | IP 地址 | Master | Worker | API | Alert | 角色定位 |
|---|---|---|---|---|---|---|
| ubuntu-ds-node1 | 10.123.0.121 | ✓ | ✗ | ✓ | ✓ | 调度中心 |
| ubuntu-ds-node2 | 10.123.0.122 | ✓ | ✓ | ✗ | ✗ | 混合部署 |
| ubuntu-ds-node3 | 10.123.0.123 | ✗ | ✓ | ✗ | ✗ | 纯执行节点 |
1.2 外部依赖
| 组件 | 版本 | 说明 |
|---|---|---|
| PostgreSQL | 12+ | 元数据存储(外置数据库集群) |
| ZooKeeper | 3.8.x | 分布式协调服务(外置集群,参考 部署指南) |
| OpenJDK | 17 | Ubuntu 24.04 默认 |
| DolphinScheduler | 3.4.1 | 本指南部署版本 |
1.3 节点角色说明
ubuntu-ds-node1 (10.123.0.121) - 调度中心
- 部署组件: MasterServer + API Server + Alert Server
- 主要职责:
- 任务调度和协调(Master)
- 提供 Web UI 和 API 服务(API)
- 告警服务(Alert)
- 不部署: WorkerServer(避免资源争抢)
ubuntu-ds-node2 (10.123.0.122) - 混合节点
- 部署组件: MasterServer + WorkerServer
- 主要职责:
- 任务调度备份(Master 备用节点)
- 任务执行(Worker)
- 特点: 兼顾调度和执行,资源利用均衡
ubuntu-ds-node3 (10.123.0.123) - 纯执行节点
- 部署组件: WorkerServer
- 主要职责:
- 专注任务执行(Worker)
- 优势: 无 Master 调度开销,全力执行任务
1.4 架构特点
- ✅ Master 高可用:2 个 Master 节点(ubuntu-ds-node1、ubuntu-ds-node2)实现故障转移
- ✅ Worker 水平扩展:2 个 Worker 节点(ubuntu-ds-node2、ubuntu-ds-node3)负载均衡
- ✅ 角色分离:Master 专注调度,Worker 专注执行
- ✅ 外置依赖:PostgreSQL 和 ZooKeeper 均为外置集群,专业运维
二、前置准备
2.1 磁盘分区规划 ⭐重要
推荐的分区方案:
# 查看当前分区
lsblk
df -h
# 建议的分区大小
/boot 1GB # 引导分区
/ 50GB # 根目录
/opt 100GB+ # DolphinScheduler 安装目录
swap 8GB # 交换空间(与内存相当)
验证 /opt 空间:
df -h /opt
2.2 系统要求
- CPU: 4 核(推荐 8 核)
- 内存: 8GB(推荐 16GB)
- 磁盘: 100GB+ SSD(/opt 目录)
- 网络: 千兆网卡
2.3 安装基础软件
在三台节点上执行:
# 更新软件源
sudo apt update
# 安装 JDK 17(Ubuntu 24.04 默认)
sudo apt install openjdk-17-jdk -y
# 安装必要工具
sudo apt install psmisc ssh openssh-server wget curl netcat-openbsd -y
# 验证 Java 安装
java -version
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
2.4 创建部署用户
# 创建用户
useradd dolphinscheduler
# 设置密码:dolphinscheduler
echo "dolphinscheduler:dolphinscheduler" | chpasswd
# 配置 sudo 免密(Ubuntu 亲测有效)
echo 'dolphinscheduler ALL=(ALL) NOPASSWD: ALL' | tee -a /etc/sudoers
sed -i 's/^Defaults\s*requiretty/#Defaults requiretty/g' /etc/sudoers
# 关闭 requiretty(解决 sudo 报错:没有终端)
sed -i 's/^Defaults requiretty/#Defaults requiretty/g' /etc/sudoers
# 创建 master 日志目录 + 全局PID目录
sudo mkdir -p /opt/dolphinscheduler/{master-server/logs,logs}
# 再次赋权(确保新目录权限正确)
sudo chown -R dolphinscheduler:dolphinscheduler /opt/dolphinscheduler
chmod -R 777 /tmp/dolphinscheduler
2.5 配置 chrony 时间同步
在所有节点执行:
sudo apt install chrony -y
sudo tee /etc/chrony/chrony.conf > /dev/null << 'EOF'
pool ntp.aliyun.com iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
logdir /var/log/chrony
EOF
sudo systemctl restart chronyd
sudo systemctl enable chronyd
chronyc sources -v
chronyc tracking
2.7 系统优化配置
sudo sed -i 's/#UseDNS yes/UseDNS no/' /etc/ssh/sshd_config
sudo sed -i 's/#GSSAPIAuthentication yes/GSSAPIAuthentication no/' /etc/ssh/sshd_config
sudo systemctl restart sshd
sudo tee -a /etc/sysctl.conf > /dev/null << 'EOF'
vm.swappiness = 0
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
fs.file-max = 6815744
vm.max_map_count = 262144
fs.aio-max-nr = 1048576
EOF
sudo sysctl -p
2.8 配置 SSH 免密登录
在所有节点上执行(以 dolphinscheduler 用户为例):
# 切换到 dolphinscheduler 用户
su - dolphinscheduler
# 生成 SSH 密钥
ssh-keygen -t rsa -P ""
# 分发公钥到所有节点(包括自己)
# ubuntu-ds-node1、ubuntu-ds-node2、ubuntu-ds-node3 都需要执行
ssh-copy-id dolphinscheduler@10.123.0.121 # ubuntu-ds-node1
ssh-copy-id dolphinscheduler@10.123.0.122 # ubuntu-ds-node2
ssh-copy-id dolphinscheduler@10.123.0.123 # ubuntu-ds-node3
# 测试免密登录(在任意节点执行)
ssh dolphinscheduler@10.123.0.122 "hostname"
# 应该输出:ubuntu-ds-node2
三、PostgreSQL 数据库准备
3.1 创建数据库和用户
在 PostgreSQL (10.123.0.111) 上执行:
CREATE USER dolphinscheduler WITH PASSWORD 'YourStrongPassword123!';
CREATE DATABASE dolphinscheduler OWNER dolphinscheduler;
GRANT ALL PRIVILEGES ON DATABASE dolphinscheduler TO dolphinscheduler;
\c dolphinscheduler
GRANT ALL ON SCHEMA public TO dolphinscheduler;
四、ZooKeeper 集群准备
DolphinScheduler 依赖 ZooKeeper 实现分布式协调(Master 选举、任务分发、集群管理)。
4.1 部署要求
- 版本: ZooKeeper 3.6+(推荐 3.8.x)
- 节点数: 至少 3 节点(奇数节点,保证选举过半)
- 端口: 2181(客户端)、2888(集群通信)、3888(选举)
4.2 部署指南
请参考 ZooKeeper 集群部署指南 完成集群部署。
4.3 验证 ZooKeeper 连接
在 DolphinScheduler 节点上验证 ZK 连通性:
# 测试连接(替换为实际 ZK 地址)
echo "stat" | nc <zk-server-ip> 2181
# 或使用 zkCli.sh(路径根据实际部署位置)
zkCli.sh -server <zk-server-ip>:2181
五、DolphinScheduler 安装
5.1 下载安装包
在 ubuntu-ds-node1 上执行:
cd /tmp
wget https://archive.apache.org/dist/dolphinscheduler/3.4.1/apache-dolphinscheduler-3.4.1-bin.tar.gz
tar -xzf apache-dolphinscheduler-3.4.1-bin.tar.gz
sudo mv apache-dolphinscheduler-3.4.1-bin /opt/dolphinscheduler
sudo chown -R dolphinscheduler:dolphinscheduler /opt/dolphinscheduler
5.2 配置文件修改
修改 bin/env/dolphinscheduler_env.sh,所有服务共享同一配置:
cd /opt/dolphinscheduler
vim bin/env/dolphinscheduler_env.sh
关键配置项:
# JDK 路径
export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-17-openjdk-amd64}
# 数据库配置(PostgreSQL)
export DATABASE=${DATABASE:-postgresql}
export SPRING_PROFILES_ACTIVE=${DATABASE}
export SPRING_DATASOURCE_URL="jdbc:postgresql://10.123.0.111:5432/dolphinscheduler"
export SPRING_DATASOURCE_USERNAME=dolphinscheduler
export SPRING_DATASOURCE_PASSWORD=YourStrongPassword123!
# DolphinScheduler server related configuration
export SPRING_CACHE_TYPE=${SPRING_CACHE_TYPE:-none}
export SPRING_JACKSON_TIME_ZONE=${SPRING_JACKSON_TIME_ZONE:-UTC}
# ZooKeeper 集群地址
export REGISTRY_TYPE=${REGISTRY_TYPE:-zookeeper}
export REGISTRY_ZOOKEEPER_CONNECT_STRING=${REGISTRY_ZOOKEEPER_CONNECT_STRING:-10.123.0.191:2181,10.123.0.192:2181,10.123.0.193:2181}
# Tasks related configurations, need to change the configuration if you use the related tasks.
export HADOOP_HOME=${HADOOP_HOME:-/opt/soft/hadoop}
export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-/opt/soft/hadoop/etc/hadoop}
export SPARK_HOME=${SPARK_HOME:-/opt/soft/spark}
export PYTHON_LAUNCHER=${PYTHON_LAUNCHER:-/opt/soft/python}
export HIVE_HOME=${HIVE_HOME:-/opt/soft/hive}
export FLINK_HOME=${FLINK_HOME:-/opt/soft/flink}
export DATAX_LAUNCHER=${DATAX_LAUNCHER:-/opt/soft/datax/bin/python3}
export SEATUNNEL_HOME=${SEATUNNEL_HOME:-/opt/soft/seatunnel}
export PATH=$HADOOP_HOME/bin:$SPARK_HOME/bin:$PYTHON_LAUNCHER:$JAVA_HOME/bin:$HIVE_HOME/bin:$FLINK_HOME/bin:$DATAX_LAUNCHER:$PATH/bin:$SEATUNNEL_HOME:$PATH
5.3 初始化数据库
注意: 仅需在 ubuntu-ds-node1 执行一次。
cd /opt/dolphinscheduler
bash tools/bin/upgrade-schema.sh
出现 Schema initialized successfully 表示数据库初始化完成。
5.4 分发到各节点
前置准备(在所有节点执行):
# 方式一:仅授权 dolphinscheduler 目录(推荐)
sudo mkdir -p /opt/dolphinscheduler
sudo chown dolphinscheduler:dolphinscheduler /opt/dolphinscheduler
# 方式 二:授权 /opt 目录(简化操作,不推荐生产环境)
sudo chown dolphinscheduler:dolphinscheduler /opt
分发到 ubuntu-ds-node2 (10.123.0.122):Master + Worker
scp -r /opt/dolphinscheduler/* dolphinscheduler@10.123.0.122:/opt/dolphinscheduler/
# ssh dolphinscheduler@10.123.0.122 "rm -rf /opt/dolphinscheduler/alert-server"
分发到 ubuntu-ds-node3 (10.123.0.123):Worker
scp -r /opt/dolphinscheduler/* dolphinscheduler@10.123.0.123:/opt/dolphinscheduler/
# ssh dolphinscheduler@10.123.0.123 "rm -rf /opt/dolphinscheduler/master-server /opt/dolphinscheduler/api-server /opt/dolphinscheduler/alert-server"
5.5 配置 MySQL 驱动(可选)
如果需要使用 MySQL 数据源,需要在所有节点安装 MySQL 驱动:
# 下载 MySQL 驱动到安装目录
cd /opt/dolphinscheduler
# 复制到各服务 libs 目录
cp mysql-connector-j-8.0.33.jar master-server/libs/
cp mysql-connector-j-8.0.33.jar worker-server/libs/
cp mysql-connector-j-8.0.33.jar api-server/libs/
cp mysql-connector-j-8.0.33.jar alert-server/libs/
分发到其他节点:
# ubuntu-ds-node2
scp mysql-connector-j-8.0.33.jar dolphinscheduler@10.123.0.122:/opt/dolphinscheduler/
ssh dolphinscheduler@10.123.0.122 "cd /opt/dolphinscheduler && cp mysql-connector-j-8.0.33.jar master-server/libs/ worker-server/libs/"
# ubuntu-ds-node3
scp mysql-connector-j-8.0.33.jar dolphinscheduler@10.123.0.123:/opt/dolphinscheduler/
ssh dolphinscheduler@10.123.0.123 "cd /opt/dolphinscheduler && cp mysql-connector-j-8.0.33.jar worker-server/libs/"
六、启动服务
6.1 启动各节点服务
ubuntu-ds-node1 (Master + API + Alert):
cd /opt/dolphinscheduler
./bin/dolphinscheduler-daemon.sh start master-server
./bin/dolphinscheduler-daemon.sh start api-server
./bin/dolphinscheduler-daemon.sh start alert-server
./bin/dolphinscheduler-daemon.sh stop master-server
./bin/dolphinscheduler-daemon.sh stop api-server
./bin/dolphinscheduler-daemon.sh stop alert-server
ubuntu-ds-node2 (Master + Worker):
cd /opt/dolphinscheduler
./bin/dolphinscheduler-daemon.sh start master-server
./bin/dolphinscheduler-daemon.sh start worker-server
./bin/dolphinscheduler-daemon.sh stop master-server
./bin/dolphinscheduler-daemon.sh stop worker-server
ubuntu-ds-node3 (Worker):
cd /opt/dolphinscheduler
./bin/dolphinscheduler-daemon.sh start worker-server
./bin/dolphinscheduler-daemon.sh stop worker-server
6.2 验证服务状态
# 在各个节点上检查进程
jps -l | grep DolphinScheduler
# 检查 ZooKeeper 集群(在任意节点执行)
echo stat | nc 10.123.0.121 2181 # ubuntu-ds-node1
echo stat | nc 10.123.0.122 2181 # ubuntu-ds-node2
echo stat | nc 10.123.0.123 2181 # ubuntu-ds-node3
6.3 访问 Web UI
- URL: http://10.123.0.121:12345/dolphinscheduler
- 默认账号: admin / dolphinscheduler123
6.4 集群验证
6.4.1 查看节点状态
登录 Web UI 后,进入 监控中心 → 节点管理:
- Master 节点:ubuntu-ds-node1、ubuntu-ds-node2 应显示「在线」
- Worker 节点:ubuntu-ds-node2、ubuntu-ds-node3 应显示「在线」
所有节点在线即部署成功。
6.4.2 测试任务执行
-
进入 项目管理,创建测试项目
-
创建工作流,添加一个 Shell 任务:
echo "Hello DolphinScheduler" -
保存并上线工作流
-
运行工作流,查看执行日志
任务执行成功证明集群正常工作。
6.4.3 常用运 维命令
# 查看服务状态
./bin/dolphinscheduler-daemon.sh status master-server
./bin/dolphinscheduler-daemon.sh status worker-server
./bin/dolphinscheduler-daemon.sh status api-server
# 重启服务
./bin/dolphinscheduler-daemon.sh restart master-server
# 停止服务
./bin/dolphinscheduler-daemon.sh stop api-server
七、配置 systemd 开机自启
7.1 创建 systemd 服务文件
MasterServer 服务(ubuntu-ds-node1、ubuntu-ds-node2):
sudo tee /etc/systemd/system/dolphinscheduler-master.service > /dev/null << 'EOF'
[Unit]
Description=DolphinScheduler Master Server
After=network.target
[Service]
Type=forking
User=dolphinscheduler
Group=dolphinscheduler
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64"
ExecStart=/opt/dolphinscheduler/bin/dolphinscheduler-daemon.sh start master-server
ExecStop=/opt/dolphinscheduler/bin/dolphinscheduler-daemon.sh stop master-server
PIDFile=/opt/dolphinscheduler/master-server/pid
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
WorkerServer 服务(ubuntu-ds-node2、ubuntu-ds-node3):
sudo tee /etc/systemd/system/dolphinscheduler-worker.service > /dev/null << 'EOF'
[Unit]
Description=DolphinScheduler Worker Server
After=network.target
[Service]
Type=forking
User=dolphinscheduler
Group=dolphinscheduler
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64"
ExecStart=/opt/dolphinscheduler/bin/dolphinscheduler-daemon.sh start worker-server
ExecStop=/opt/dolphinscheduler/bin/dolphinscheduler-daemon.sh stop worker-server
PIDFile=/opt/dolphinscheduler/worker-server/pid
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
API Server 服务(ubuntu-ds-node1):
sudo tee /etc/systemd/system/dolphinscheduler-api.service > /dev/null << 'EOF'
[Unit]
Description=DolphinScheduler API Server
After=dolphinscheduler-master.service
[Service]
Type=forking
User=dolphinscheduler
Group=dolphinscheduler
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64"
ExecStart=/opt/dolphinscheduler/bin/dolphinscheduler-daemon.sh start api-server
ExecStop=/opt/dolphinscheduler/bin/dolphinscheduler-daemon.sh stop api-server
PIDFile=/opt/dolphinscheduler/api-server/pid
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
Alert Server 服务(ubuntu-ds-node1):
sudo tee /etc/systemd/system/dolphinscheduler-alert.service > /dev/null << 'EOF'
[Unit]
Description=DolphinScheduler Alert Server
After=dolphinscheduler-api.service
[Service]
Type=forking
User=dolphinscheduler
Group=dolphinscheduler
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64"
ExecStart=/opt/dolphinscheduler/bin/dolphinscheduler-daemon.sh start alert-server
ExecStop=/opt/dolphinscheduler/bin/dolphinscheduler-daemon.sh stop alert-server
PIDFile=/opt/dolphinscheduler/alert-server/pid
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
7.2 启用服务
sudo systemctl daemon-reload
sudo systemctl enable dolphinscheduler-master
sudo systemctl enable dolphinscheduler-worker
sudo systemctl enable dolphinscheduler-api
sudo systemctl enable dolphinscheduler-alert
sudo systemctl start dolphinscheduler-master
sudo systemctl start dolphinscheduler-worker
sudo systemctl start dolphinscheduler-api
sudo systemctl start dolphinscheduler-alert
sudo systemctl status dolphinscheduler-*
sudo systemctl restart dolphinscheduler-master
sudo systemctl restart dolphinscheduler-worker
sudo systemctl restart dolphinscheduler-api
sudo systemctl restart dolphinscheduler-alert
八、防火墙配置
sudo ufw allow 22/tcp
sudo ufw allow 12345/tcp
sudo ufw allow 12346/tcp
sudo ufw allow 56788/tcp
sudo ufw enable
九、监控与告警
tail -f /opt/dolphinscheduler/logs/dolphinscheduler-*.log | grep ERROR
find /opt/dolphinscheduler/logs -name "*.log" -mtime +30 -delete
十、常见问题
Q1: Master/Worker 注册不上 ZooKeeper
# 检查 ZK 连接(替换为实际 ZK 地址)
echo stat | nc <zk-server-ip> 2181
# 检查 DS 配置
tail -100 /opt/dolphinscheduler/logs/dolphinscheduler-master.log
grep REGISTRY_ZOOKEEPER_CONNECT_STRING /opt/dolphinscheduler/bin/env/dolphinscheduler_env.sh
Q2: 数据库连接失败
psql -h 10.123.0.111 -U dolphinscheduler -d dolphinscheduler -c "SELECT 1;"
grep -E "DATABASE_HOST|DATABASE_PORT|DATABASE_USERNAME|DATABASE_PASSWORD" /opt/dolphinscheduler/bin/env/dolphinscheduler_env.sh
ls -la /opt/dolphinscheduler/lib/ | grep postgresql
Q3: Web UI 无法访问
jps -l | grep ApiApplicationServer
netstat -tlnp | grep 12345
curl http://localhost:12345/dolphinscheduler
Q4: 任务执行失败
tail -200 /opt/dolphinscheduler/logs/dolphinscheduler-worker.log
ls -la /opt/dolphinscheduler/resource/
十一、附录
11.1 各节点服务分布
| 服务 | ubuntu-ds-node1 (10.123.0.121) | ubuntu-ds-node2 (10.123.0.122) | ubuntu-ds-node3 (10.123.0.123) |
|---|---|---|---|
| MasterServer | ✓ | ✓ | ✗ |
| WorkerServer | ✗ | ✓ | ✓ |
| API Server | ✓ | ✗ | ✗ |
| Alert Server | ✓ | ✗ | ✗ |
11.2 关键端口
| 服务 | 端口 |
|---|---|
| API Server | 12345 |
| WorkerServer | 12346 |
| MasterServer | 56788 |
11.3 关键目录
| 目录 | 用途 |
|---|---|
| /opt/dolphinscheduler | DolphinScheduler 安装目录 |
| /opt/dolphinscheduler/logs | 日志目录 |
| /opt/dolphinscheduler/conf | 配置目录 |