尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Apache Mesos Agent Recovery:mesos-agent 崩溃或升级后如何恢复 Task 与 Executor
云原生【免费下载链接】mesosApache Mesos项目地址https://gitcode.com/gh_mirrors/mesos2/mesos点击查看免费下载Mesos agentmesos-agent早期版本称 slave是运行在每台从节点上、直接管理 executor 与 task 进程的组件。agent 进程退出升级、bug 崩溃等并不会立即杀死其托管的 executor/task但是否能无损恢复取决于框架是否启用了 checkpointing以及 agent 的四个恢复相关配置。本文基于仓库中的 docs/agent-recovery.md 展开并结合 src/slave/state.cpp、src/slave/slave.cpp 等源码讲清 agent 状态 checkpoint 的磁盘布局、恢复流程、strict/reconfiguration_policy/recover/recovery_timeout四个配置参数的行为边界以及 master 侧 75 秒重注册窗口与 systemd 进程生命周期这两个工程实操要点。1. 背景agent 退出后executor 为什么会继续运行当某台主机上的mesos-agent进程退出——无论是 Mesos 自身 bug 导致崩溃还是运维人员 升级 Mesos 时主动 kill 掉进程——此前由该 agent 托管的 executor 与 task会继续运行。这是因为启用 cgroups 隔离后容器的进程生命周期与 agent 进程是解耦的agent 只是管理者并不持有对 executor 的进程父子关系。Mesos 对此的默认语义是默认期望所有由旧 agent 托管的 executor/task 应当自行优雅退出兜底行为如果 agent 重启后这些 executor/task 仍然存活且无法恢复它们会被 shutdown。要让 executor 在 agent 重启后接着跑框架在注册时需要开启checkpointingFrameworkInfo中的checkpoint标志。此时 executor 会重新连接到新启动的mesos-agent进程并继续运行从而实现对 agent 升级与意外崩溃的零停机容忍。需要特别注意文档明确指出的两个边界条件在 agent 停机与重启之间自行退出的 executor 和 task不会在恢复过程中被自动重启若没有任何框架启用 checkpointingagent 死亡时其上的 executor 与 task 一并死亡且不会被恢复——agent 只是以新 agent 身份重新注册。2. 恢复原理把 agent 状态 checkpoint 到本地磁盘agent recovery 的核心机制是agent 将自身状态与它所管理的 task、executor 信息持续 checkpoint 到本地磁盘包括SlaveInfo消息agent 自身的 id、hostname、port、resources、attributesFrameworkInfo消息各框架的注册信息ExecutorInfo消息各 executor 的注册信息运行中 task 的未被确认unacknowledged的 status updates——这是 agent 重启后能继续向 framework 补发状态的关键。2.1 checkpoint 的磁盘布局从 src/slave/paths.cpp 中定义的文件名与目录常量可以看到所有 checkpoint 元数据都位于--work_dirmeta/子目录之下按slaveId → frameworkId → executorId → containerId的层级组织文件/目录内容路径构造boot_id主机启动标识用于检测系统是否重启过meta/boot_idslave.infoSlaveInfometa/slaves/slave_id/slave.infoframework.info/framework.pidFrameworkInfo与 framework PIDmeta/slaves/slave_id/frameworks/framework_id/executor.infoExecutorInfo.../executors/executor_id/executor.infotask.info/task.updatestask 信息与未确认的 status updates.../runs/container_id/tasks/task_id/resources.info等agent 资源状态meta/resources/对应的内存结构在 src/slave/state.hpp 中按TaskState → RunState → ExecutorState → FrameworkState → SlaveState → State的依赖顺序定义TaskState保存TaskID、Task、未确认的updates向量以及已 ack 的 UUID 集合acksFrameworkState则保存FrameworkInfo与其下的ExecutorState映射。这正是文档所说checkpointSlaveInfo、FrameworkInfo、ExecutorInfo与未确认 status updates的源码对应物。2.2 原子写入临时文件 rename所有 checkpoint 都通过 src/slave/state.hpp 中的模板函数state::checkpointT()完成其语义值得注意先在目标目录下用os::mktemp创建临时文件base/XXXXXX刻意放在同一目录下避免 rename 跨设备失败见源码中的 MESOS-2319 注释将 protobuf 消息如SlaveInfo序列化写入临时文件用os::rename原子地把临时文件移动到目标路径。这样就获得了all-or-nothing 语义任何时刻读到 checkpoint 文件的要么是旧版本、要么是新版本不会出现半写状态。sync参数默认为false进一步控制是否执行fsync源码 TODO 中提到正在评估默认开启同步的性能影响——这解释了为何文档说启用 checkpointing 会带来每个运行 task 的 agent 上的 I/O 开销。2.3 重启恢复流程agent 启动时恢复入口是 src/slave/state.cpp 中的state::recover(rootDir, strict)它按树状结构自底向上逐层读取并重建State。恢复的关键步骤检测主机是否重启过读取meta/boot_id若与当前系统的 boot id 不同则标记state.rebooted truesrc/slave/state.cpp。reboot 标志会级联传递到各层recover()函数——例如RunState::recover在检测到 reboot 后会丢弃checkpointed 的 forked pid 与 libprocess pid因为这些 PID 在重启后已经失效src/slave/state.cpp。兼容配置校验agent 校验当前配置来自环境变量与命令行 flag是否与 checkpoint 的信息兼容不兼容则拒绝启动下一节展开。恢复 slave ID 并重连agent 尝试恢复原来的 agent id 继续注册文档描述的特殊情形是——若检测到主机重启过且恢复旧 ID失败agent 会抹掉上一次运行留下的信息以一个全新 agent 的身份注册到 master。向存活的 executor 发送 reconnect 请求恢复成功后Slave::recoversrc/slave/slave.cpp若recoverreconnectagent 会遍历 checkpoint 中记录的每个存活 executor向其端口发送 reconnect 消息让 executor及 task与新 agent 重建联系源码还实现了 reconnect 请求的可选重试机制用于应对 netfilter 丢包导致单条消息丢失的场景src/slave/slave.cpp。3. Framework 配置checkpoint标志框架通过在向 master 注册时设置FrameworkInfo的checkpoint字段控制其 executor 是否可被恢复启用该特性会导致每个运行该框架 task 的 agent 产生额外的 I/O 开销即上一节描述的 checkpoint 写盘默认情况下框架不启用 checkpointing——这也是为什么 agent 重启行为需要框架侧配合未启用 checkpoint 的框架其 executor 无法重连。因此让 task 容忍 agent 升级/崩溃是框架声明checkpoint agent 配置recoverreconnect 进程守护自动拉起 agent三者共同作用的结果。4. Agent 配置四个控制恢复行为的 Flagdocs/agent-recovery.md 指出四个配置 flag 控制 agent 的恢复行为其默认值与校验逻辑均定义在 src/slave/flags.cpp字段声明在 src/slave/flags.hpp。4.1strict默认true恢复错误是否致命stricttrue任何恢复错误都视为致命agent 拒绝启动strictfalse恢复过程中的预期错误例如 checkpoint 数据损坏或 agent 恰好在 executor 注册前一瞬间死亡导致状态缺失被忽略尽最大可能恢复状态。对应到实现state::recover(rootDir, strict)的每个节点结构都累计errors计数src/slave/state.hpp 的注释说明strict 模式下错误即短路返回非 strict 模式下继续恢复并累加State.errors总数。生产环境中若 checkpoint 数据损坏可临时以strictfalse拉起 agent 保住存活 task但需留意源码注释提醒非严格恢复可能留下需要手工清理的孤儿 executor。4.2reconfiguration_policy默认equal重启时接受什么配置变化agent 重启时其SlaveInfohostname、port、resources、attributes 等可能与 checkpoint 记录不一致。此 flag 决定校验口径equal不允许任何配置变化新旧SlaveInfo必须完全一致additive允许新配置是旧配置的超集。additive的具体判定规则完整列在 src/slave/compatibility.hpp 的注释表格中字段约束hostname必须精确一致port必须精确一致domain精确一致或允许从未配置变为已配置resources原有资源必须保留且类型不变SCALAR 新值不小于旧值RANGE 新值须包含旧区间SET 新值须为旧值超集允许新增资源存在 reservation 时按 role 分别适用规则attributes原有属性必须保留且类型不变SCALAR 新值不小于旧值RANGE 包含旧区间TEXT 必须精确一致允许新增属性分派逻辑在 src/slave/slave.cpp 的Slave::compatible()equal走compatibility::equaladditive走compatibility::additive。flag 帮助文本还提醒一点该检查只发生在 agent 侧master 侧可能仍然拒绝它认为不可接受的变更例如 hostname 或 port 变化。典型应用场景给节点增加内存/CPU 资源、新增 attribute 后重启 agent 以让新配置生效而不触发以新 agent 身份重新注册。4.3recover默认reconnect重连还是清理reconnect与所有旧存活 executor 重连前提是其 framework 启用了 checkpointing恢复成功后 agent 向各 executor 发送 reconnect 消息见 2.3 节。cleanupkill 掉所有旧存活 executor 并退出。文档明确建议做不兼容的 agent 或 executor 升级时使用此选项——此时新旧版本协议可能不兼容强行重连反而危险。启动时会对该 flag 做取值校验src/slave/slave.cpp只接受reconnect或cleanup。另有一个重要的 NOTE若磁盘上不存在 checkpoint 信息则不执行任何恢复agent 直接以新 agent 身份注册——这覆盖了首次启动与checkpoint 已被清理两种场景。4.4recovery_timeout默认 15 分钟给恢复留多少时间默认值定义在 src/slave/constants.hppRECOVERY_TIMEOUT Minutes(15)。flag 帮助文本src/slave/flags.cpp给出了关键行为与调参原则若 agent 恢复耗时超过recovery_timeout正在等待重连的 executor 会自我终止——agent 会在拉起 executor 的环境变量中注入MESOS_RECOVERY_TIMEOUTsrc/slave/slave.cpp由 executor 端自行倒计时对非分区感知non-partition-aware的框架建议把该值设置得接近 master 侧的agent_reregister_timeout对分区感知partition-aware的框架建议设置得高于框架放弃 task 的超时否则 executor 可能在 task 本可成功重连回 framework 之前就已自我终止。5. Master 侧的重注册超时75 秒窗口恢复流程有一个硬约束重启后的 agent 必须在超时窗口内默认75 秒重新向 master 注册。这个 75 秒由 master 的两个 flag 相乘得到默认值定义在 src/master/constants.hppDEFAULT_AGENT_PING_TIMEOUT Seconds(15) // agent_ping_timeout DEFAULT_MAX_AGENT_PING_TIMEOUTS 5 // max_agent_ping_timeouts若 agent 超过该窗口仍未重注册master 会将 agent 标记为不可达并 shutdown 它其上的存活 executor/task 随之全部被终止。这意味着agent 的恢复流程读盘、兼容校验、重连必须明显快于 75 秒——对普通规模节点而言通常足够但recovery_timeout15min与 75 秒窗口并不矛盾前者约束 executor 侧等待后者约束 agent 侧注册相关 flagagent_ping_timeout、max_agent_ping_timeouts的完整说明见 docs/configuration.md因此文档强烈建议用进程守护工具自动化 agent 的拉起例如 monit 或systemd——agent 崩溃后必须尽快被重启否则 75 秒窗口一过存活 executor 也会被 master 强制杀掉。6. 已知问题systemd 与进程生命周期使用systemd托管mesos-agent时存在一个已知问题默认情况下 systemd 停止 agent 时可能连带杀掉其子孙进程或者相反地无法正确界定哪些进程属于 agent。该问题MESOS-3425在 Mesos0.25.0中针对启用 cgroups 隔离的 mesos containerizer 修复posix isolators 与 docker containerizer 的后续修复分别落在0.25.1、0.26.1、0.27.1和0.28.0。对使用当前仓库版本1.x 系列agent 化命名的用户而言这些修复均已包含。文档给出的运维建议是使用 systemd 的默认KillMode即control-group停止 agent 时杀掉控制组内所有子进程。这保证了fetcher、perf等side-car进程与 agent 同生共死Mesos 的 systemd 补丁会把executor 及其子进程移到独立的 systemd slice中使其生命周期与 agent 解耦——这正是agent 重启后 executor 仍然存活、可以重连得以成立的前提。如需在 unit 文件中显式指定[Service] ExecStart/usr/bin/mesos-agent KillModecontrol-cgroup7. 小结恢复行为决策表把文档与源码信息合并agent 重启时的行为可由一张决策表概括场景行为磁盘无 checkpoint 信息不执行恢复agent 以新 agent 身份注册checkpoint 存在新配置不兼容reconfiguration_policyequal时任何变更均不兼容拒绝启动recovercleanupkill 所有旧存活 executor 后退出用于不兼容升级recoverreconnect且框架checkpointtrueexecutor 重连新 agenttask 无中断recoverreconnect但框架未启用 checkpoint旧 executor 无法重连恢复后被关闭恢复超过recovery_timeout等待重连的 executor 自我终止75 秒内未向 master 重注册master 标记 agent 不可达并 shutdown 其上 executor/task主机重启boot_id 变化且无法恢复旧 agent ID抹除上次运行信息以新 agent 身份注册配套源码参考配置 flag 定义见 src/slave/flags.cpp状态树与原子 checkpoint 见 src/slave/state.hpp磁盘路径布局见 src/slave/paths.cpp恢复与重连主流程见 src/slave/slave.cpp兼容性判定见 src/slave/compatibility.hpp。行为验证方面仓库在 src/tests/slave_recovery_tests.cpp 与 src/tests/slave_compatibility_tests.cpp 中提供了对恢复流程与--reconfiguration_policy各取值的完整测试覆盖。赞分享云原生【免费下载链接】mesosApache Mesos项目地址https://gitcode.com/gh_mirrors/mesos2/mesos点击查看免费下载相关推荐agno Agent 崩溃后如何靠 checkpointtool-batch 从最后一个检查点恢复 runagno Agent 崩溃后如何靠 checkpointtool batch 从最后一个检查点恢复 run 长时间跑的 Agent run多次调用工具人工智能大模型AI AgentAgent 框架多智能体工具调用RAGAgent 工作流Agent 记忆BullshitGenerator故障恢复机制服务崩溃后如何恢复BullshitGenerator故障恢复机制服务崩溃后如何恢复 你是否遇到过生成文章过程中工具突然崩溃的情况是否担心辛苦配置的参数和生成进度付诸东流本文开发工具测试快速上手KVzap-linear-Qwen3-8B基于Hugging Face Transformers的5分钟部署指南快速上手KVzap linear Qwen3 8B基于Hugging Face Transformers的5分钟部署指南 KVzap linear Qwen3上一篇《Hutool的安装与使用教程》下一篇解决Taipy GUI表格显示异常从数据加载到渲染的全流程方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

