海外服务器地区稳定性怎么查?AWS、GCP、Cloudflare、DigitalOcean、Linode 官方事故记录 212 起复盘

📅 · 海外服务器线路与网络实测 - ChengziCloud

一句话结论

「这个地区稳不稳」是选机房时唯一没法试用出来的指标——延迟可以 ping,带宽可以跑,磁盘可以 dd,但故障要等它自己发生。

本文要点
  • 先把结论摆出来:五条能直接用的判断
  • 取数方法:6 个公开接口,一把 curl 就够
  • 先体检数据:三个必须先修掉的坑
  • 四家横向:频率、中位时长、长尾
  • 地区维度:哪些地方真的被反复点名
  • GCP:8 起事故,唯一能"直接归因到城市"的数据源
  • AWS:一个 Region 可以「不可恢复」
  • 今天实测:从美西节点到 9 个地区的当前 RTT

「这个地区稳不稳」是选机房时唯一没法试用出来的指标——延迟可以 ping,带宽可以跑,磁盘可以 dd,但故障要等它自己发生。于是绝大多数人选地区时看的是 SLA 数字(99.9% 还是 99.99%)和论坛口碑,而这两样恰好是最不可靠的:SLA 是承诺不是记录,口碑是幸存者偏差。

2026 年 10 月 30 日 06:00–06:08 UTC,我们从一台美西圣何塞节点(38.55.134.58,AS402169 Uscloud)把 6 个公开的事故数据源全部拉了一遍:4 家 Statuspage 型状态页(Cloudflare、DigitalOcean、Linode、GitHub)各取最近 50 起事故、GCP 的 incidents.json 全量、AWS 的 all.rss 全部条目,一共 212 起事故、29.9 MB 原始 JSON。然后做了一件很少有人做的事:先体检数据,再下结论。

结果是三个和「看 SLA 选地区」完全相反的事实。第一,AWS 的 39 条事故通知只对应 4 起事故——同一起事故在 3 天里发了 34 条状态更新,如果你按通知条数排名,AWS 会看起来是全场最不稳定的厂商。第二,Cloudflare 最近 50 条记录里有 5 条的 resolved_at 早于 created_at(差 -19 到 -75 分钟),按原始字段算时长会得到负数;另有 1 条记录挂了 55.9 天才关闭。第三,「地区级故障恢复更慢」这个直觉在数据里只有一半成立:Cloudflare 地区级事故中位 93 分钟 vs 全局 77 分钟(慢 21%)、DigitalOcean 200 vs 158 分钟(慢 27%),但 Linode 反过来快 46%。换句话说,选地区买不到「恢复更快」,只能买到「故障半径更小」。

这篇文章把 6 个接口的取数方法、三处必须先修的数据陷阱、四家厂商的横向表、GCP 8 起与 AWS 4 起事故的逐条时间线、以及一张「事故暴露 → 冗余预算」的价格表全部写清楚。所有数字都能用文末的脚本在 30 秒内复现。

Meta Description: 抓取 5 家厂商 212 起官方事故记录:AWS 39 条通知只对应 4 起事故,Cloudflare 10% 的时间戳是反的,中东一个 Region 已确认数据不可恢复,附取数脚本与判读规则。

关键词:海外服务器、地区选择、事故记录、status page、SLA、MTTR、可用性、冗余成本、机房稳定性

一、先把结论摆出来:五条能直接用的判断

结论 1:事故「条数」不能当「起数」用。 AWS RSS 39 条 = 4 起;Linode 50 起里有 10 起一次性打了 20 个以上组件(最多 240 个)。任何「哪个厂商事故最多」的排行榜,只要没做去重和标签清洗,都是错的。

结论 2:状态页的时间戳只能取中位数,不能取最大值。 Cloudflare 50 条里 5 条时长为负,1 条 55.9 天;Linode 最长一条 309 天。这些不是「事故持续了 309 天」,而是「事故关闭动作迟了 309 天」——状态页卫生问题,和你机器的真实可用性无关。

结论 3:跨厂商比 MTTR 必须先对齐口径。 GCP 的 incidents.json 只收 SERVICE_DISRUPTION 及以上,8 起中位 504 分钟(8.4 小时);Statuspage 家连 minor 都记,四家中位 73–223 分钟。直接比会说「GCP 比 Cloudflare 慢 6 倍」,这是口径差不是质量差。

结论 4:地区维度真正能回答的只有三个问题。 哪个地区被反复点名(Cloudflare 63 天内 337 个边缘节点只有 7 个出过事,Ashburn 一个点占全部地区时长的 75%)、哪些事故是单点哪些是多点(Linode 2 起多点事故累计 104.8 小时,占其单点+多点总时长 74%)、以及有没有地区会永久消失(AWS 中东两区已官方确认数据不可恢复)。

结论 5:冗余的钱要花在「故障半径」上,不是「恢复速度」上。 同一份数据里,地区级 vs 全局故障的 MTTR 差异只有 ±20~46% 且方向不一致;但故障半径的差异是 100%(一个 AZ vs 一个 Region vs 一个厂商)。所以钱应该买「多打一份副本」,不该指望「换个地区就恢复得快」。

