海外服务器地区稳定性怎么查?AWS、GCP、Cloudflare、DigitalOcean、Linode 官方事故记录 212 起复盘
「这个地区稳不稳」是选机房时唯一没法试用出来的指标——延迟可以 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 秒内复现,而不是相信我给的数字。
| 数据源 | 接口 | 返回内容 | 本次样本 |
|---|---|---|---|
| Cloudflare | cloudflarestatus.com/api/v2/incidents.json | 最近 50 起事故 + 组件 + 更新 | 50 起 / 140 KB |
| DigitalOcean | status.digitalocean.com/api/v2/incidents.json | 同上 | 50 起 / 208 KB |
| Linode (Akamai) | status.linode.com/api/v2/incidents.json | 同上 | 50 起 / 830 KB |
| GitHub | www.githubstatus.com/api/v2/incidents.json | 同上 | 50 起 / 312 KB |
| Google Cloud | status.cloud.google.com/incidents.json | 全量事故 + 受影响地区 + 影响等级 | 8 起 / 251 KB |
| AWS | status.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}'):
| 接口 | DNS | TCP | TLS | TTFB | 单次字节 | 每分钟轮询一个月 |
|---|---|---|---|---|---|---|
| Cloudflare | 29 ms | 42 ms | 262 ms | 548 ms | 140,375 | 6.1 GB |
| DigitalOcean | 29 ms | 33 ms | 224 ms | 294 ms | 207,618 | 9.0 GB |
| Google Cloud | 29 ms | 31 ms | 204 ms | 227 ms | 251,117 | 10.9 GB |
| GitHub | 29 ms | 147 ms | 530 ms | 839 ms | 312,148 | 13.5 GB |
| Linode | 29 ms | 151 ms | 560 ms | 775 ms | 829,644 | 35.8 GB |
| AWS RSS | 29 ms | 101 ms | 397 ms | 630 ms | 57,820 | 2.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 后 |
|---|---|---|
| Cloudflare | ETag: W/"140375-..." | 304 / 0 字节 / 289 ms |
| DigitalOcean | ETag: W/"6367be4c..." | 304 / 0 字节 / 231 ms |
| Linode | ETag: W/"ec3adfe0..." | 304 / 0 字节 / 659 ms |
| GitHub | ETag: W/"72e303d2..." | 304 / 0 字节 / 671 ms |
| Google Cloud | 无 ETag,有 Last-Modified | 304 / 0 字节 / 246 ms |
| AWS RSS | 有 ETag | 200 / 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 小时挂起 | 可用样本 |
|---|---|---|---|---|
| Cloudflare | 50 | 5 | 2 | 44 |
| DigitalOcean | 50 | 0 | 3 | 50 |
| Linode | 50 | 0 | 12 | 38 |
| GitHub | 50 | 0 | 0 | 50 |
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 组件) |
|---|---|---|---|---|
| Cloudflare | 37 | 7 | 0 | 0 |
| DigitalOcean | 36 | 12 | 2 | 0 |
| Linode | 25 | 13 | 2 | 10 |
| GitHub | 46 | 0 | 0 | 0 |
这张表本身就是本文最重要的一个发现:四家厂商的状态页里,超过 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 条数 | 打标签事故 |
|---|---|---|---|---|---|---|---|
| GitHub | 2026-08-13 → 10-29 | 76 | 20.0 | 73 min | 594 min | 0 | 0 |
| Cloudflare | 2026-08-27 → 10-30 | 63 | 24.2 | 81 min | 378 min | 2 | 0 |
| DigitalOcean | 2026-04-28 → 10-27 | 182 | 8.4 | 166 min | 1,253 min | 3 | 0 |
| Linode | 2025-12-03 → 10-28 | 329 | 4.6 | 223 min | 1,476 min | 12 | 10 |
三个必须一起读的注解:
注解一:频率差 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) | 中位时长 | 地区级相对全局 |
|---|---|---|---|---|---|
| Cloudflare | 7 | 93 min | 37 | 77 min | 慢 21% |
| DigitalOcean | 14 | 200 min | 36 | 158 min | 慢 27% |
| Linode | 12 | 139 min | 17 | 258 min | 快 46% |
| GitHub | 0 | — | 46 | 89 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) | 3 | 1,217 min(20.3 h) | 1,059 min | 75% |
| Portland, United States - (PDX) | 1 | 106 min | 106 min | 7% |
| Seattle, United States - (SEA) | 1 | 106 min | 106 min | 7% |
| Los Angeles, United States - (LAX) | 1 | 93 min | 93 min | 6% |
| Stockholm, Sweden - (ARN) | 1 | 64 min | 64 min | 4% |
| Lisbon, Portugal - (LIS) | 1 | 45 min | 45 min | 3% |
这张表最值得看的是分母:337 个边缘节点里,63 天只有 7 个出过事(2.1%),而 Ashburn 一个点吃掉了 75% 的地区故障时长。 这说明两件事:第一,Cloudflare 的地区故障是极端长尾分布,任何"平均一下每个 PoP 多久出一次事"的算法都会失真;第二,如果你恰好把源站或回源链路绑在 IAD(美东),你遭遇 Cloudflare 侧地区故障的概率比绑在法兰克福高一个量级。
DigitalOcean(182 天,10 个机房被点名,累计 7,561 分钟)
| 机房 | 次数 | 累计时长 | 最长单次 | 占比 |
|---|---|---|---|---|
| NYC1 | 4 | 2,765 min(46.1 h) | 1,736 min | 37% |
| NYC3 | 5 | 1,206 min(20.1 h) | 562 min | 16% |
| MKC1 | 2 | 1,010 min(16.8 h) | 505 min | 13% |
| FRA1 | 3 | 586 min(9.8 h) | 293 min | 8% |
| BLR1 | 9 | 516 min(8.6 h) | 341 min | 7% |
| NYC2 | 4 | 472 min(7.9 h) | 118 min | 6% |
NYC1 的 46.1 小时除以窗口 182 天 = 1.05% 的时间被点名。注意这是"组件被点名"不是"你的实例不可用",真实影响面还要看这 46 小时里有多少是全机房。BLR1(班加罗尔)次数最多(9 次)但累计时长只有 8.6 小时,形态是"频繁小抖动"而不是"长时间宕机"——这也是选地区时要区分的东西:高频短故障适合自动重试,低频长故障才需要跨区冗余。
Linode(329 天,17 个机房被点名,累计 52,122 分钟)
| 机房 | 次数 | 累计时长 | 最长单次 | 占比 |
|---|---|---|---|---|
| US-SEA (Seattle) | 3 | 6,940 min(115.7 h) | 6,225 min | 13% |
| US-ORD (Chicago) | 2 | 6,569 min(109.5 h) | 6,225 min | 13% |
| US-MIA (Miami) | 3 | 6,395 min(106.6 h) | 6,225 min | 12% |
| US-IAD (Washington) | 2 | 6,364 min(106.1 h) | 6,225 min | 12% |
| IN-MAA (Chennai) | 1 | 6,225 min(103.8 h) | 6,225 min | 12% |
| US-LAX (Los Angeles) | 1 | 6,225 min(103.8 h) | 6,225 min | 12% |
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:37 | 02-27 14:35 | 2.0 h | INFORMATION | Global + Montréal / São Paulo / Iowa 等 |
| 2026-06-05 07:00 | 06-26 19:00 | 516.0 h(21.5 天) | DISRUPTION | Delhi (asia-south2) + Global |
| 2026-07-14 17:00 | 07-15 03:40 | 10.7 h | DISRUPTION | Melbourne + Frankfurt (europe-west3) |
| 2026-07-15 23:57 | 07-16 12:25 | 12.5 h | DISRUPTION | Netherlands (europe-west4) |
| 2026-08-20 15:40 | 08-20 19:20 | 3.7 h | OUTAGE | Global + Oregon (us-west1) |
| 2026-09-01 14:42 | 09-01 18:52 | 4.2 h | DISRUPTION | Multi-region nam5 + Iowa (us-central1) |
| 2026-10-08 11:00 | 10-09 16:46 | 29.8 h | DISRUPTION | Iowa (us-central1) |
| 2026-10-20 06:00 | 10-20 12:08 | 6.1 h | DISRUPTION | London (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-03 | 34 条更新,状态在 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) |
这七个时间点里有三条对"选地区"是硬约束:
- 起点是一个 AZ 的电力故障(mec1-az2),不是整个区域。3 月 1 日那天,多 AZ 架构确实扛住了——业务在另外两个 AZ 继续跑。这印证了多 AZ 的有效性。
- 四月底升级为区域级不可用,原因是"冲突造成的物理损坏"。这是任何 SLA、任何架构设计都无法覆盖的变量:不是软件缺陷、不是容量不足,是机房本身被打坏了。
- 九月十五日官方明确"无法恢复"该 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:47 | 14:27 – 15:47 | HTTP API 间歇性 invoke 错误与延迟升高(1 小时 20 分) |
| 10:47 – 16:15 | 17:47 – 23:15 | 第二段,其中 15:12–15:45 为影响峰值(5 小时 28 分) |
| 15:45 | 22:45 | 官方实施缓解措施(root cause: "an issue with an internal subsystem") |
| 16:15 | 23: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),结果如下:
| 地区 | min | avg | max | mdev | 相对洛杉矶 |
|---|---|---|---|---|---|
| 洛杉矶(lax-ca) | 8.87 ms | 15.79 ms | 41.50 ms | 8.93 | 基准 |
| 芝加哥(il-us) | 43.79 ms | 54.96 ms | 164.33 ms | 26.55 | +39.2 ms |
| 新泽西(nj-us) | 68.34 ms | 71.76 ms | 84.95 ms | 4.87 | +56.0 ms |
| 东京(hnd-jp) | 100.99 ms | 107.40 ms | 165.37 ms | 14.07 | +91.6 ms |
| 首尔(sel-kor) | 133.51 ms | 135.95 ms | 141.60 ms | 2.14 | +120.2 ms |
| 伦敦(lon-gb) | 131.51 ms | 135.69 ms | 183.86 ms | 11.26 | +119.9 ms |
| 法兰克福(fra-de) | 144.06 ms | 149.17 ms | 177.19 ms | 8.33 | +133.4 ms |
| 悉尼(syd-au) | 148.52 ms | 152.44 ms | 181.73 ms | 7.28 | +136.7 ms |
| 新加坡(sgp) | 172.01 ms | 186.02 ms | 264.95 ms | 20.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(第二台实例) | 实例费 ×1 | AZ 级 | 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 小时 | 同区 + 备用 MX | GCP 8 起中 6 起点名单一地区 |
十、落地清单:五件今天就能做的事
- 把"事故记录"写进采购验收:下单前拉一次该厂商的
incidents.json,统计近 50 起的地区归因与中位时长。四家的接口都是公开的,30 秒能跑完(脚本见 2.2 节)。 - 备份验收改成"恢复演练":不看备份任务的成功率,看"从备份恢复一次要多久、数据少了多少"。本文里唯一不可恢复的数据,备份任务是"成功"的。
- 给客户端加退避重试:10-29 那次 6h48m 的窗口里,官方明说"多数重试成功"。这是零成本拿到的可用性。
- 冗余按"小时"设计,不按"起数"设计:Linode 的地区故障 87% 是单点事故,但 73% 的故障时间来自 2 起多点事故。你的预算该对着后者。
- 状态页只当"证据",不当"账本":用它判断"哪些地区被反复点名",不要用它算 SLA 赔偿(10% 的 Cloudflare 记录时间戳是反的)。
总结
选地区这件事,能被数据回答的部分比想象中少,但也不是没有:
- 能回答的:哪些地区被反复点名(Cloudflare 337 个 PoP 里 2.1% 出过事,Ashburn 一个点占 75%)、故障是单点还是多点(Linode 2 起多点事故 = 104.8 小时 = 单点总时长的 3.1 倍)、以及"永久损失"是否真实存在(AWS 中东两区,官方确认数据不可恢复)。
- 不能回答的:哪个厂商最稳(记账粒度不可比)、换个地区能不能恢复更快(三家样本方向不一致)、SLA 数字准不准(10% 的记录时间戳是反的)。
所以正确的用法是把它当"风险清单"而不是"排行榜":先用事故记录确认"这个地区有没有被反复点名",再用冗余预算表决定"为它花多少钱",最后用恢复演练验证"钱花对了没有"。 三步里最便宜的是第一步(一个 curl),最贵也最容易被跳过的是第三步。
如果你想直接跳过取数与换算,用一台已经跑通的节点作为参照系来评估目标地区,可以从 6.chengzicloud.cloud 的地区列表入手,按需选点、按小时或按月开通,买之前先跑 48 小时测试再决定长期方案——比在任何榜单上找答案都快。
相关阅读
- 海外服务器延迟只看平均值会选错机房:11 个地区 p50/p95/p99 尾延迟与抖动实测
- 海外服务器多 AZ 与跨区实测:可用区之间的延迟与流量费到底值不值
- 海外服务器延迟基线漂移与复测可复现性:同一批端点,21 天后差了多少
- 海外服务器高可用与容灾架构:从单机到多活的四种形态
- 海外服务器备份、快照与对象存储选址:RPO/RTO 与出网费的取舍
- 海外服务器售后、时区与 SLA 换算:99.9% 到底是几小时
本文事故数据采集于 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 多点"的比例是否变化。