NCCL 参数访问 API 完全指南:Handle 绑定与 Key 直查两种运行时参数读取方式

NCCL 参数访问 API 完全指南:Handle 绑定与 Key 直查两种运行时参数读取方式

高性能计算通信深度学习分布式训练 【免费下载链接】nccl Optimized primitives for collective multi-GPU communication 项目地址: https://gitcode.com/gh_mirrors/nc/nccl 点击查看 免费下载 NCCL(NVIDIA Collective Communications Library&#x…

📅 2026/10/13 1:51:42
Vorssaint:免费开源的 macOS 菜单栏工具箱,77 个小工具收进一个图标

Vorssaint:免费开源的 macOS 菜单栏工具箱,77 个小工具收进一个图标

Vorssaint:免费开源的 macOS 菜单栏工具箱,77 个小工具收进一个图标 【免费下载链接】vorssaint-utils Free and open-source macOS menu bar toolkit. 项目地址: https://gitcode.com/GitHub_Trending/vo/vorssaint-utils 逐应用音量、系统监控、剪贴板历史,这些功能在…

📅 2026/10/13 1:51:42
双轨制分销系统实战:PHP+Vue轻量级直销业务验证包

双轨制分销系统实战:PHP+Vue轻量级直销业务验证包

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/13 1:46:42
MORE NEWS

更多资讯

📰

Qt Core 模块深度解析:元对象系统、事件循环与多线程实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

FMEA失效模式分析:原理、应用与行业实践

1. 失效模式与影响分析(FMEA)概述失效模式与影响分析(Failure Mode and Effects Analysis,简称FMEA)是一种系统化的可靠性分析方法,最早由美国军方在20世纪40年代开发用于武器装备的质量控制。如今它已成为…

📰

国内环境快速部署Dify:镜像拉取与docker-compose改造指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

WSL下STM32烧录难题:ST-Link USB直通与OpenOCD实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

低功耗气体传感模组物联网设计:从选型到功耗优化的实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

CH379M双通道读卡器方案:SD/TF卡并行读写与国产化迁移实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