1.1 这一篇和站内其他文章的边界

已有文章它回答的问题本篇的回答
2026-09-18 售后时区与 SLA 换算SLA 百分比换成多少小时、工单多久回不看承诺,看已经发生过什么
2026-09-03 高可用与容灾架构故障转移怎么设计(DNS/Anycast/多活)只提供故障半径与频率的原始证据
2026-09-24 被墙风险与切换演练网络层可达性(ICMP/TCP/TLS 三态)与网络无关,是厂商侧服务事故
2026-10-07 备份与对象存储选址备份写到哪、恢复多快只引用其出网/存储单价做冗余预算
2026-10-22 同城机房离散度同城机房之间差多少毫秒与延迟无关,是时间维度的稳定性

二、取数方法:6 个公开接口,一把 curl 就够

这一节的所有接口都不需要 API key、不需要注册、不需要登录控制台。这也是它最大的价值:你可以自己在 30 秒内复现,而不是相信我给的数字。

数据源接口返回内容本次样本
Cloudflarecloudflarestatus.com/api/v2/incidents.json最近 50 起事故 + 组件 + 更新50 起 / 140 KB
DigitalOceanstatus.digitalocean.com/api/v2/incidents.json同上50 起 / 208 KB
Linode (Akamai)status.linode.com/api/v2/incidents.json同上50 起 / 830 KB
GitHubwww.githubstatus.com/api/v2/incidents.json同上50 起 / 312 KB
Google Cloudstatus.cloud.google.com/incidents.json全量事故 + 受影响地区 + 影响等级8 起 / 251 KB
AWSstatus.aws.amazon.com/rss/all.rss最近约 40 条状态更新(不是事故)39 条 / 58 KB

四家 Statuspage 的 incidents.json 结构完全一致:每起事故有 created_at、resolved_at、impact(none/minor/major/critical)、components[](被点名的组件名)、incident_updates[](逐条进展)。GCP 的结构不一样但有更好的一列:status_impact 分 SERVICE_INFORMATION / SERVICE_DISRUPTION / SERVICE_OUTAGE 三档,外加 affected_locations[] 直接给城市名(Iowa (us-central1)、London (europe-west2))。

2.1 一个必须强调的细节:AWS 的 RSS 是「更新流」不是「事故流」

AWS 的状态页没有 JSON 事故接口,只有 RSS。而它的 RSS 发的是每次状态变更:Service impact: / Service degradation: / Service disruption: 三种前缀,同一起事故每几十分钟发一条。39 条里 34 条属于同一起事故(中东),时间跨度 2026-03-01 04:51 到 03-03 08:40。

判据:把 RSS 条目按「区域 + 主题」聚簇,同一簇算一起。本次聚簇后得到 4 起,而不是 39 起。

2.2 取数脚本(可直接跑)


// 4 家 Statuspage + GCP + AWS,落盘到 /tmp/incidents/
mkdir -p /tmp/incidents
UA='Mozilla/5.0 (X11; Linux x86_64) Chrome/124 Safari/537.36'
for u in \
 "https://www.cloudflarestatus.com/api/v2/incidents.json" \
 "https://status.digitalocean.com/api/v2/incidents.json" \
 "https://status.linode.com/api/v2/incidents.json" \
 "https://www.githubstatus.com/api/v2/incidents.json" \
 "https://status.cloud.google.com/incidents.json" \
 "https://status.aws.amazon.com/rss/all.rss" ; do
  curl -s -A "$UA" --max-time 25 "$u" -o "/tmp/incidents/$(basename $(dirname $u)).json"
done
ls -lh /tmp/incidents/

用 basename $(dirname ...) 命名会把状态页域名当文件名(www.cloudflarestatus.com.json 这样),换成你自己喜欢的命名即可;关键是这 6 个 URL 都是公开的。

2.3 顺手测到的一件事:轮询这些接口是要花钱的

同一时刻我们从节点上把 6 个接口各拉一次,记录四段耗时和字节数(curl -w '%{time_namelookup} %{time_connect} %{time_appconnect} %{time_starttransfer} %{size_download}'):

接口DNSTCPTLSTTFB单次字节每分钟轮询一个月
Cloudflare29 ms42 ms262 ms548 ms140,3756.1 GB
DigitalOcean29 ms33 ms224 ms294 ms207,6189.0 GB
Google Cloud29 ms31 ms204 ms227 ms251,11710.9 GB
GitHub29 ms147 ms530 ms839 ms312,14813.5 GB
Linode29 ms151 ms560 ms775 ms829,64435.8 GB
AWS RSS29 ms101 ms397 ms630 ms57,8202.5 GB

