单台云 Mac 容灾为什么是「业务流程问题」不只是「再买一台」
误区之一是把云上裸金属等同于天然 HA:独享降低邻居噪声,但未声明主备时,维护窗口、证书、密钥与 Runner 指纹仍是单路径。并联两台追吞吐与主备追接管目标不同,混写标签只会放大排队争议。
下面五条对应五类可对齐监控签名;从未见过这些曲线往往不是运气,而是监控未拆链路。
单区链路型:控制面与你的 SSH 跳板在同一条 BGP 前缀上抖动,表现为周期性丢包而非持续宕机;若未把告警拆成「到人」与「到制品库」两条,排障会误判为 Xcode 变慢。
回收与时限型:日租到期与发布周重叠而未冻结租期或未提前续订,本质是流程缺失;这类事故在云厂商侧往往标记为按约定执行,无法作为「意外免责」写进对外报告。
密钥与 Runner 指纹型:GitHub Actions 自托管 Runner 与机器名、路径与登录态绑定,切换实例后未重新注册或清理旧注册表项,会出现双心跳或假在线。
磁盘与缓存型:DerivedData 与模拟器日志把 NVMe 写满时,失败形态是长尾超时;若主备两台未统一缓存键与清理策略,切换后第一小时仍可能雪崩。
角色混用型:同一标签队列里混装交互调试与无人值守 nightly,高峰期人类任务被机器任务饿死;主备若未从标签上切开,只会把单点失败复制成「两台同时饥饿」。
已在做多区 CI 分片的读者,可把 workload 与制品同区沿用《2026 年跨区域 iOS/macOS CI 与云 Mac 队列路由实战》的标签写法,再在故障宣告时套用本文 draining 例外路径。
冷备、热备与「并联第二台」在 TCO 与 RTO 上如何分流
冷备按需拉起,热备弱一致常驻,并联两台同吃队列;冷备压低固定成本却把 RTO 绑在自动化,热备换分钟级 RTO 但要双份补丁。
| 维度 | 冷备(按需日租) | 热备(月租在线低负载) | 并联第二台(双活吞吐) |
|---|---|---|---|
| 典型 RTO 预期 | 数小时到一天,取决于镜像与脚本 | 通常 15–60 分钟级切换 | 与调度策略相关,未必缩短单路径故障 RTO |
| 现金流特征 | 峰值期支出,适合不确定持续期的项目 | 固定月费,可摊进部门基线预算 | 长期较高,但可量化缩短排队时间 |
| 配置是否需镜像 | 可在 Runbook 中允许备机低一档 | 建议同档或明确禁止的 job 列表 | 常按同档或分队列不同档 |
| 主要运营负担 | 预热脚本、交付 SLA、密钥注入 | 双份补丁、证书与监控对齐 | 队列命名、资源争用与成本台账 |
| 更适合谁 | 预算紧、偶发峰值的团队 | 强依赖单一路径的发布或合规窗口 | 持续高并行 CI 的团队 |
先写清楚「并联解决吞吐」与「主备解决单路径」分界线,再在价格页上选对租期,比先下单两台顶配更能把钱花在刀刃上。
复盘时对比「预热分钟数」与账单额,可避免「省了租金、赔了窗口」。
主区与备区怎么选:合成判据清单与密钥迁移骨架
不建议单看往返时延定主:运维入口、制品镜像、合规驻留与时区四套约束常会打架,用加权表比「体感最近」更可审计。
密钥与 Runner 侧须有人类 Runbook:备机先验登录与白名单,再摘旧 Runner 指纹,最后用带区域的失败重试跑一条最短 green pipeline。骨架示例如下,可按 orchestrator 与密钥系统替换占位符。
PRIMARY_REGION=sg
STANDBY_REGION=jp
TAG_PRIMARY=runner-${PRIMARY_REGION}-m4pro-64-ci
TAG_STANDBY=runner-${STANDBY_REGION}-m4pro-64-ci-dr
vault read secret/ci/${PRIMARY_REGION}/github-app
ssh ${USER}@${STANDBY_HOST} 'softwareupdate --list; xcodebuild -version'
ctl set-runner-tags ${TAG_PRIMARY} draining=true
ctl wait-queue-depth tag=${TAG_PRIMARY} max=0 timeout=45m
ctl register-runner host=${STANDBY_HOST} tags=${TAG_STANDBY}
ctl reroute-queue from=${TAG_PRIMARY} to=${TAG_STANDBY} strategy=affin-fallback
提示:备区须同时探测跳板 SSH 与控制面 webhook,避免「SSH 通了但 webhook 掉队」的假健康。
须事先写明谁可宣告故障、冻结窗内外 RTO 是否不同、备机低配禁跑哪些 scheme;与人的约定先入台账再落脚本,可避免高压期情绪化切换。
六步把「能切换」写成可演练的 Runbook
冻结故障范围:区分供应商公告、链路抖动与实例自身健康问题;同时打开到制品库与人的两条探测,禁止只凭体感关单。
对已注册 Runner 下达 draining:让在途 job 自然结束并对新队列关闭入口,超时策略写死为可审计分钟数。
拉起备机并跑最小健康检查:包括 Xcode 版本对齐、密钥可读、到公司 VPN 的路由与白名单四类;未通过则不进入第四步。
注册或切换 Runner 指纹与标签:删掉旧离线实例在控制面的残留条目,避免出现双心跳;标签显式带上 -dr 或 region 后缀便于事后追责。
先跑最短 green:单测或 smoke,再逐步放量 nightly;对重资源 job 在备机低配时直接拒绝并入队并打印醒目日志。
事后复盘入账:记录实际 RTO、未命中项与下次演练日期;与客户成功或服务商同步维护窗口获知渠道是否可改善。
三条可写进风险评估与台账的硬性口径
RTO 必须由演练数据支撑:未演练的「预计三十分钟恢复」写在对外材料里本质是愿望;至少在季度演练里跑一次完整 draining 与 Runner 重生并记录墙钟时间。
备机低配必须配禁止列表:明确哪些 Xcode scheme、模拟器矩阵或 LFS 体积在备机上禁用,避免出现「表面上切换成功但仍全线阻塞」的隐性事故。
账单与告警联动:日租到期、证书到期与补丁窗口应进入同一告警台;人类忘记续费在审计里常与「不可抗力」区分开来。
注意:本文中的分区组合与阈值仅作文档式规划示意,各地区实际网络 SLA 与安全合规要求请以你们法务与实测数据为准。
虚拟机或办公本机常与 Metal、密钥与外设链路纠缠;独享裸金属并按日按月弹性在多区布局时,才能把主备写成 Runbook。MESHLAUNCH 的 Mac Mini 云端租赁通常是更优解:机房网络与独享算力独立于办公室宽带,便于把分界与成本控制参数化。