<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>DolphinScheduler | NullSpace</title><link>https://spacetimelab.cn/tag/dolphinscheduler/</link><atom:link href="https://spacetimelab.cn/tag/dolphinscheduler/index.xml" rel="self" type="application/rss+xml"/><description>DolphinScheduler</description><generator>Wowchemy (https://wowchemy.com)</generator><language>en-us</language><lastBuildDate>Wed, 25 Jun 2025 09:43:26 +0800</lastBuildDate><image><url>https://spacetimelab.cn/media/icon_hue03491371183284312b8b116a73ae5ab_79511_512x512_fill_lanczos_center_3.png</url><title>DolphinScheduler</title><link>https://spacetimelab.cn/tag/dolphinscheduler/</link></image><item><title>一次DolphinScheduler失败调度的排查</title><link>https://spacetimelab.cn/post/some-issue-about-dolphin-scheduler/</link><pubDate>Wed, 25 Jun 2025 09:43:26 +0800</pubDate><guid>https://spacetimelab.cn/post/some-issue-about-dolphin-scheduler/</guid><description>&lt;h2 id="问题现象">问题现象&lt;/h2>
&lt;p>DolphinScheduler任务调度执行大面积失败&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img src="./images/failure-status-in-ui.png" alt="" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;p>且无法重跑/&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img src="./images/failure-in-dispatch-or-rerun.png" alt="" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;h2 id="排查要点">排查要点&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>&lt;input checked="" disabled="" type="checkbox"> 伪集群形态部署，各容器运行状态、是否健康运行。&lt;/p>
&lt;p>&lt;code>docker-dolphinscheduler-*-1&lt;/code> 这组容器（api / master / worker / alert / postgresql / zookeeper 各自独立容器&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img src="./images/dolphin-cluster-status.png" alt="" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> 容器日志排查失败信息&lt;/li>
&lt;/ul>
&lt;h3 id="容器失败日志查看">容器失败日志查看&lt;/h3>
&lt;h4 id="worker">worker&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker logs docker-dolphinscheduler-worker-1 --since 24h &lt;span class="p">|&lt;/span> grep -iE &lt;span class="s2">&amp;#34;error|fail|exception&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>里面有错误：&lt;/p>
&lt;p>/tmp/dolphinscheduler/exec/process/default/146212983125760/158234529507105_2/25887/31016/25887_31016.sh: line 4: ssh: command not found&lt;/p>
&lt;h4 id="master">master&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">docker logs docker-dolphinscheduler-master-1 --since 24h &lt;span class="p">|&lt;/span> grep -iE &lt;span class="s2">&amp;#34;datasource|connection|fail&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="根因">根因&lt;/h2>
&lt;p>验证：(安装openssh-client)&lt;/p>
&lt;pre tabindex="0">&lt;code>docker exec -u 0 docker-dolphinscheduler-worker-1 bash -c &amp;#39;apt-get update &amp;amp;&amp;amp; apt-get install -y openssh-client&amp;#39;
&lt;/code>&lt;/pre>&lt;p>安装完成后alert可以正常工作。&lt;/p>
&lt;p>ssh仍然失败，但原因不再是command not found，而是**Host key verification failed.**相关错误，确认此前问题为手工在容器内安装ssh并配置相关认证信息，但由于未将环境依赖修改同步到镜像中，随着容器重建这些修改被丢失。&lt;/p>
&lt;p>总结问题因果链&lt;/p>
&lt;ol>
&lt;li>worker 容器镜像本来就不含 &lt;code>openssh-client&lt;/code>；&lt;/li>
&lt;li>但早某个时候，&lt;code>openssh-client&lt;/code> 被人手动装进了运行中的 worker 容器（装在容器的可写层里，不在镜像里）→ 那段时间用 &lt;code>ssh&lt;/code> 的任务正常；&lt;/li>
&lt;li>你改 &lt;code>daemon.json&lt;/code> 调日志配置 → 改 log-driver / log-opts 对&amp;quot;已存在的容器&amp;quot;不生效，必须重建容器才能应用；&lt;/li>
&lt;li>重建容器 = 从镜像重新拉起 → 可写层被丢弃 → 手动装的 &lt;code>openssh-client&lt;/code> 没了；&lt;/li>
&lt;li>于是：脚本里用 &lt;code>ssh&lt;/code> 的任务全部 &lt;code>command not found&lt;/code>（exit 127），不用 &lt;code>ssh&lt;/code> 的任务照常 → &amp;ldquo;大面积但非全部失败&amp;rdquo;。&lt;/li>
&lt;/ol>
&lt;h2 id="措施">措施&lt;/h2>
&lt;h3 id="临时方案兼容性让历史任务快速正常运行worker容器添加对target节点的信息提供公钥给target节点">临时方案（兼容性，让历史任务快速正常运行）：worker容器添加对target节点的信息，提供公钥给target节点&lt;/h3>
&lt;pre tabindex="0">&lt;code>#!/usr/bin/env bash
#
# ds_ssh_setup.sh — DolphinScheduler worker 容器 → 目标主机 无密 SSH 一键配置
#
# 背景：DS 的 Shell 任务以 `sudo -u default -i` 在 worker 容器内执行，
# 通过 `ssh &amp;lt;target&amp;gt;` 触发目标主机上的脚本。本脚本把“装客户端 / 生成密钥 /
# 写 known_hosts / 分发公钥 / 写别名 / 测试”整合成幂等流程。
#
# 运行位置：Docker 宿主机（即 docker compose 所在机器）。
#
# 用法：
# ./ds_ssh_setup.sh # 按下方 TARGETS 批量配置
# ./ds_ssh_setup.sh add --host IP [--port 22] [--user root] [--alias NAME] # 新增单台主机
# ./ds_ssh_setup.sh bake # 打印“烤进镜像”的 Dockerfile 片段
#
# 安全：脚本只做“新增/追加”，不删除任何文件或容器内容。公钥分发仅需目标机密码一次。
set -euo pipefail
WORKER_CONTAINER=&amp;#34;${WORKER_CONTAINER:-docker-dolphinscheduler-worker-1}&amp;#34;
DEFAULT_USER=&amp;#34;default&amp;#34;
# 内置目标列表（批量模式用）： HOST:PORT:USER:ALIAS
# 新增一台主机：直接往这里加一行，或改用 `./ds_ssh_setup.sh add ...`
TARGETS=(
# &amp;#34;192.168.1.10:22:root:node10&amp;#34;
# &amp;#34;db.example.com:2222:researcher:dbhost&amp;#34;
)
# ---- 容器内执行助手 ----
dexec() { docker exec -u &amp;#34;$DEFAULT_USER&amp;#34; &amp;#34;$WORKER_CONTAINER&amp;#34; bash -c &amp;#34;$1&amp;#34;; }
dexec_t() { docker exec -it -u &amp;#34;$DEFAULT_USER&amp;#34; &amp;#34;$WORKER_CONTAINER&amp;#34; bash -c &amp;#34;$1&amp;#34;; }
dexec_root(){ docker exec -u 0 &amp;#34;$WORKER_CONTAINER&amp;#34; bash -c &amp;#34;$1&amp;#34;; }
log(){ printf &amp;#39;\033[36m[ds-ssh]\033[0m %s\n&amp;#39; &amp;#34;$*&amp;#34;; }
warn(){ printf &amp;#39;\033[33m[WARN]\033[0m %s\n&amp;#39; &amp;#34;$*&amp;#34;; }
# 1) 容器内 openssh-client + psmisc
ensure_client(){
log &amp;#34;检查容器内 SSH 客户端 ...&amp;#34;
if dexec &amp;#39;command -v ssh &amp;gt;/dev/null 2&amp;gt;&amp;amp;1&amp;#39;; then
log &amp;#34;openssh-client 已存在&amp;#34;
else
log &amp;#34;安装 openssh-client ...&amp;#34;
dexec_root &amp;#39;apt-get update -qq &amp;amp;&amp;amp; apt-get install -y openssh-client&amp;#39;
fi
if dexec &amp;#39;command -v pstree &amp;gt;/dev/null 2&amp;gt;&amp;amp;1&amp;#39;; then
log &amp;#34;psmisc(pstree) 已存在&amp;#34;
else
log &amp;#34;安装 psmisc（让 DS 能正常 kill 进程树，避免 137 清理失败）...&amp;#34;
dexec_root &amp;#39;apt-get install -y psmisc&amp;#39;
fi
}
# 2) 生成 default 用户密钥（若缺失），确保属主为 default
ensure_key(){
log &amp;#34;确保 default 用户密钥 ...&amp;#34;
dexec &amp;#39;mkdir -p ~/.ssh &amp;amp;&amp;amp; chmod 700 ~/.ssh&amp;#39;
if dexec &amp;#39;test -f ~/.ssh/id_ed25519&amp;#39;; then
log &amp;#34;密钥已存在&amp;#34;
else
log &amp;#34;生成 ed25519 密钥（无口令）...&amp;#34;
dexec &amp;#39;ssh-keygen -t ed25519 -N &amp;#34;&amp;#34; -f ~/.ssh/id_ed25519&amp;#39;
# 用数字 ID，避免容器内 default 主组不叫 default 导致 chown 报错
dexec_root &amp;#39;chown -R &amp;#34;$(id -u default):$(id -g default)&amp;#34; /home/default/.ssh&amp;#39;
fi
}
# 3) known_hosts（防 MITM，避免首次连接交互卡住）
add_known_host(){
local host=&amp;#34;$1&amp;#34; port=&amp;#34;$2&amp;#34;
log &amp;#34;把 $host 加入 known_hosts ...&amp;#34;
dexec &amp;#34;ssh-keyscan -p $port -H $host &amp;gt;&amp;gt; ~/.ssh/known_hosts 2&amp;gt;/dev/null; sort -u ~/.ssh/known_hosts -o ~/.ssh/known_hosts&amp;#34;
}
# 4) 部署公钥到目标主机 authorized_keys
deploy_key(){
local host=&amp;#34;$1&amp;#34; port=&amp;#34;$2&amp;#34; user=&amp;#34;$3&amp;#34;
local pub
pub=&amp;#34;$(dexec &amp;#39;cat ~/.ssh/id_ed25519.pub&amp;#39;)&amp;#34;
if dexec &amp;#34;ssh -o BatchMode=yes -p $port $user@$host &amp;#39;true&amp;#39; 2&amp;gt;/dev/null&amp;#34;; then
log &amp;#34;$user@$host 已免密，跳过&amp;#34;
return 0
fi
log &amp;#34;部署公钥到 $user@$host ...&amp;#34;
# 需要目标机密码：优先用 ssh-copy-id（需交互 TTY）；非交互环境则回退到手动命令
if [ -t 0 ] &amp;amp;&amp;amp; dexec &amp;#39;command -v ssh-copy-id &amp;gt;/dev/null 2&amp;gt;&amp;amp;1&amp;#39;; then
log &amp;#34;（需要该主机 $user 的密码，仅此一次）&amp;#34;
dexec_t &amp;#34;ssh-copy-id -p $port -o StrictHostKeyChecking=accept-new $user@$host&amp;#34;
else
warn &amp;#34;非交互环境或容器内无 ssh-copy-id，请手动在目标主机 $user@$host 执行：&amp;#34;
echo &amp;#34; mkdir -p ~/.ssh &amp;amp;&amp;amp; chmod 700 ~/.ssh&amp;#34;
echo &amp;#34; echo &amp;#39;$pub&amp;#39; &amp;gt;&amp;gt; ~/.ssh/ authorized_keys &amp;amp;&amp;amp; chmod 600 ~/.ssh/authorized_keys&amp;#34;
fi
}
# 5) 写 SSH config 别名（DS 任务可直接 ssh &amp;lt;alias&amp;gt;）
write_config(){
local alias=&amp;#34;$1&amp;#34; host=&amp;#34;$2&amp;#34; port=&amp;#34;$3&amp;#34; user=&amp;#34;$4&amp;#34;
local cfg=&amp;#34;Host $alias\n HostName $host\n Port $port\n User $user\n IdentityFile ~/.ssh/id_ed25519\n StrictHostKeyChecking yes\n&amp;#34;
dexec &amp;#34;printf &amp;#39;$cfg&amp;#39; &amp;gt;&amp;gt; ~/.ssh/config; chmod 600 ~/.ssh/config&amp;#34;
log &amp;#34;已写入 SSH 别名：$alias -&amp;gt; $user@$host:$port&amp;#34;
}
# 6) 连通性测试
test_conn(){
local alias=&amp;#34;$1&amp;#34; user=&amp;#34;$2&amp;#34; host=&amp;#34;$3&amp;#34; port=&amp;#34;$4&amp;#34;
if dexec &amp;#34;ssh -o BatchMode=yes -p $port $user@$host &amp;#39;echo CONNECTED-\$(whoami)@\$(hostname)&amp;#39; 2&amp;gt;/dev/null&amp;#34;; then
log &amp;#34;OK $alias 连通成功&amp;#34;
else
warn &amp;#34;FAIL $alias 仍无法免密，请检查目标 authorized_keys / 防火墙 / 端口&amp;#34;
fi
}
setup_one(){
local host=&amp;#34;$1&amp;#34; port=&amp;#34;${2:-22}&amp;#34; user=&amp;#34;${3:-root}&amp;#34; alias=&amp;#34;${4:-$host}&amp;#34;
add_known_host &amp;#34;$host&amp;#34; &amp;#34;$port&amp;#34;
deploy_key &amp;#34;$host&amp;#34; &amp;#34;$port&amp;#34; &amp;#34;$user&amp;#34;
write_config &amp;#34;$alias&amp;#34; &amp;#34;$host&amp;#34; &amp;#34;$port&amp;#34; &amp;#34;$user&amp;#34;
test_conn &amp;#34;$alias&amp;#34; &amp;#34;$user&amp;#34; &amp;#34;$host&amp;#34; &amp;#34;$port&amp;#34;
}
bake(){
cat &amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;
# 把以下内容并入 worker 自定义 Dockerfile（基于官方镜像），避免重建容器后丢失：
# ---------------------------------------------------------------
# FROM apache/dolphinscheduler-worker-server:3.4.2
# USER root
# RUN apt-get update \
# &amp;amp;&amp;amp; apt-get install -y --no-install-recommends openssh-client psmisc \
# &amp;amp;&amp;amp; mkdir -p /home/default/.ssh \
# &amp;amp;&amp;amp; ssh-keygen -t ed25519 -N &amp;#39;&amp;#39; -f /home/default/.ssh/id_ed25519 \
# &amp;amp;&amp;amp; chown -R &amp;#34;$(id -u default):$(id -g default)&amp;#34; /home/default/.ssh \
# &amp;amp;&amp;amp; chmod 700 /home/default/.ssh
# USER default
# ---------------------------------------------------------------
# 注意：密钥会打进镜像，属敏感信息；生产环境建议改用 secret / 挂载卷，或在镜像外分发。
EOF
}
main(){
[ -z &amp;#34;$(command -v docker)&amp;#34; ] &amp;amp;&amp;amp; { echo &amp;#34;未找到 docker，请在 Docker 宿主机运行&amp;#34;; exit 1; }
case &amp;#34;${1:-}&amp;#34; in
bake)
bake; exit 0 ;;
esac
ensure_client
ensure_key
if [ &amp;#34;$#&amp;#34; -ge 1 ] &amp;amp;&amp;amp; [ &amp;#34;$1&amp;#34; = &amp;#34;add&amp;#34; ]; then
shift
local_host=&amp;#34;&amp;#34; local_port=&amp;#34;22&amp;#34; local_user=&amp;#34;root&amp;#34; local_alias=&amp;#34;&amp;#34;
while [ &amp;#34;$#&amp;#34; -gt 0 ]; do
case &amp;#34;$1&amp;#34; in
--host|-h) local_host=&amp;#34;$2&amp;#34;; shift 2 ;;
--port|-p) local_port=&amp;#34;$2&amp;#34;; shift 2 ;;
--user|-u) local_user=&amp;#34;$2&amp;#34;; shift 2 ;;
--alias|-a) local_alias=&amp;#34;$2&amp;#34;; shift 2 ;;
*) echo &amp;#34;未知参数: $1（用法: add --host HOST [--port 22] [--user root] [--alias NAME]）&amp;#34;; exit 2 ;;
esac
done
[ -z &amp;#34;$local_host&amp;#34; ] &amp;amp;&amp;amp; { echo &amp;#34;用法: add --host HOST [--port 22] [--user root] [--alias NAME]&amp;#34;; exit 2; }
[[ &amp;#34;$local_port&amp;#34; =~ ^[0-9]+$ ]] || { echo &amp;#34;端口必须是数字: $local_port&amp;#34;; exit 2; }
setup_one &amp;#34;$local_host&amp;#34; &amp;#34;$local_port&amp;#34; &amp;#34;$local_user&amp;#34; &amp;#34;${local_alias:-$local_host}&amp;#34;
elif [ &amp;#34;$#&amp;#34; -ge 1 ]; then
echo &amp;#34;未知参数：$*&amp;#34;; exit 2
else
if [ &amp;#34;${#TARGETS[@]}&amp;#34; -eq 0 ]; then
warn &amp;#34;TARGETS 为空：请用 add 子命令，或编辑脚本里的 TARGETS 数组&amp;#34;
exit 0
fi
for t in &amp;#34;${TARGETS[@]}&amp;#34;; do
IFS=: read -r h p u a &amp;lt;&amp;lt;&amp;lt; &amp;#34;$t&amp;#34;
setup_one &amp;#34;$h&amp;#34; &amp;#34;$p&amp;#34; &amp;#34;$u&amp;#34; &amp;#34;$a&amp;#34;
done
fi
echo
echo &amp;#34;============================================================&amp;#34;
echo &amp;#34;⚠️ 容器是临时层：openssh-client / psmisc / 密钥 仅存在于运行容器，&amp;#34;
echo &amp;#34; docker compose 重建后会丢失。请用上面 bake 子命令烤进镜像，&amp;#34;
echo &amp;#34; 或把 /home/default/.ssh 挂成卷持久化。&amp;#34;
}
main &amp;#34;$@&amp;#34;
&lt;/code>&lt;/pre>&lt;p>&lt;a href="./ds_ssh_setup_guide.md">使用方法&lt;/a>：&lt;/p>
&lt;p>&lt;strong>新增单台主机&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">bash ds_ssh_setup.sh add --host 10.0.0.5 --user user --port &lt;span class="m">22&lt;/span> --alias node5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>批量修改&lt;/strong>&lt;/p>
&lt;p>编辑脚本顶部的 &lt;code>TARGETS&lt;/code> 数组，每行格式 &lt;code>HOST:PORT:USER:ALIAS&lt;/code>，然后直接运行：&lt;/p>
&lt;pre tabindex="0">&lt;code>bash ds_ssh_setup.sh
&lt;/code>&lt;/pre>&lt;h3 id="长期优化">长期优化&lt;/h3>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> 在目标机器上部署新worker（注册zookeeper）执行任务而非通过ssh调度&lt;/li>
&lt;/ul>
&lt;h2 id="附录说明">附录说明&lt;/h2>
&lt;h3 id="dolphinscheduler伪集群模式组件明细">dolphinscheduler伪集群模式组件明细&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">组件&lt;/th>
&lt;th style="text-align:left">进程/服务&lt;/th>
&lt;th style="text-align:left">伪集群实例数&lt;/th>
&lt;th style="text-align:left">默认端口&lt;/th>
&lt;th style="text-align:left">关键职责&lt;/th>
&lt;th style="text-align:left">依赖&lt;/th>
&lt;th style="text-align:left">该组件挂掉的故障影响&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>ApiServer&lt;/strong>&lt;/td>
&lt;td style="text-align:left">api-server&lt;/td>
&lt;td style="text-align:left">1（可多开做负载）&lt;/td>
&lt;td style="text-align:left">12345&lt;/td>
&lt;td style="text-align:left">提供 UI/外部 REST API；工作流 CRUD、调度管理、权限、登录&lt;/td>
&lt;td style="text-align:left">元数据库&lt;/td>
&lt;td style="text-align:left">无法在页面操作/提交，但&lt;strong>已在跑的任务不受影响&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>MasterServer&lt;/strong>&lt;/td>
&lt;td style="text-align:left">master-server&lt;/td>
&lt;td style="text-align:left">≥1（伪集群常 1，可多）&lt;/td>
&lt;td style="text-align:left">5678&lt;/td>
&lt;td style="text-align:left">DAG 切分、任务派发、容错重试、补数；通过 ZK 选主，仅 leader 干活&lt;/td>
&lt;td style="text-align:left">ZK + DB&lt;/td>
&lt;td style="text-align:left">新任务无法调度；运行中任务由 Worker 续跑，但 failover 无人接管&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>WorkerServer&lt;/strong>&lt;/td>
&lt;td style="text-align:left">worker-server&lt;/td>
&lt;td style="text-align:left">≥1（伪集群常 1，可多分组）&lt;/td>
&lt;td style="text-align:left">1234&lt;/td>
&lt;td style="text-align:left">接收并执行具体任务（Shell/SQL/Spark…），回报状态与日志&lt;/td>
&lt;td style="text-align:left">ZK + DB&lt;/td>
&lt;td style="text-align:left">该 Worker 上的任务中断；Master 经 ZK 感知后 failover 到其他 Worker&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>AlertServer&lt;/strong>&lt;/td>
&lt;td style="text-align:left">alert-server&lt;/td>
&lt;td style="text-align:left">1&lt;/td>
&lt;td style="text-align:left">50053&lt;/td>
&lt;td style="text-align:left">按告警规则发通知（邮件/钉钉/Webhook）&lt;/td>
&lt;td style="text-align:left">DB&lt;/td>
&lt;td style="text-align:left">告警发不出去，但&lt;strong>调度与任务执行不受影响&lt;/strong>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>ZooKeeper&lt;/strong>&lt;/td>
&lt;td style="text-align:left">zk 单节点&lt;/td>
&lt;td style="text-align:left">1&lt;/td>
&lt;td style="text-align:left">2181&lt;/td>
&lt;td style="text-align:left">服务注册发现、心跳、Master 选主、任务队列&lt;/td>
&lt;td style="text-align:left">无&lt;/td>
&lt;td style="text-align:left">全集群失联：Master/Worker 无法协调，调度瘫痪&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>元数据库 (Postgres/MySQL)&lt;/strong>&lt;/td>
&lt;td style="text-align:left">单库&lt;/td>
&lt;td style="text-align:left">1&lt;/td>
&lt;td style="text-align:left">5432&lt;/td>
&lt;td style="text-align:left">存所有定义/实例/历史/用户&lt;/td>
&lt;td style="text-align:left">无&lt;/td>
&lt;td style="text-align:left">&lt;strong>全集群瘫痪&lt;/strong>：各组件起不来或任务全失败（即你遇到的根因）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;strong>StandaloneServer&lt;/strong>（对照）&lt;/td>
&lt;td style="text-align:left">单进程&lt;/td>
&lt;td style="text-align:left">1&lt;/td>
&lt;td style="text-align:left">12345&lt;/td>
&lt;td style="text-align:left">把上述全部揉进一个进程&lt;/td>
&lt;td style="text-align:left">内嵌&lt;/td>
&lt;td style="text-align:left">一停全停，不用于生产&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;ol>
&lt;li>&lt;strong>UI → ApiServer&lt;/strong>：用户提交/触发工作流 → ApiServer 把实例写入&lt;strong>元数据库&lt;/strong>；&lt;/li>
&lt;li>&lt;strong>Master 经 ZK 感知&lt;/strong>调度事件 → 从 DB 读实例、把 DAG 拆任务、按依赖 RPC 派给 &lt;strong>Worker&lt;/strong>；&lt;/li>
&lt;li>&lt;strong>Worker 执行&lt;/strong>任务、写日志、把状态回报 Master 并落 &lt;strong>DB&lt;/strong>；&lt;/li>
&lt;li>失败 → &lt;strong>AlertServer&lt;/strong> 读 DB 告警规则发通知；Worker 挂 → &lt;strong>Master&lt;/strong> 经 &lt;strong>ZK&lt;/strong> 感知后 failover。&lt;/li>
&lt;/ol>
&lt;h3 id="配置文件">配置文件&lt;/h3>
&lt;p>dolphinscheduler 3.2.2&lt;/p>
&lt;p>application-master.yaml&lt;/p>
&lt;pre tabindex="0">&lt;code>master:
exec-threads: 50 # 流程实例并发降一半
pre-exec-threads: 5
dispatch-task-number: 1 # 每次只派 1 个任务，降低瞬时压力
server-load-protection:
enabled: true
max-system-cpu-usage-percentage-thresholds: 0.85 # 临时放宽到 85%
max-system-memory-usage-percentage-thresholds: 0.85
&lt;/code>&lt;/pre></description></item></channel></rss>