DNS 全部 29 ms(同一台递归解析器的固定开销),差距全在 TCP+TLS 段——GitHub 和 Linode 的 TLS 握手比 Cloudflare 多花 270~300 ms,因为它们把状态页托管在与主站不同的链路上。Linode 那个 830 KB 的响应体是个坑:一分钟轮询一次,一个月 35.8 GB;如果你是每 15 秒轮询一次(很多监控模板的默认值),就是 143 GB。

好消息是这 6 个接口里 5 个支持条件请求:

接口校验器带 If-None-Match 后
CloudflareETag: W/"140375-..."304 / 0 字节 / 289 ms
DigitalOceanETag: W/"6367be4c..."304 / 0 字节 / 231 ms
LinodeETag: W/"ec3adfe0..."304 / 0 字节 / 659 ms
GitHubETag: W/"72e303d2..."304 / 0 字节 / 671 ms
Google Cloud无 ETag,有 Last-Modified304 / 0 字节 / 246 ms
AWS RSS有 ETag200 / 57,820 字节 / 519 ms(不支持条件请求)

AWS 是唯一一个"忽略 If-None-Match、照样返回全量"的接口。 所以轮询 AWS RSS 的单次成本恒定为 57.8 KB,而其他五家在有变化之前是 0 字节。这条差异在低频轮询下无所谓,在做「秒级事故检测」时是 3~4 倍的带宽与解析开销差。

三、先体检数据:三个必须先修掉的坑

拿到 29.9 MB 原始 JSON 之后,我没有直接算平均值,而是先跑了三组一致性检查。三组全都不干净——如果你跳过这一步,后面每一个结论都会是错的。

3.1 坑一:负数时长——Cloudflare 有 10% 的记录是反的

把 resolved_at - created_at 直接相减,Cloudflare 的 50 条记录里出现了 5 条负值:-75、-47、-44、-58、-19 分钟。也就是"事故在开始之前就结束了"。

原因不难猜:Statuspage 的 resolved_at 在事故被"合并"或"重新开启"时会被改写,而 created_at 保留最初时刻;也有条目是先建了事件、后补的历史描述。这不影响"发生过事故"这个事实,但直接算平均会把这家的 MTTR 拉低几分钟,且让 max() 出现负数。

处理:所有时长计算一律加 0 < duration <= 3 天 的过滤,并对被过滤掉的条数单独计数。

厂商原始条数负数时长>24 小时挂起可用样本
Cloudflare505244
DigitalOcean500350
Linode5001238
GitHub500050

3.2 坑二:挂起记录——最长一条 309 天

被过滤掉的"长尾"里,有两个极端值:

  • Cloudflare:80,455 分钟 = 55.9 天(另一条 1,577 分钟 = 26.3 小时)
  • Linode:445,331 分钟 = 309 天(另有 77,380 分钟 = 53.7 天、16,971 分钟 = 11.8 天、15,926 分钟 = 11.1 天)

309 天不是"事故持续了 309 天",而是"这起事故的状态页条目在 309 天后才被点关闭"。这类记录在四家里有 17 条(Cloudflare 2 + DO 3 + Linode 12),占全部样本 8.5%。它们的正确用法是"证据",不是"时长":它证明这家厂商的状态页关闭流程没有纪律,你如果做 SLA 对账,不能拿 resolved_at 当恢复时间,得用事故更新里的最后一条实质进展时间。

3.3 坑三:标签风暴——Linode 一起事故打了 240 个组件

Statuspage 允许一起事故关联多个组件。正常情况关联 1~5 个("NYC1 网络故障")。但 Linode 的 50 起里有 10 起关联了 20 个以上组件,最多的一起打了 240 个。

后果很直接:如果你按"组件被点名次数"统计地区故障,这 10 起会让每个机房都平白多出 10 次故障,所有机房看起来"一样不稳"。本次的做法是把 >20 个组件 的事故单独归为"全站/平台类",不计入地区统计;处理之后 Linode 的地区归因从 50 起的假象收敛到 13 起单点事故 + 2 起多点事故。

厂商无地区组件(全局/控制面)单点(≤4 个机房)多点(≥5 个机房)打全站标签(>20 组件)
Cloudflare37700
DigitalOcean361220
Linode2513210
GitHub46000

这张表本身就是本文最重要的一个发现:四家厂商的状态页里,超过 70% 的事故根本不属于任何单一地区。Cloudflare 74%(37/50)、DigitalOcean 72%(36/50)、Linode 50%(25/50)、GitHub 100%。它们属于控制面:API、DNS、对象存储、计费、控制台、配置下发。

四、四家横向:频率、中位时长、长尾

样本过滤干净之后,才能横向比。注意窗口长度差了 5.2 倍(Cloudflare 63 天凑满 50 起,Linode 花了 329 天才凑满),所以只能比"每 30 天起数",不能比总数。

厂商窗口天数起数/30 天中位时长p90>24h 条数打标签事故
GitHub2026-08-13 → 10-297620.073 min594 min00
Cloudflare2026-08-27 → 10-306324.281 min378 min20
DigitalOcean2026-04-28 → 10-271828.4166 min1,253 min30
Linode2025-12-03 → 10-283294.6223 min1,476 min1210

