首页/系统与基础设施/自动化运维速查/批量执行中的串行屏障
批量执行与作业50 条

批量执行中的串行屏障

串行屏障是批量执行里的等待点:前一批必须全部完成(或达到既定条件)才允许下一批开始。它把并行执行收束成可控节拍,用于滚动升级、主从切换、依赖就绪等场景。关键纪律是屏障必须带超时与破障路径,否则一个节点卡住会让整批作业停在那里无人推进。

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

屏障是什么

屏障与顺序是两件事:顺序规定「先做哪个再做哪个」,屏障规定「等到什么条件才继续」。屏障有三种常见判定:完成后屏障(这一批全部结束)、法定数量屏障(至少 N 个节点就绪即可继续)、时间屏障(固定等待,用于给外部系统留缓冲)。实现方式可以是分批执行并等待批次标记、检查服务就绪状态、用分布式锁互斥,或利用编排平台自带的分批参数与滚动等待。核心要求始终一致:判定条件必须可观测,等待必须有上限。

基本信息

屏障类型完成后屏障、法定数量屏障、时间屏障
实现手段分批加批次标记、服务就绪检查、分布式锁、平台滚动等待
判定依据状态查询接口、就绪探针、批次完成标记,不用进程存活代替
关键约束屏障必须带超时与人工破障路径

典型使用场景

  • 滚动升级:同一时刻只允许一个或一小组节点不可用
  • 主从切换:确认新主已接受写入后再切换下游连接
  • 双活或机房切换:等待流量归零后再动后端
  • 依赖就绪:数据库结构变更完成才启动应用发布
  • 缓存预热:预热完成后再放量,避免刚上线就把后端打穿
  • 下游保护:上游批次数量受限,等下游消费消化完再发下一批

带超时的等待与破障

带超时的等待与破障
# 等本批全部结束再放行下一批,超时必须中止而不是无限等待
deadline=$(( $(date +%s) + 600 ))
while :; do
  running=$(curl -fsS "https://center.example.com/batch/current" | grep -c 'running' || true)
  if [ "$running" -eq 0 ]; then echo "本批已完成,放行下一批"; break; fi
  if [ "$(date +%s)" -ge "$deadline" ]; then
    echo "等待超时,需人工确认后破障" >&2; exit 1
  fi
  sleep 10

done

# 就绪判定要用服务自检,而不是进程是否存活
# kubectl rollout status deploy/app --timeout=10m    # 平台自带就绪等待
# 锁类屏障务必设 TTL,避免持锁进程异常退出后永久死锁

屏障类型与风险

类型继续条件优点风险
完成后屏障本批全部结束最稳,适合不可逆步骤受最慢节点拖累
法定数量屏障达到 N 个就绪容忍个别慢节点数量算错会带着故障继续
时间屏障固定等待实现最简单等待时长靠经验,易过短或过长
锁屏障取得互斥锁防并发重入有效锁无 TTL 时死锁风险高
屏障把并行换成可控,代价是总时长拉长。窗口规划时要把屏障等待时间算进作业时长,否则批次还没走完窗口就结束了,剩下的部分被迫顺延。
屏障判定要观测服务真实状态:进程存在不等于服务可用,端口监听不等于能写入。用「进程退出」当继续条件,往往在依赖还没准备好时就进入下一步,把故障推迟到更晚暴露。

易错点

  • 屏障不设超时:单个节点卡住,后续批次无限期等待,作业整体停滞且无人知晓
  • 用进程存活替代服务就绪:下一步在依赖未完成时启动,引发连锁失败
  • 分布式锁没有过期时间:持锁进程异常退出后无人能再取得锁,作业长期锁死
  • 人工破障无记录:跳过屏障的原因与时间未留痕,复盘时说不清中间发生了什么
  • 屏障粒度过细:等待点密集,窗口被切碎,反而更容易超出维护时间

数据来源与参考

  • Kubernetes 官方文档:Deployment 滚动更新与就绪探针
  • Ansible 官方文档:serial 与批次执行控制
  • Redis 官方文档:带过期时间的分布式锁(SET NX EX)

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/automation/batch-execution-serialization-barrier.html

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