首页/系统与基础设施/自动化运维速查/自动化任务的原子性与分步提交
自动化基础与选型50 条

自动化任务的原子性与分步提交

自动化任务很难做到真正原子:多数操作由多个步骤组成,中途失败会留下半成品状态。可行做法是分步提交——把变更拆成若干可验证的小步,每一步完成后立即可判断,失败时只需要回退最后一步;配合临时目录与切换动作,可以把「看起来原子」的操作做成可控的两段式提交。

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌‌​‌​​​‌‌​​​​‌​‌‌‌​​‌‌​‌‌​‌​‌‌​​‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌​‌​​‌​‌‌‌​‌​​​‌‌‌‌​​‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌​​​​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌​​‌​​​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​‌‌​‌​‌‌​‌​​‌​‌‌‌​‌​​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

为什么难做到原子

一个部署动作通常包含下载制品、解压、更新配置、重启服务、健康检查等多步操作,任何一步失败都会在磁盘上留下混合状态:新版本文件已就位但服务还在跑旧进程。真正原子化需要底层系统支持事务,而这在操作系统层面基本不存在。可行替代是分步提交:每步都有明确的成功判据,失败即停,并保证从任一中断点都能重跑或回退。

基本信息

原子性障碍多步操作、无统一事务、外部副作用
替代做法分步提交 + 每步可验证 + 可重跑
两段式结构先准备好(写入临时位置),再切换(生效)
中断处理保留断点信息,支持从断点续跑或回退

分步提交要点

  • 先准备后生效:制品先落地到临时目录并校验,再通过一次切换动作生效。
  • 切换动作尽量短:生效步骤越短,失败窗口越小。
  • 每步有判据:每一步都要有可检查的结果,而不是靠下一步失败来暴露。
  • 中断可识别:记录执行到哪一步,重跑时能跳过已完成步骤。
  • 回退有依据:保留上一版本与上一份配置,确保可切回。
  • 清理有步骤:临时目录、旧版本与锁文件要有明确清理动作。

先准备再切换

先准备再切换
release=/opt/app/releases/1.4.2
staging=/opt/app/.staging-1.4.2

mkdir -p "${staging}"                      # 第一步:在临时目录准备
cp -a ./build/. "${staging}/"              # 制品落地
sha256sum -c checksums.txt --status || exit 1   # 校验,失败即停

mv -T "${staging}" "${release}"           # 第二步:一次切换生效
ln -sfn "${release}" /opt/app/current      # 更新软链指向新版本
systemctl restart app && systemctl is-active app   # 后置校验

分步设计与中断表现

步骤成功判据中断后的状态处置
准备制品校验通过临时目录残留重跑覆盖临时目录
切换生效软链指向新版本指向旧版本重新执行切换
重启服务健康检查通过服务未起或半起切回旧版本并重启
清理旧版旧目录已删除旧版本仍在重跑清理步骤
把最危险的一步放在最后单独确认,是分步提交最实用的价值:即使前面所有准备都出错,只要切换动作没执行,业务就仍然跑在旧版本上。
涉及数据格式变更时,切换后很难回退:新版本写出的数据老版本可能读不了。这类变更应在执行前完成备份,并明确不可回退点。

易错点

  • 直接覆盖目标目录再重启:中途失败会留下半新半旧的目录,新进程可能加载到不完整的文件
  • 生效步骤过长:重启加配置加载加数据迁移都放在一步里,失败窗口被拉大
  • 中断后无法续跑:任务不记录进度,重跑只能从头来,重复执行又产生额外副作用
  • 缺少切换前的校验:把损坏的制品直接切到生效位置,故障在生产环境才暴露

数据来源与参考

  • Kubernetes 官方文档(滚动更新与就绪探针机制)
  • Google SRE 工作手册(变更分步与回滚相关章节)
  • HashiCorp《Terraform 官方文档:plan 与 apply 两段式语义》

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/automation/task-atomicity-staged-commit.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌‌​‌​​​‌‌​​​​‌​‌‌‌​​‌‌​‌‌​‌​‌‌​​‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌​‌​​‌​‌‌‌​‌​​​‌‌‌‌​​‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌​​​​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌​​‌​​​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​‌‌​‌​‌‌​‌​​‌​‌‌‌​‌​​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​