三个必须一起读的注解:

注解一:频率差 5.2 倍,其中有多少是真实的、有多少是记账粒度,公开数据无法分离。 GitHub 每 30 天 20 起,Linode 4.6 起,但这不代表 GitHub 比 Linode 不可靠 4.4 倍——GitHub 把每一次"部分用户网页加载慢"都记为一次 incident,Linode 只记影响整机房的事件。所以这张表的频率列只能用于"同厂商不同地区之间"的对比,不能用于"厂商之间"的排名。

注解二:中位时长从 73 分钟到 223 分钟,差 3 倍;而这个差距和"事故严重度"的关系比和"厂商能力"的关系更大。 处理一起配置回滚平均 1 小时出头(GitHub/Cloudflare 的中位数都在这个区间),处理一起需要现场人手的机房级故障平均 2.5~4 小时(DO/Linode)。

注解三:p90 才是你该拿去写进合同前评估的数字。 Cloudflare 的 p90 是 378 分钟(6.3 小时),是它中位数的 4.7 倍;GitHub 的 p90/中位 = 8.1 倍;DO 是 7.5 倍;Linode 6.6 倍。四家的共同形态都是"大部分事故一小时内结束、少数事故拖到半天以上",这个形态和小型机房"要么不出事、出事就是半天"的经验一致,说明它来自物理世界的约束(等人到场、等备件、等上游),不是流程问题。

4.1 反直觉结论:地区级故障并没有显著更慢恢复

「机房级故障要人到现场,所以恢复慢」这个直觉,在数据里只有一半成立:

厂商地区级事故(n)中位时长全局事故(n)中位时长地区级相对全局
Cloudflare793 min3777 min慢 21%
DigitalOcean14200 min36158 min慢 27%
Linode12139 min17258 min快 46%
GitHub0—4689 min无样本

三家有样本,两家慢 20~27%、一家快 46%,样本量 7~14 起,这个方向性差异落在噪声范围内。诚实地说:用"是不是地区级事故"来预测恢复时长,在这份数据上不成立。

但同一份数据支持另一个更实用的结论:故障半径的差异是确定的。一个 AZ 故障影响 1/3 的实例,一个 Region 故障影响 100% 的实例,一个控制面故障影响所有地区的控制台和 API。三者需要的冗余完全不同,而它们的概率在样本里的比例是 0%(AZ 级单独计数极少)/ 约 25% / 约 75%——也就是说,你花在"跨地区"上的钱,防的是那 25%;花在"控制面不要单点依赖"上的精力,防的是那 75%。

五、地区维度:哪些地方真的被反复点名

把每起事故的组件名映射到地区(Cloudflare 用 城市, 国家 - (IATA) 的 337 个边缘节点、DO 用 NYC1/BLR1 这类 10 个机房代码、Linode 用 US-SEA (Seattle) 这类 17 个机房),按"累计被点名时长"排序,得到三张很短的表。

Cloudflare(63 天,7 个地区被点名,累计 1,631 分钟)

边缘节点次数累计时长最长单次占比
Ashburn, United States - (IAD)31,217 min(20.3 h)1,059 min75%
Portland, United States - (PDX)1106 min106 min7%
Seattle, United States - (SEA)1106 min106 min7%
Los Angeles, United States - (LAX)193 min93 min6%
Stockholm, Sweden - (ARN)164 min64 min4%
Lisbon, Portugal - (LIS)145 min45 min3%

这张表最值得看的是分母:337 个边缘节点里,63 天只有 7 个出过事(2.1%),而 Ashburn 一个点吃掉了 75% 的地区故障时长。 这说明两件事:第一,Cloudflare 的地区故障是极端长尾分布,任何"平均一下每个 PoP 多久出一次事"的算法都会失真;第二,如果你恰好把源站或回源链路绑在 IAD(美东),你遭遇 Cloudflare 侧地区故障的概率比绑在法兰克福高一个量级。

DigitalOcean(182 天,10 个机房被点名,累计 7,561 分钟)

机房次数累计时长最长单次占比
NYC142,765 min(46.1 h)1,736 min37%
NYC351,206 min(20.1 h)562 min16%
MKC121,010 min(16.8 h)505 min13%
FRA13586 min(9.8 h)293 min8%
BLR19516 min(8.6 h)341 min7%
NYC24472 min(7.9 h)118 min6%

NYC1 的 46.1 小时除以窗口 182 天 = 1.05% 的时间被点名。注意这是"组件被点名"不是"你的实例不可用",真实影响面还要看这 46 小时里有多少是全机房。BLR1(班加罗尔)次数最多(9 次)但累计时长只有 8.6 小时,形态是"频繁小抖动"而不是"长时间宕机"——这也是选地区时要区分的东西:高频短故障适合自动重试,低频长故障才需要跨区冗余。

Linode(329 天,17 个机房被点名,累计 52,122 分钟)

