Apache DolphinScheduler高可用配置:避免单点故障的最佳实践

Apache DolphinScheduler高可用配置:避免单点故障的最佳实践

【免费下载链接】dolphinscheduler Apache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code 【免费下载链接】dolphinscheduler 项目地址: https://gitcode.com/gh_mirrors/do/dolphinscheduler

数据编排平台的单点噩梦:从崩溃到7×24可用的架构演进

生产环境中,当数据调度任务量突破5000+/日,单节点部署的Apache DolphinScheduler(海豚调度器)频繁出现三大痛点:Master节点宕机导致全量任务阻塞、Worker节点过载引发任务积压、数据库单点故障造成元数据丢失。某电商平台在大促期间因Master节点JVM内存溢出,导致300+ETL任务失败,直接损失超百万。本文将系统讲解如何通过多维度高可用(High Availability,HA)配置,构建"故障自愈"的分布式调度集群,满足金融级稳定性要求。

读完本文你将掌握:

  • 三节点ZooKeeper集群部署与动态选举配置
  • 多Master/Worker节点负载均衡架构设计
  • 元数据双活数据库(MySQL/PostgreSQL)配置
  • 资源中心(HDFS/S3)高可用方案实施
  • 故障自动转移与服务自愈监控体系搭建

一、高可用架构设计:从单机到分布式集群

DolphinScheduler采用去中心化架构,通过ZooKeeper实现Master选举与Worker注册,天然支持水平扩展。生产环境最小高可用单元需包含:

mermaid

关键组件高可用设计:

  1. Master节点:至少3节点构成集群,通过ZooKeeper选举机制实现Leader节点动态切换,当Leader宕机后10秒内完成新Leader选举
  2. Worker节点:按业务域划分多个Worker组,每组2-3节点,支持任务自动负载均衡与故障转移
  3. 注册中心:ZooKeeper集群(3/5节点),采用树形结构存储Master/Worker节点状态信息
  4. 元数据库:MySQL主从复制或PostgreSQL流复制,支持自动故障转移
  5. 资源中心:HDFS高可用集群或S3兼容对象存储,确保任务依赖文件高可用访问

二、部署前准备:环境检查与基础组件配置

2.1 服务器资源规划(生产最小规格)

节点类型数量CPU内存磁盘网络操作系统
Master38核16GB100GB SSD千兆网卡CentOS 7.9
Worker316核32GB500GB SSD千兆网卡CentOS 7.9
ZooKeeper34核8GB100GB SSD千兆网卡CentOS 7.9
数据库28核32GB1TB SSD千兆网卡CentOS 7.9

2.2 前置依赖安装

# 所有节点安装JDK 11(推荐Adoptium Temurin)
yum install -y java-11-openjdk-devel
echo 'export JAVA_HOME=/usr/lib/jvm/java-11-openjdk' >> /etc/profile
source /etc/profile

# 安装psmisc(进程管理工具)
yum install -y psmisc

# ZooKeeper集群部署(3节点)
wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz
tar -zxf apache-zookeeper-3.8.4-bin.tar.gz -C /opt/
mv /opt/apache-zookeeper-3.8.4-bin /opt/zookeeper

# 配置ZooKeeper集群(每节点)
cat > /opt/zookeeper/conf/zoo.cfg << EOF
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper
clientPort=2181
server.1=zk-node1:2888:3888
server.2=zk-node2:2888:3888
server.3=zk-node3:2888:3888
EOF

# 设置myid(每节点唯一,1/2/3)
echo 1 > /data/zookeeper/myid

# 启动ZooKeeper集群
/opt/zookeeper/bin/zkServer.sh start

三、核心配置:高可用参数详解与最佳实践

3.1 注册中心配置(ZooKeeper)

修改bin/env/dolphinscheduler_env.sh文件,配置ZooKeeper集群连接信息:

# 注册中心类型(必填)
export REGISTRY_TYPE=zookeeper
# ZooKeeper集群地址(多个节点用逗号分隔)
export REGISTRY_ZOOKEEPER_CONNECT_STRING=zk-node1:2181,zk-node2:2181,zk-node3:2181
# ZooKeeper会话超时时间(默认30000ms)
export REGISTRY_ZOOKEEPER_SESSION_TIMEOUT=60000
# ZooKeeper连接超时时间(默认30000ms)
export REGISTRY_ZOOKEEPER_CONNECTION_TIMEOUT=30000

ZooKeeper在DolphinScheduler中的核心作用:

  • Master节点Leader选举(基于ZAB协议)
  • Worker节点注册与心跳检测
  • 任务队列分布式锁实现
  • 系统配置动态更新

3.2 Master集群配置

修改master-server/conf/application.yaml,关键高可用参数:

# Master服务端口(不同节点需唯一)
server:
  port: 5678

