实验目标 -DolphinScheduler 集群
实验准备
物理环境 (四台机器)
IP |
hostName |
软件 1 |
软件 2 |
192.168.8.88 |
node0 |
zookeeper 1 |
DolphinScheduler1 |
192.168.8.144 |
node1 |
zookeeper 2 |
DolphinScheduler2 |
192.168.8.145 |
node2 |
zookeeper 3 |
DolphinScheduler3 |
192.168.8.146 |
node3 |
zookeeper |
DolphinScheduler4 |
192.168.8.97 |
|
数据库 |
|
软件环境
- JDK:下载JDK (1.8+),安装并配置 JAVA_HOME 环境变量,并将其下的 bin 目录追加到 PATH 环境变量中。如果你的环境中已存在,可以跳过这步。
- 二进制包:在下载页面下载 DolphinScheduler 3.1.4 二进制包
- 数据库:PostgreSQL (8.2.15+) 或者 MySQL (5.7+),两者任选其一即可,如 MySQL 则需要 JDBC Driver 8.0.16
- 注册中心:ZooKeeper (3.8.3),下载地址
- 进程树分析
- macOS安装pstree
- Fedora/Red/Hat/CentOS/Ubuntu/Debian安装psmisc
DolphinScheduler概念
架构图解释

*** MasterServer ***
- DAG 任务切分、任务提交监控,并同时监听其它MasterServer和WorkerServer的健康状态
- MasterServer服务启动时向Zookeeper注册临时节点,通过监听Zookeeper临时节点变化来进行容错处理。 MasterServer基于netty提供监听服务
*** WorkerServer ***
- WorkerServer主要负责任务的执行和提供日志服务
- WorkerServer服务启动时向Zookeeper注册临时节点,并维持心跳
*** LoggerServer ***
是一个RPC服务,提供日志分片查看、刷新和下载等功能
*** ZooKeeper服务 ***
- ZooKeeper服务,系统中的MasterServer和WorkerServer节点都通过ZooKeeper来进行集群管理和容错
*** Task Queue ***
提供任务队列的操作,目前队列也是基于Zookeeper来实现。由于队列中存的信息较少,不必担心队列里数据过多的情况,实际上我们压测过百万级数据存队列,对系统稳定性和性能没影响
*** Alert ***
提供告警相关接口,接口主要包括告警两种类型的告警数据的存储、查询和通知功能
*** API ***
API接口层,主要负责处理前端UI层的请求
*** UI ***
系统的前端页面,提供系统的各种可视化操作界面
实验步骤
实验搭建DolphinScheduler集群
1. 配置用户免密及权限
| # 创建用户需使用 root 登录 |
| useradd dolphinscheduler |
| # 添加密码 |
| echo "dolphinscheduler" | passwd --stdin dolphinscheduler |
| # 配置 sudo 免密 |
| sed -i '$adolphinscheduler ALL=(ALL) NOPASSWD: NOPASSWD: ALL' /etc/sudoers |
| sed -i 's/Defaults requirett/#Defaults requirett/g' /etc/sudoers |
| # 修改目录权限,使得部署用户对二进制包解压后的 apache-dolphinscheduler-*-bin 目录有操作权限 |
| chown -R dolphinscheduler:dolphinscheduler /opt/dolphinscheduler/apache-dolphinscheduler-3.1.4-bin |
| |
| su dolphinscheduler |
| ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa |
| cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys |
| chmod 600 ~/.ssh/authorized_keys |
| |
| cd ~ #回到主界面 |
| ssh-keygen -t rsa -f ~/.ssh/id_rsa |
| |
| ssh-copy-id -i node0 |
| ssh-copy-id -i node1 |
| ssh-copy-id -i node2 |
| ssh-copy-id -i node3 |
| |
| cat /home/dolphinscheduler/.ssh/authorized_keys |
| |
| ssh node0 |
| ssh node1 |
| ssh node2 |
| ssh node3 |
2. Zookeeper 安装和使用
| mkdir -p /opt/zookeeper; #创建zookeeper目录 |
| mkdir -p /opt/zookeeper/data; #创建zookeeper数据存放目录 |
| mkdir -p /opt/zookeeper/log; #创建zookeeper日志存放目录 |
| tar -zxvf /usr/local/software/apache-zookeeper-3.8.3-bin.tar.gz -C /opt/zookeeper |
| cp /opt/zookeeper/apache-zookeeper-3.8.3-bin/conf/zoo_sample.cfg /opt/zookeeper/apache-zookeeper-3.8.3-bin/conf/zoo.cfg |
| |
| dataDir=/opt/zookeeper/data |
| dataLogDir=/opt/zookeeper/log |
| clientPort=2181 |
| server.0=192.168.8.88:2888:3888 |
| server.1=192.168.8.145:2888:3888 |
| server.2=192.168.8.146:2888:3888 |
| server.3=192.168.8.144:2888:3888 |
| |
| export ZK_HOME=/opt/zookeeper/apache-zookeeper-3.8.3-bin |
| export PATH=$PATH:$ZK_HOME/bin |
| |
3. 启动ZooKeeper服务器
| |
| # 启动查看对应模块的日志 如果页面报错看api-server 的日志 |
| cat /opt/dolphinscheduler/apache-dolphinscheduler-3.1.4-bin/master-server/logs/ master-server-localhost.localdomain.out |
| |
| |
| 启动ZooKeeper服务器 |
| bash |
| bin/zkServer.sh start |
| |
| 停止ZooKeeper服务器: |
| bash |
| bin/zkServer.sh stop |
| |
| 连接到ZooKeeper客户端: |
| bash |
| zkCli.sh -server 192.168.161.3:2181 |
| |
| 创建一个持久节点: |
| bash |
| create /path data |
| |
| 创建一个临时节点: |
| bash |
| create -e /path data |
| |
| 创建一个顺序节点: |
| bash |
| create -s /path data |
| |
| 列出节点内容: |
| bash |
| ls /path |
| |
| 获取节点数据: |
| bash |
| get /path |
| |
| 设置节点数据: |
| bash |
| set /path data |
| |
| 删除节点: |
| bash |
| delete /path |
| |
| 监视节点变化: |
| bash |
| get -w /path |
| |
| 查看帮助信息: |
| help |
| |
4. 创建数据库,添加数据库驱动
| |
| sudo wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.29.tar.gz |
| |
| sudo tar -zxvf mysql-connector-java-8.0.25.tar.gz |
| |
| cp mysql-connector-java-8.0.25.jar /opt/dolphinscheduler/apache-dolphinscheduler-3.1.4-bin/worker-server/libs |
| |
| cp mysql-connector-java-8.0.25.jar /opt/dolphinscheduler/apache-dolphinscheduler-3.1.4-bin/alert-server/libs |
| |
| cp mysql-connector-java-8.0.25.jar /opt/dolphinscheduler/apache-dolphinscheduler-3.1.4-bin/api-server/libs |
| |
| cp mysql-connector-java-8.0.25.jar /opt/dolphinscheduler/apache-dolphinscheduler-3.1.4-bin/worker-server/libs |
| |
5. 修改相关配置
| # 以下步骤在21,22,23,24上都需要完成 |
| # 以下步骤在21,22,23,24上都需要完成 |
| # 以下步骤在21,22,23,24上都需要完成 |
| # 以21为例 |
| |
| # 进入/data/tools |
| cd /data/tools |
| tar -zxvf apache-dolphinscheduler-3.1.4-bin.tar.gz -C /opt/dolphinscheduler |
| |
| # 创建总文件夹dolphinscheduler |
| mkdir dolphinscheduler |
| |
| # 进入dolphinscheduler |
| cd dolphinscheduler |
| |
| # 将20上的tar复制到21 |
| scp 10.192.168.20:/data/tools/dolphinscheduler/apache-dolphinscheduler-incubating-1.3.5-dolphinscheduler-bin.tar.gz /data/tools/dolphinscheduler/ |
| |
| # 解压 |
| tar -zxvf apache-dolphinscheduler-incubating-1.3.5-dolphinscheduler-bin.tar.gz |
| |
| |
| # 将20配置好的datasource.properties复制到21 |
| scp 10.192.168.20:/data/tools/dolphinscheduler/apache-dolphinscheduler-1.3.5/conf/ /datasource.properties /data/tools/dolphinscheduler/apache-dolphinscheduler-1.3.5/conf/ |
| |
| |
| # 将20配置好的install_config.conf复制到21 |
| scp 10.192.168.20:/data/tools/dolphinscheduler/apache-dolphinscheduler-1.3.5/conf/ /config/install_config.conf /data/tools/dolphinscheduler/apache-dolphinscheduler-1.3.5/conf/config |
| |
| |
| # 将20配置好的install_config.conf复制到21 |
| scp 10.192.168.20:/data/tools/dolphinscheduler/apache-dolphinscheduler-1.3.5/conf/ /env/dolphinscheduler_env.sh /data/tools/dolphinscheduler/apache-dolphinscheduler-1.3.5/conf/env |
| |
| # 创建installPath,一定要安装的用户有可读可写的权限 |
| mkdir install-ds-1.3.5 |
| |
| # 创建个当前版本的软链接,后续若有升级、降级操作,只需要改变当前版本软连即可,博主的独到秘籍 |
| ln -sf /data/tools/dolphinscheduler/install-ds-1.3.5 current |
| |
| # 以上步骤在21,22,23,24上都需要完成 |
| # 以上步骤在21,22,23,24上都需要完成 |
| # 以上步骤在21,22,23,24上都需要完成 |
| |
| # 然后任意选一台机器,这里就选20吧,进入/data/tools/dolphinscheduler/apache-dolphinscheduler-1.3.5/ |
| cd /data/tools/dolphinscheduler/apache-dolphinscheduler-1.3.5/ |
| |
| # 一键部署启动 |
| sh install.sh |
| |
| #注意: |
| # 第一次部署的话,在运行中第3步`3,stop server`出现5次以下信息,此信息可以忽略 |
| # sh: bin/dolphinscheduler-daemon.sh: No such file or directory |
| # 正确部署后,这个命令是可以将整个dolphinscheduler集群启动起来的 |
| # 正确部署后,这个命令是可以将整个dolphinscheduler集群启动起来的 |
| # 正确部署后,这个命令是可以将整个dolphinscheduler集群启动起来的 |
| |
6. 修改install_env.sh
| |
| |
| ips=${ips:-"192.168.8.88,192.168.8.144,192.168.8.145,192.168.8.146"} |
| |
| masters=${masters:-"192.168.8.88,192.168.8.144,192.168.8.145"} |
| |
| workers=${workers:-"192.168.8.88:default,192.168.8.144:default,192.168.8.145:default,192.168.8.146:default"} |
| |
| alertServer=${alertServer:-"192.168.8.146"} |
| |
| apiServers=${apiServers:-"192.168.8.146"} |
| |
| installPath=${installPath:-"/tmp/dolphinscheduler"} |
| |
| |
| deployUser=${deployUser:-"dolphin"} |
| |
| # 创建这个文件, 并赋予权限 /tmp/dolphinscheduler |
| mkdir -p /tmp/dolphinscheduler |
| chown -R dolphinscheduler:dolphinscheduler /opt/dolphinscheduler/apache-dolphinscheduler-3.1.4-bin |
| /opt/dolphinscheduler/apache-dolphinscheduler-3.1.4-bin/bin/env |
| |
| # 账号密码 dolphin |
| |
| |
7. 修改dolphinscheduler_env.sh
| |
| |
| export JAVA_HOME=/usr/java/jdk1.8.0_361 |
| |
| export DATABASE=${DATABASE:-mysql} |
| export SPRING_PROFILES_ACTIVE=${DATABASE} |
| export SPRING_DATASOURCE_URL="jdbc:mysql://192.168.8.97:3306/dolphinscheduler?useSSL=false&useUnicode=true&allowPublicKeyRetrieval=true&characterEncoding=UTF-8" |
| export SPRING_DATASOURCE_USERNAME=root |
| export SPRING_DATASOURCE_PASSWORD=123456 |
| |
| export REGISTRY_ZOOKEEPER_CONNECT_STRING=${REGISTRY_ZOOKEEPER_CONNECT_STRING:-192.168.8.144:2181}ZZ: |
| |
| |
| root |
| |
| # 账号密码 dolphin |
| |
8. 启动和停止服务
| # 查看服务 |
| jps |
| # 一键停止集群所有服务 |
| bash ./bin/stop-all.sh |
| # 一键开启集群所有服务 |
| bash ./bin/start-all.sh |
| # 启停 Master |
| bash ./bin/dolphinscheduler-daemon.sh stop master-server |
| bash ./bin/dolphinscheduler-daemon.sh start master-server |
| # 启停 Worker |
| bash ./bin/dolphinscheduler-daemon.sh start worker-server |
| bash ./bin/dolphinscheduler-daemon.sh stop worker-server |
| # 启停 Api |
| bash ./bin/dolphinscheduler-daemon.sh start api-server |
| bash ./bin/dolphinscheduler-daemon.sh stop api-server |
| # 启停 Alert |
| bash ./bin/dolphinscheduler-daemon.sh start alert-server |
| bash ./bin/dolphinscheduler-daemon.sh stop alert-server |
| |
| |
9. 登录 访问Web UI (admin dolphinscheduler123)
实验结果
- zookeeper 验证
spring boot 连接上微服务 能在服务器上 ls 到注册的服务
| <dependencies> |
| |
| <dependency> |
| <groupId>org.springframework.boot</groupId> |
| <artifactId>spring-boot-starter</artifactId> |
| </dependency> |
| |
| |
| <dependency> |
| <groupId>org.apache.zookeeper</groupId> |
| <artifactId>zookeeper</artifactId> |
| <version>3.7.0</version> |
| </dependency> |
| </dependencies> |
| |
| |
| import org.apache.zookeeper.*; |
| import org.springframework.boot.SpringApplication; |
| import org.springframework.boot.autoconfigure.SpringBootApplication; |
| |
| import java.io.IOException; |
| |
| @SpringBootApplication |
| public class ZookeeperRegistryApplication { |
| |
| private static final String ZOOKEEPER_CONNECTION_STRING = "localhost:2181"; |
| private static final int SESSION_TIMEOUT = 3000; |
| private static final String ZNODE_PATH = "/myApp"; |
| |
| public static void main(String[] args) { |
| SpringApplication.run(ZookeeperRegistryApplication.class, args); |
| |
| try { |
| ZooKeeper zooKeeper = new ZooKeeper(ZOOKEEPER_CONNECTION_STRING, SESSION_TIMEOUT, new Watcher() { |
| @Override |
| public void process(WatchedEvent event) { |
| |
| if (event.getState() == Watcher.Event.KeeperState.SyncConnected) { |
| System.out.println("Connected to ZooKeeper"); |
| } |
| } |
| }); |
| |
| |
| if (zooKeeper.exists(ZNODE_PATH, false) == null) { |
| zooKeeper.create(ZNODE_PATH, "data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); |
| } |
| |
| |
| String serviceNode = zooKeeper.create(ZNODE_PATH + "/service", "service-data".getBytes(), |
| ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); |
| |
| System.out.println("Service registered at: " + serviceNode); |
| |
| } catch (IOException | KeeperException | InterruptedException e) { |
| e.printStackTrace(); |
| } |
| } |
| } |
| |
| 2. dolpinSechduler 使用 |
| |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库