机房次数累计时长最长单次占比
US-SEA (Seattle)36,940 min(115.7 h)6,225 min13%
US-ORD (Chicago)26,569 min(109.5 h)6,225 min13%
US-MIA (Miami)36,395 min(106.6 h)6,225 min12%
US-IAD (Washington)26,364 min(106.1 h)6,225 min12%
IN-MAA (Chennai)16,225 min(103.8 h)6,225 min12%
US-LAX (Los Angeles)16,225 min(103.8 h)6,225 min12%

Linode 这张表要反着读:六个机房的"最长单次"全是 6,225 分钟(103.8 小时)——同一起 4 天多的多点事故被同时记到了 15 个机房上。这就是 3.3 节「多点事故」在数据里的样子。把它单独拎出来之后,Linode 的单点事故只有 13 起、累计 33.5 小时;而这 2 起多点事故累计 104.8 小时,是单点总时长的 3.1 倍。

这就是"少数几次大事"的量化版本:如果按起数看,Linode 的地区故障 87% 是单点的、影响一个机房;按小时看,73% 的故障时间来自那 2 起多点事故。你的冗余该按"小时"设计,不是按"起数"设计。

六、GCP:8 起事故,唯一能"直接归因到城市"的数据源

GCP 的 incidents.json 是六个数据源里唯一把「受影响地区」写成城市名的(Iowa (us-central1)、London (europe-west2)),而且带 status_impact 三档分级。本次全量只有 8 起(2026-02-27 至 10-20),逐条列全:

开始(UTC)结束时长等级受影响地区
2026-02-27 12:3702-27 14:352.0 hINFORMATIONGlobal + Montréal / São Paulo / Iowa 等
2026-06-05 07:0006-26 19:00516.0 h(21.5 天)DISRUPTIONDelhi (asia-south2) + Global
2026-07-14 17:0007-15 03:4010.7 hDISRUPTIONMelbourne + Frankfurt (europe-west3)
2026-07-15 23:5707-16 12:2512.5 hDISRUPTIONNetherlands (europe-west4)
2026-08-20 15:4008-20 19:203.7 hOUTAGEGlobal + Oregon (us-west1)
2026-09-01 14:4209-01 18:524.2 hDISRUPTIONMulti-region nam5 + Iowa (us-central1)
2026-10-08 11:0010-09 16:4629.8 hDISRUPTIONIowa (us-central1)
2026-10-20 06:0010-20 12:086.1 hDISRUPTIONLondon (europe-west2)

中位 504 分钟(8.4 小时),比四家 Statuspage 的中位数高 4~7 倍。这不是 GCP 更差,而是口径差:incidents.json 只收录 SERVICE_DISRUPTION 及以上(影响客户可用性的),minor 级别的小抖动根本不进这个文件。拿 8.4 小时去和 Cloudflare 的 81 分钟比,是把"住院病人平均住院天数"和"门诊病人平均停留时间"放一起比。

这张表真正能用来选地区的是三行:

第一行:Iowa(us-central1)出现 2 次,合计 34 小时。 10-08 那起 29.8 小时是全表第二长。如果你在 us-central1 有两个 zone 做多 AZ,10-08 这起事故的服务形态(对象存储类)会同时影响两个 zone——多 AZ 防不住"区域内共享服务"故障,这是 2026-10-25 那篇多 AZ 实测没覆盖的场景(那篇测的是跨 zone 延迟与流量费)。

第二行:欧洲三个区(London / Frankfurt / Netherlands)各 1 次,合计 29.3 小时。 密度高于美国(Iowa 2 次 34 小时、Oregon 1 次 3.7 小时)。三类原因都写在正文里:电力(London 10-20)、网络(Netherlands 07-15)、VMware 平台(Frankfurt 07-14)——同一区域反复出事的诱因是"共享基础设施同源",不是巧合。

第三行:Delhi(asia-south2)516 小时。 21.5 天的 DISRUPTION 是一个极端样本:它不是"服务挂了 21 天",而是"该区域某类服务持续降级 21 天"。这类超长窗口事故的处置方式只有一种——迁移,不要等。判断阈值建议写在预案里:同一区域单次降级超过 24 小时,直接启动迁移,不设第二个观察窗。

七、AWS:一个 Region 可以「不可恢复」

AWS 的 RSS 39 条聚簇后是 4 起事故。其中两起属于同一场灾难,而从官方文本里能读到一个所有 SLA 文档都不会写的结论:Region 级别的故障存在"永久损失"这一档。

时间线(全部引自 status.aws.amazon.com 原文):