# 高可用配置
master:
  # 服务注册端口(默认6666)
  listen-port: 6666
  # 心跳间隔(单位:毫秒)
  heartbeat-interval: 10000
  # 容错次数(连续心跳失败次数)
  tolerate-failure-times: 3
  # 任务提交重试次数
  task-commit-retry-times: 3
  # 任务提交重试间隔(毫秒)
  task-commit-retry-interval: 1000
  # 选举间隔(毫秒)
  election-interval: 5000
  # 执行线程池大小(建议CPU核心数*2)
  executor-threads: 16
  # 状态线程池大小
  state-threads: 8

# 注册中心配置
registry:
  type: zookeeper
  zookeeper:
    connect-string: ${REGISTRY_ZOOKEEPER_CONNECT_STRING}
    session-timeout: ${REGISTRY_ZOOKEEPER_SESSION_TIMEOUT:60000}
    connection-timeout: ${REGISTRY_ZOOKEEPER_CONNECTION_TIMEOUT:30000}

3.3 Worker集群配置

修改worker-server/conf/application.yaml,实现Worker分组与负载均衡:

# Worker服务端口(不同节点需唯一)
server:
  port: 5679

# 高可用配置
worker:
  # 服务注册端口(默认1234)
  listen-port: 1234
  # 心跳间隔(毫秒)
  heartbeat-interval: 10000
  # 容错次数
  tolerate-failure-times: 3
  # 任务执行线程池大小(关键参数)
  executor-threads: 32
  # 任务拉取数量(每次)
  fetch-task-num: 32
  # 任务结果回调线程池大小
  callback-threads: 16
  # Worker分组(按业务域划分)
  group: etl_group
  # 最大缓存任务数
  max-cache-task-num: 100

# 注册中心配置(同Master)
registry:
  type: zookeeper
  zookeeper:
    connect-string: ${REGISTRY_ZOOKEEPER_CONNECT_STRING}

最佳实践:将Worker节点按业务类型分组(如etl_group、ml_group、report_group),在工作流定义中指定对应Worker组,实现资源隔离与任务优先级控制。

3.4 元数据库高可用配置(MySQL主从)

  1. 数据库初始化(主库执行):
# 创建数据库
CREATE DATABASE dolphinscheduler DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

# 创建用户并授权
CREATE USER 'dolphinscheduler'@'%' IDENTIFIED BY 'DolphinScheduler@123';
GRANT ALL PRIVILEGES ON dolphinscheduler.* TO 'dolphinscheduler'@'%';
FLUSH PRIVILEGES;
  1. 配置数据库连接池bin/env/dolphinscheduler_env.sh):
# 数据库类型
export DATABASE=mysql
# 主从数据库连接串(支持故障转移)
export SPRING_DATASOURCE_URL="jdbc:mysql://mysql-master:3306,dolphinscheduler:mysql-slave:3306/dolphinscheduler?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&failOverReadOnly=false&autoReconnect=true&maxReconnects=10"
# 数据库用户名
export SPRING_DATASOURCE_USERNAME=dolphinscheduler
# 数据库密码
export SPRING_DATASOURCE_PASSWORD=DolphinScheduler@123
# 连接池配置
export SPRING_DATASOURCE_HIKARI_MAXIMUM_POOL_SIZE=50
export SPRING_DATASOURCE_HIKARI_MINIMUM_IDLE=10
export SPRING_DATASOURCE_HIKARI_CONNECTION_TIMEOUT=30000

3.5 资源中心高可用配置(HDFS/S3)

HDFS高可用配置conf/common.properties):

# 资源存储类型
resource.storage.type=HDFS
# HDFS namenode地址(高可用集群)
resource.hdfs.fs.defaultFS=hdfs://nameservice1
# HDFS资源路径
resource.upload.path=/dolphinscheduler/resources
# HDFS配置文件路径
resource.hdfs.config.path=/etc/hadoop/conf
# 高可用模式(自动故障转移)
resource.hdfs.ha.enable=true
resource.hdfs.ha.nameservices=nameservice1
resource.hdfs.ha.namenode.rpc-address.nameservice1.nn1=nn1:8020
resource.hdfs.ha.namenode.rpc-address.nameservice1.nn2=nn2:8020

S3兼容存储配置(适用于云环境):

resource.storage.type=S3
resource.s3.endpoint=https://s3.cn-northwest-1.amazonaws.com.cn
resource.s3.access.key=AKIAXXXXXXXXXXXXXX
resource.s3.secret.key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
resource.s3.bucket.name=dolphinscheduler-resources
resource.s3.region=cn-northwest-1
resource.s3.path.style.access=true

四、集群部署与服务管理

4.1 集群配置分发

# 1. 下载二进制包(从GitCode镜像)
wget https://gitcode.com/gh_mirrors/do/dolphinscheduler/-/archive/dev/dolphinscheduler-dev.tar.gz
tar -zxf dolphinscheduler-dev.tar.gz
cd dolphinscheduler-dev

# 2. 配置免密登录(部署用户)
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
ssh-copy-id dolphinscheduler@master-node1
ssh-copy-id dolphinscheduler@master-node2
ssh-copy-id dolphinscheduler@master-node3
ssh-copy-id dolphinscheduler@worker-node1
ssh-copy-id dolphinscheduler@worker-node2
ssh-copy-id dolphinscheduler@worker-node3

