4. 计算资源的多区域高可用设计

计算资源的高可用,核心不在于“多开几台虚拟机”,而在于让实例分布、扩缩容、健康检查与自愈形成一条闭环:流量进入负载均衡,负载均衡把请求分发给健康实例;实例由托管实例组(MIG)统一编排;MIG 依据模板和策略在多区域或单区域内维持期望容量;健康检查持续判定实例可用性;自愈机制在判定失败后自动重建实例。理解这条闭环,才能判断一个多区域计算架构到底能不能扛住单区域故障。

区域级 MIG 与区域 MIG 的本质差异

Google Cloud 的 MIG 有两种作用域。区域级 MIG(zonal MIG)把实例固定在一个可用区,例如 asia-east1-a;区域 MIG(regional MIG)则把实例分散在同一区域的多个可用区,例如 asia-east1-a/b/c。两者都使用实例模板,但故障域不同:区域级 MIG 遇到该可用区整体故障时,整个实例组不可用;区域 MIG 在某个可用区故障时,其余可用区实例仍可继续服务,并且 MIG 会尝试在健康可用区补足容量。

选择时可以用一个简单判断:如果业务只要求单可用区内的快速重建,区域级 MIG 足够;如果要求“单可用区故障不中断服务”,应使用区域 MIG,并配合跨区域的外部应用负载均衡或全局负载均衡。需要强调的是,区域 MIG 解决的是“区域内多可用区”的高可用,不等于“多区域”容灾。真正的多区域高可用,通常要在两个或更多区域分别部署区域 MIG,再由全局负载均衡统一入口。

多区域计算高可用闭环:入口 → MIG 分布 → 健康检查 → 自愈 全局外部应用负载均衡 按后端健康状态与容量分发流量 区域 asia-east1(区域 MIG) 可用区 a 实例 ×2 可用区 b 实例 ×2 可用区 c 实例 ×2 自动扩缩容策略 目标 CPU 利用率 60%|最小 3|最大 12 按可用区均衡分布(balanced) 健康检查与自愈 HTTP /healthz 每 10s,超时 5s,失败 3 次判定不健康 不健康实例被移出后端,MIG 自动重建替换 初始延迟 60s,避免启动未完成被误判 区域 asia-east2(区域 MIG) 可用区 a 实例 ×2 可用区 b 实例 ×2 可用区 c 实例 ×2 自动扩缩容策略 目标 CPU 利用率 60%|最小 3|最大 12 按可用区均衡分布(balanced) 健康检查与自愈 HTTP /healthz 每 10s,超时 5s,失败 3 次判定不健康 不健康实例被移出后端,MIG 自动重建替换 初始延迟 60s,避免启动未完成被误判 单可用区故障:区域 MIG 在其余可用区补足容量;单区域故障:全局负载均衡将流量切至另一区域 MIG

自动扩缩容:让容量跟随负载而不是跟随猜测

MIG 的自动扩缩容基于自动扩缩器(autoscaler)。它周期性采集实例的利用率指标,与目标值比较后调整实例数量。常用配置包括:目标 CPU 利用率、最小实例数、最大实例数、冷却期、扩缩容控制。例如一个 Web 前端 MIG 设置目标 CPU 利用率 60%、最小 3、最大 12,当平均 CPU 持续高于 60% 时扩容,低于目标并稳定后缩容。

多区域场景下,扩缩容要特别关注两点。第一,每个区域的 MIG 应独立配置自动扩缩容,避免一个区域的负载波动被误判为全局需求。第二,最小实例数要保证“单区域故障后剩余容量仍能承接全部流量”。例如两个区域各最小 3 台、单台可承载 100 QPS,总容量 600 QPS;若一个区域整体故障,剩余 3 台只能承载 300 QPS,若峰值是 500 QPS 就会过载。因此最小实例数应按“N+1 区域容量”反推,而不是只按日常均值设置。

健康检查与自愈:判定标准决定恢复速度

健康检查分为两类:负载均衡健康检查决定是否把流量发给实例;MIG 自愈健康检查决定是否重建实例。两者可以共用同一个健康检查端点,但参数含义不同。以 HTTP 健康检查为例,关键参数包括:检查间隔(checkIntervalSec)、超时(timeoutSec)、健康判定阈值(healthyThreshold)、不健康判定阈值(unhealthyThreshold)。例如间隔 10 秒、超时 5 秒、不健康阈值 3 次,意味着实例连续约 30 秒失败后被判定不健康。

自愈的触发条件是:实例被判定为不健康,或实例被删除、停止、进入修复状态。MIG 会尝试重建实例以维持目标容量。这里有一个常见误区:自愈不是“修复原实例”,而是“用实例模板重建一个新实例”。因此实例模板必须包含完整的启动配置,包括启动脚本、镜像、服务账号、网络标签和元数据。如果应用依赖本地磁盘数据,重建后数据会丢失,必须把状态外置到 Cloud Storage、Cloud SQL 或 Firestore。

健康检查端点应只检查“能否服务”,不要检查下游依赖。如果 /healthz 里连数据库也一起检查,数据库抖动会导致所有实例被判定不健康,反而引发大面积自愈和流量中断。建议把依赖检查放在就绪探针或独立的 /readyz 中,并设置更宽松的阈值。

多区域部署的落地要点

一个可参考的多区域计算部署如下:在 asia-east1 和 asia-east2 各创建一个区域 MIG,使用同一个实例模板;两个 MIG 都挂到全局外部应用负载均衡的后端服务;后端服务开启健康检查,并配置故障转移。自动扩缩容按区域独立设置,最小实例数按“单区域可承接全量流量”反推。发布时使用滚动更新(rolling update),设置 maxSurge 和 maxUnavailable,例如 maxSurge=1、maxUnavailable=0,保证更新期间容量不下降。

验证高可用是否真正生效,不能只看控制台显示“健康”。可以按以下顺序做故障演练:先手动删除一个实例,观察 MIG 是否在数十秒内重建;再模拟一个可用区不可用,观察区域 MIG 是否在其余可用区补足;最后模拟一个区域整体不可用,观察全局负载均衡是否把流量切到另一区域,以及剩余区域是否因容量不足而出现延迟上升。每一步都应记录恢复时间、错误率和容量变化,作为后续调整最小实例数和健康检查阈值的依据。

对比项 区域级 MIG 区域 MIG
作用域 单个可用区 同一区域多个可用区
故障域 可用区故障即整体不可用 单可用区故障仍可服务
实例分布 固定在一个可用区 按策略均衡到多个可用区
适用场景 开发测试、单区容错 生产多可用区高可用
与全局负载均衡配合 需自行跨区部署多个 MIG 天然适合作为多区域后端单元

最后要区分“高可用”和“灾备”。区域 MIG 解决的是区域内多可用区的高可用;多区域 MIG 加全局负载均衡解决的是区域级故障的持续服务能力。两者叠加,再配合合理的自动扩缩容下限和健康检查阈值,才能让计算资源在真实故障中保持可服务,而不是只在纸面架构上看起来可靠。