时间(UTC-7)官方表述(摘译)
2026-03-01 04:51"We are investigating issues with AWS services in the ME-CENTRAL-1 Region."(开始调查 ME-CENTRAL-1 区域问题)
2026-03-01 05:19"connectivity and power issues affecting APIs and instances in a single Availability Zone (mec1-az2) ... due to a localized power issue"(单个可用区 mec1-az2 因局部电力故障出现连接与断电问题)
2026-03-02 ~ 03-0334 条更新,状态在 impact / degradation / disruption 之间反复
2026-04-30 00:07"The Middle East (Bahrain) Region (ME-SOUTH-1) has suffered damage due to the conflict in the Middle East and is currently unavailable. Customers should recover their resources in other Regions from remote backups."
2026-04-30 00:25"ME-CENTRAL-1 has suffered damage as a result of the conflict ... unable to reliably support customer applications"
2026-09-15 03:22"The damage to our infrastructure spanned multiple Availability Zones and exceeded what our regional and multi-AZ services are designed to withstand ... we are unable to restore access to the resources and data hosted exclusively in this Region."(ME-SOUTH-1)
2026-09-15 03:27"we are unable to restore access to the resources and data hosted exclusively in the mec1-az2 Availability Zone"(ME-CENTRAL-1)

这七个时间点里有三条对"选地区"是硬约束:

  1. 起点是一个 AZ 的电力故障(mec1-az2),不是整个区域。3 月 1 日那天,多 AZ 架构确实扛住了——业务在另外两个 AZ 继续跑。这印证了多 AZ 的有效性。
  2. 四月底升级为区域级不可用,原因是"冲突造成的物理损坏"。这是任何 SLA、任何架构设计都无法覆盖的变量:不是软件缺陷、不是容量不足,是机房本身被打坏了。
  3. 九月十五日官方明确"无法恢复"该 Region / 该 AZ 上独有的数据。也就是说,没有异地备份的数据,永久丢失。原文甚至写明"damage ... exceeded what our regional and multi-AZ services are designed to withstand"——多 AZ 的设计目标里本来就不包含这种场景。

换算成概率与成本:AWS 目前公开的 Region 数量在 30+ 量级,出现"整区数据不可恢复"的是 2 个(同一次地缘事件)。单看次数是 2/30 级别的小概率,但后果是 100% 数据丢失,且不可保险。所以这一节的落地结论不是"别用中东",而是:

异地备份的唯一验收标准是"恢复演练成功过一次",而不是"备份任务显示成功"。 备份和源站同厂商、同账号、同计费主体、同地理政治风险区,等于没有备份。本次样本里唯一不可恢复的数据,恰恰是"只存在于这个 Region"的那部分。

7.1 昨天的 us-west-2:6 小时 48 分的"断续错误"

第四条 AWS 记录是 2026-10-29 的 US-WEST-2(俄勒冈),形态和前面完全不同——不是断电,是间歇性错误:

时段(PDT)换算 UTC表现
07:27 – 08:4714:27 – 15:47HTTP API 间歇性 invoke 错误与延迟升高(1 小时 20 分)
10:47 – 16:1517:47 – 23:15第二段,其中 15:12–15:45 为影响峰值(5 小时 28 分)
15:4522:45官方实施缓解措施(root cause: "an issue with an internal subsystem")
16:1523:15确认完全恢复

总跨度 6 小时 48 分,但真正的高影响窗口只有 33 分钟(15:12–15:45)。官方的处置描述里有一句值得抄进你自己的复盘模板:"Majority of retry attempts for affected requests were succeeding."——意思是带重试的客户端基本无感,不带重试的客户端直接报错。

这就是"同一场事故,两种用户体验"的机制来源。它把 2026-10-29 那篇尾延迟文章的结论补上了一个因果:p99 恶化的那部分用户,很可能就是没有重试逻辑的那部分。 对选地区的意义是:同样的地区,客户端有没有指数退避重试,决定了你在这 6h48m 里是"慢"还是"挂"。

八、今天实测:从美西节点到 9 个地区的当前 RTT

事故数据是历史,延迟是当下。2026-10-30 06:03–06:05 UTC,同一台节点(38.55.134.58,AS402169)对 9 个地区的 Vultr 测速点各打 20 个 ICMP 包(-i 0.3),结果如下:

地区minavgmaxmdev相对洛杉矶
洛杉矶(lax-ca)8.87 ms15.79 ms41.50 ms8.93基准
芝加哥(il-us)43.79 ms54.96 ms164.33 ms26.55+39.2 ms
新泽西(nj-us)68.34 ms71.76 ms84.95 ms4.87+56.0 ms
东京(hnd-jp)100.99 ms107.40 ms165.37 ms14.07+91.6 ms
首尔(sel-kor)133.51 ms135.95 ms141.60 ms2.14+120.2 ms
伦敦(lon-gb)131.51 ms135.69 ms183.86 ms11.26+119.9 ms
法兰克福(fra-de)144.06 ms149.17 ms177.19 ms8.33+133.4 ms
悉尼(syd-au)148.52 ms152.44 ms181.73 ms7.28+136.7 ms
新加坡(sgp)172.01 ms186.02 ms264.95 ms20.96+170.2 ms

这批数字今天整体偏差,必须标注:洛杉矶 avg 15.79 ms、mdev 8.93 ms,而本节点在 10 月 16 日那次基线里洛杉矶是 9~10 ms 量级;芝加哥 max 164 ms、新加坡 max 265 ms、新加坡 mdev 21 ms 都属于"当天不平滑"。所以这张表只用于横向比较相对远近,不能当作绝对基线;要判断地区好坏,请按 2026-10-23 那篇的方法做 21 天漂移复测。