# 3. 修改集群配置文件(conf/env/workers、conf/env/masters)
echo -e "master-node1\nmaster-node2\nmaster-node3" > conf/env/masters
echo -e "worker-node1:etl_group\nworker-node2:etl_group\nworker-node3:ml_group" > conf/env/workers

# 4. 初始化数据库
bash ./script/create-dolphinscheduler.sh

# 5. 分发安装包到所有节点
bash ./script/deploy.sh

4.2 服务启停命令

# 启动集群所有服务
bash ./bin/dolphinscheduler-daemon.sh start all

# 单独启动Master集群
bash ./bin/dolphinscheduler-daemon.sh start master-server

# 单独启动Worker集群
bash ./bin/dolphinscheduler-daemon.sh start worker-server

# 查看服务状态
bash ./bin/dolphinscheduler-daemon.sh status all

# 停止集群所有服务
bash ./bin/dolphinscheduler-daemon.sh stop all

五、高可用验证与故障注入测试

5.1 集群状态检查

# 1. 查看ZooKeeper节点注册情况
/opt/zookeeper/bin/zkCli.sh -server zk-node1:2181
ls /dolphinscheduler/nodes/master
ls /dolphinscheduler/nodes/worker

# 2. 查看Master Leader状态
grep "LeaderElector" /data/dolphinscheduler/master-server/logs/dolphinscheduler-master.log

5.2 故障注入测试用例

测试场景操作步骤预期结果恢复时间
Master Leader宕机kill -9 Master进程10秒内完成新Leader选举,任务调度无中断<30秒
Worker节点宕机关闭Worker服务器该节点任务自动转移到同组其他Worker<60秒
ZooKeeper单节点故障关闭一个ZK节点集群正常运行,无服务中断无感知
数据库主库故障停止主库MySQL服务自动切换到从库,业务无感知<10秒

5.3 监控告警配置(Prometheus + Grafana)

  1. 启用Metrics收集conf/common.properties):
# 启用Prometheus指标
metrics.enabled=true
metrics.prometheus.enabled=true
metrics.prometheus.port=12349
  1. Grafana监控面板导入

导入DolphinScheduler官方监控面板(ID: 13925),关键监控指标:

  • Master节点Leader状态
  • Worker节点存活数量
  • 任务执行成功率
  • 数据库连接池状态
  • Zookeeper连接数

六、常见问题与性能优化

6.1 高可用集群常见问题排查

问题1:Master选举失败

  • 排查ZooKeeper集群健康状态:echo stat | nc zk-node1 2181
  • 检查节点时间同步:ntpq -p(偏差需<100ms)
  • 查看选举日志:grep "Elector" master-server/logs/dolphinscheduler-master.log

问题2:Worker节点无法注册

  • 检查网络连通性:telnet zk-node1 2181
  • 验证Worker分组配置:cat conf/env/workers
  • 查看Worker日志:grep "RegisterWorker" worker-server/logs/dolphinscheduler-worker.log

6.2 性能优化参数

# Master优化(master-server/conf/application.yaml)
master:
  # 任务调度线程池大小(根据CPU核心数调整)
  executor-threads: 24
  # 历史命令清理线程池大小
  history-command-clean-threads: 8
  # 最大并行工作流实例数
  max-parallel-process-instances: 1000

# Worker优化(worker-server/conf/application.yaml)
worker:
  # 任务执行线程池大小(关键参数)
  executor-threads: 64
  # 任务拉取间隔(毫秒)
  fetch-task-interval: 100
  # 任务结果回调队列大小
  callback-queue-capacity: 10000

七、总结与最佳实践清单

通过本文配置,DolphinScheduler集群已具备金融级高可用能力,可支持日均10万+任务调度。生产环境建议额外实施:

  1. 定期备份:元数据库每日全量备份+binlog增量备份,资源中心数据定期快照
  2. 监控告警:配置Master/Worker节点存活、任务失败率、数据库主从延迟告警
  3. 容量规划:按"CPU核心数×2"配置Worker执行线程,每节点任务并发不超过CPU核心数
  4. 版本管理:使用蓝绿部署或金丝雀发布策略进行版本升级
  5. 文档沉淀:记录集群架构图、关键配置参数、故障处理手册

高可用配置清单(生产环境必选)

  •  ZooKeeper集群(3节点,最小配置)
  •  Master节点(≥3节点)
  •  Worker节点(≥3节点,按业务分组)
  •  数据库主从复制(MySQL/PostgreSQL)
  •  资源中心高可用(HDFS集群/S3)
  •  负载均衡(API Server前端)
  •  监控告警(Prometheus + Grafana)
  •  故障自动转移测试通过

随着业务增长,可进一步扩展为多区域部署(跨机房容灾),通过DolphinScheduler的跨集群任务协同能力,实现全局资源调度与灾备切换。

【免费下载链接】dolphinscheduler Apache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code 【免费下载链接】dolphinscheduler 项目地址: https://gitcode.com/gh_mirrors/do/dolphinscheduler

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值