真正有用的读法是把 min 列当"路径物理下限":洛杉矶 8.87 / 新泽西 68.34 / 伦敦 131.51 / 悉尼 148.52 / 新加坡 172.01。min 列今日依然单调、无异常跳变,说明路由没有绕路,抖的是排队而不是路径。

九、把事故换算成钱:冗余预算价格表

前面所有数据最终要落到一个决策上:为"少出事"多付多少。这里把四种典型冗余形态和它们的月增量成本列清楚。单价全部标注来源日期,本期未复测的部分如实写"历史抓取值"。

冗余形态月增量成本(参考)覆盖的故障半径本文对应证据
单区单机$0无212 起样本中约 25% 是地区级,直接全损
同区多 AZ(第二台实例)实例费 ×1AZ 级AWS mec1-az2 电力故障(03-01)被另外两个 AZ 兜住
跨区热备 + 跨区复制实例费 ×1 + $0.02/GB 跨区流量Region 级GCP us-central1 29.8 h、AWS us-west-2 6 h 48 m
跨云热备实例费 ×1 + $0.075~0.15/GB 出网厂商级中东两区官方确认"不可恢复"
异地冷备(对象存储)$0.023/GB·月 + 恢复时出网费数据丢失09-15 官方"无法恢复 mec1-az2 独有数据"

单价来源:AWS 跨区数据传输 $0.02/GB 与 S3 Standard $0.023/GB·月 为 2026-10-07 抓取的公开定价;腾讯云国际站按流量出网 $0.075~0.15/GB 为 2026-10-02 抓取(弗吉尼亚最低、圣保罗最高),不同地区单价不同,具体以控制台结算页为准。

9.1 一个算例:100 GB 数据 + 1 TB/月流量

方案月成本相对单机
单区单机$0—
同区第二台实例约 1 个实例费+100% 的实例费
跨区热备(复制 100 GB + 回源 1 TB/月)100 GB × $0.02 + 1 TB × $0.02 = $22.4+$22.4/月
跨云热备(同样流量)100 GB × $0.075 + 1 TB × $0.075 ≈ $84(上限 $168)+$84~168/月
异地冷备(只存不热)100 GB × $0.023 = $2.3/月+$2.3/月;恢复时另付出网费与数小时停机

这张表最重要的一行是最后一行:$2.3/月 的冷备,防的是 09-15 那种"数据永久消失"的场景——而它比跨云热备便宜 36~73 倍。 也就是说:先花 $2.3 买"不会永久丢数据",再考虑花 $84 买"不停机"。 顺序反了的话,你花大钱买的是 RTO,而不是 RPO——而本文样本里唯一不可挽回的损失是 RPO 问题(数据没了),不是 RTO 问题(恢复慢点)。

9.2 按业务类型的地区决策矩阵

业务类型可接受停机建议冗余关键证据
外贸展示站 / 落地页1~4 小时单区 + 每日冷备 + 换 IP 预案中位故障 1.4~3.7 h,冷备足够
独立站 + 支付30 分钟同区多 AZ + 跨区冷备AZ 级故障概率高于 Region 级
API 后端(有重试)1 小时跨区热备(双活读)10-29 案例:带重试的客户端基本无感
API 后端(无重试)10 分钟跨区双活 + 客户端退避重试先改同上,但用户侧直接报错
数据库主库0(不能丢)跨区同步/半同步 + 异地冷备中东案例:多 AZ 也救不了物理损毁
代理 / 中转节点1 小时多地区各 1 台,DNS 权重Cloudflare 337 个 PoP 只有 2.1% 出过事
备份仓库不适用(不能丢)与源站不同厂商 + 不同地理政治区09-15 "exclusively in this Region"
邮件服务器4 小时同区 + 备用 MXGCP 8 起中 6 起点名单一地区

十、落地清单:五件今天就能做的事

  1. 把"事故记录"写进采购验收:下单前拉一次该厂商的 incidents.json,统计近 50 起的地区归因与中位时长。四家的接口都是公开的,30 秒能跑完(脚本见 2.2 节)。
  2. 备份验收改成"恢复演练":不看备份任务的成功率,看"从备份恢复一次要多久、数据少了多少"。本文里唯一不可恢复的数据,备份任务是"成功"的。
  3. 给客户端加退避重试:10-29 那次 6h48m 的窗口里,官方明说"多数重试成功"。这是零成本拿到的可用性。
  4. 冗余按"小时"设计,不按"起数"设计:Linode 的地区故障 87% 是单点事故,但 73% 的故障时间来自 2 起多点事故。你的预算该对着后者。
  5. 状态页只当"证据",不当"账本":用它判断"哪些地区被反复点名",不要用它算 SLA 赔偿(10% 的 Cloudflare 记录时间戳是反的)。

总结

选地区这件事,能被数据回答的部分比想象中少,但也不是没有:

  • 能回答的:哪些地区被反复点名(Cloudflare 337 个 PoP 里 2.1% 出过事,Ashburn 一个点占 75%)、故障是单点还是多点(Linode 2 起多点事故 = 104.8 小时 = 单点总时长的 3.1 倍)、以及"永久损失"是否真实存在(AWS 中东两区,官方确认数据不可恢复)。
  • 不能回答的:哪个厂商最稳(记账粒度不可比)、换个地区能不能恢复更快(三家样本方向不一致)、SLA 数字准不准(10% 的记录时间戳是反的)。

所以正确的用法是把它当"风险清单"而不是"排行榜":先用事故记录确认"这个地区有没有被反复点名",再用冗余预算表决定"为它花多少钱",最后用恢复演练验证"钱花对了没有"。 三步里最便宜的是第一步(一个 curl),最贵也最容易被跳过的是第三步。

如果你想直接跳过取数与换算,用一台已经跑通的节点作为参照系来评估目标地区,可以从 6.chengzicloud.cloud 的地区列表入手,按需选点、按小时或按月开通,买之前先跑 48 小时测试再决定长期方案——比在任何榜单上找答案都快。

相关阅读

本文事故数据采集于 2026 年 10 月 30 日 06:00–06:08 UTC(4 家 Statuspage 接口、GCP incidents.json、AWS all.rss,共 212 起事故 / 29.9 MB 原始 JSON);网络实测于同一时段从美国西海岸圣何塞节点 38.55.134.58(AS402169 Uscloud)发起。厂商状态页为滚动窗口,数据会随时间变化,具体事故以各厂商官方状态页为准;价格部分标注了抓取日期,购买前请以控制台结算页为准。

本文由 6.chengzicloud.cloud 提供,点击访问首页了解更多

常见问题(FAQ)

这份数据能说明哪个厂商最稳定吗?

不能。四家的记账粒度差异(GitHub 每 30 天 20 起、Linode 4.6 起)和窗口长度差异(63 天 vs 329 天),用公开数据无法分离"真实可靠性"与"记账密度"。这份数据能回答的是"某个厂商的某个地区被点名多少次、每次多久"。

为什么 Cloudflare 的事故记录里会出现负数时长?

Statuspage 在事故被合并或重开时改写 resolved_at 但保留原始 created_at,也有条目先建事件后补描述。本次 50 条里 5 条为负(-19 到 -75 分钟),占 10%。

中位数和 p90 该用哪个?

中位数回答"典型一次多久",p90 回答"最差的那 10% 有多差"。写预案用 p90,写对外承诺用中位数会低估风险——四家的 p90/中位都在 4.7~8.1 倍。

GCP 的中位 8.4 小时和 Cloudflare 的 81 分钟可以直接比吗?

不能。GCP 的 incidents.json 只收 SERVICE_DISRUPTION 及以上,minor 不进文件;Statuspage 家连轻微抖动都记。跨厂商比 MTTR 必须先确认"收不收 minor"。

多 AZ 到底能不能防住区域级故障?

防不住"区域内共享服务"故障。GCP 10-08 的 us-central1 事故影响的是区域级对象存储,两个 zone 同时受影响;AWS 官方也写了中东事件的损坏"exceeded what our regional and multi-AZ services are designed to withstand"。

AWS 中东那两个区域现在还能买吗?

me-central-1 与 me-south-1 官方在 2026-09-15 明确"无法恢复该区域/该 AZ 上独有的数据",me-south-1 整个区域不可用。新业务不应把主数据放在这两个区域;已有业务应按官方建议迁到其他区域。

状态页轮询一个月 35.8 GB,会很贵吗?

入方向流量通常不计费,贵的是解析开销和 API 限额。用条件请求可以把单次成本降到 0 字节(本次实测 5 个接口返回 304),AWS RSS 除外——它忽略 If-None-Match,永远返回 57.8 KB 全量。

今天测的 RTT 为什么比历史基线高?

本次洛杉矶 avg 15.79 ms / mdev 8.93 ms,高于 10-16 基线的 9~10 ms 量级,属于当天抖动偏高。min 列无异常跳变,说明路径未绕路。绝对基线请按 21 天漂移复测的方法重新取。

"故障半径"和"可用性百分比"哪个更该写进合同?

可用性百分比是结果,故障半径是原因。同样的 99.9%,一个来自"每月一次 43 分钟的单点抖动",另一个来自"每季度一次 4 小时的区域故障",对你的架构要求完全不同。谈判时把"是否提供按地区的事故历史"写进条款,比争 0.09% 更有用。

这篇的数据多久会过期?

Statuspage 的 incidents.json 是滚动窗口(最近 50 起),Cloudflare 63 天就滚完一轮,Linode 要 329 天。建议每季度重跑一次脚本,重点看两个数:某地区"被点名次数"是否进入前三、"单点 vs 多点"的比例是否变化。