11月12日,也就是双十一后的第一天,阿里云发生了一场史诗级大翻车。根据阿里云官方的服务状态页[1],全球范围内所有可用区 x 所有服务全部都出现异常,时间从 17:44 到 21: 11,共计3小时16分钟。
阿里云 Status Page
根据阿里云公告[2]称:“云产品控制台、管控API等功能受到影响,OSS、OTS、SLS、MNS 等产品的服务受到影响,大部分产品如 ECS、RDS、网络等的实际运行不受影响”。
不过大量依赖阿里云服务的应用 APP,包括阿里自己的一系列应用:淘宝,钉钉,闲鱼,… 都出现了问题。产生了显著的外部影响,APP崩了的新闻组团冲上了热搜。淘宝刷不出聊天图片,闪送上传不了接单凭据,充电桩用不了,原神发不出验证码,饿了么下不了单,骑手进不了系统,点不了外卖、停车场不抬杆、超市无法结账。甚至有的学校因此无法用智能公共洗衣机和开水机。无数在周末休息中的研发与运维人员被喊起来加班排障……
包括金融云,政务云在内的区域也无一幸免。阿里云应该感到万幸:故障不是发生在双十一当天,也不在衙门与钱庄的工作时间段,否则大家说不定能上电视看故障复盘了。
尽管阿里云至今仍未给出一份事后故障复盘报告,但老司机根据爆炸半径,就足以判断出问题在哪里了 —— 鉴权组件 / Auth 服务。
原因很简单,能让全球所有区域同时出问题的肯定不会是机房/硬件故障,而是跨区域共用的云基础设施组件 —— 要么是认证,要么是计费,极低概率是其他全局性服务。
根因出在认证服务上的可能性最大,因为被管控的资源:类似云服务器 ECS / 云数据库 RDS 仍然可以继续运行,用户只是无法通过控制台/API对其进行管理操作;然而深度与云API/认证集成的对象存储 OSS (S3),表格存储 OTS , SLS,MNS 服务本身可用性直接受到影响。另外一个可以排除的付费服务的现象是:故障期间还有用户成功付款 薅下了ECS的羊毛。
不仅仅是 OSS,使用其他深度集成 IAM/认证 服务类的云产品也会有这样的问题,比如 OTS,SLS,MNS 等等。例如,对标 DynamoDB 的 OTS 同样出现了问题,这是因为 OTS 不像 RDS for PostgreSQL / MySQL 使用数据库自身认证,而是直接用IAM。
尽管上面的分析过程只是一种推断,但它与流传出来的内部消息相吻合:认证挂了导致所有服务异常。至于认证服务本身到底是怎么挂的,在尸检报告出来前我们也只能猜测:根据各种先例来看,人为配置失误的可能性最大,比如有小道消息称:
一位了解内部信息的人士表示:“这次双11期间,技术人员连续一周加班加点,双11一过,大家都松懈了。有个新手写了一段代码,更新了组件,导致了本次的断网。
如果真的是这样的原因导致认证服务不可用,那可真的是 草台班子 到家了。尽管听上去很离谱,但也不算太令人惊奇。再次强调,以上为路边社消息与合理推论,具体事故原因请以阿里云官方给出的复盘分析报告为准。
像认证这样的基础组件一旦出现问题,影响是灾难性的。这会导致整个云管控面不可用,伤害会波及到控制台,API,以及深度依赖云认证基础设施的服务,比如 OSS、OTS、SLS、MNS。尽管从公告上看来好像只有几个服务受到影响,但 OSS 这样的基础性服务出了问题,带来的爆炸半径是难以想象的,绝非“个别服务受到影响” 就能敷衍过去。
对象存储 OSS (Amazon S3)这样的服务不同于虚拟机这种资源,是通过云厂商包装的 HTTP API 对外提供服务的,因此必然深度依赖认证组件:你需要AK/SK / IAM签名才能使用这些 HTTP API,而认证服务故障将导致这类服务本身不可用。
但是对象存储 OSS 实在是太重要了,可以说对象存储是云计算的“定义性服务”,也许是唯一一个在所有云厂商上能达成共识与标准的服务。云厂商的各种“上层”服务或多或少都直接/间接地依赖 OSS,例如 ECS/ RDS 虽然可以运行,但 ECS 快照和 RDS 备份显然是深度依赖 OSS 的,CDN 回源是依赖 OSS 的,各个服务的日志往往也是写入 OSS 的。
从现象上看,核心功能跟 OSS 深度绑定的阿里云盘就挂的很惨烈,核心功能跟 OSS 关系不大的服务,比如高德地图就没听说有什么大影响。大部分相关应用的状态是,主体可以正常打开运行,但是和图片展示,文件上传/下载文件这类有关的功能就不可用了。
有一些实践减轻了对 OSS 的冲击:比如通常被认为是不安全的 —— 不走认证的 PUBLIC 存储桶就不受影响;CDN 的使用也缓冲了 OSS 的问题:淘宝商品图片走 CDN 缓存还可以正常看到,但是买家聊天记录里实时发送的图片直接走 OSS 就挂了。
不仅仅是 OSS,使用其他深度集成 IAM/认证 服务类的云产品也会有这样的问题,比如 OTS,SLS,MNS 等等。例如,对标 DynamoDB 的表格存储服务 OTS 同样出现了问题,这是因为 OTS 不像 RDS for PostgreSQL / MySQL 使用数据库自身的认证机制,而是与云厂商的 Auth 深度绑定。
那么这件事对于阿里云本身会有什么影响呢?首先当然是违反 SLA 产生的赔偿,3个半小时的故障范围,当月可用性指标应当为 99.5%,落在绝大多数服务 SLA 赔偿标准的中间档位上,也就是补偿用户月度服务费用 25%-30% 的代金券。特殊的是这一次故障的区域范围和服务范围是全部!
OSS的SLA页
当然阿里云也可以主张说虽然 OSS / OTS 这些服务挂了,但他们的 ECS/RDS 只挂了管控面,不影响正在运行的服务所以不影响 SLA。说起来这种补偿即使是真的全部落地也没几个钱,更像是一种安抚性的姿态:毕竟和用户的业务损失比,赔个服务月消 25%代金券简直就是一种羞辱。
比起用户信任、技术声望以及商誉折损而言,赔的那点代金券真的算不上什么。这次事件如果处理不当,很有可能会成为公有云拐点级别的标志性事件。
马斯克的推特 X 和 DHH 的 37 Signal 通过下云省下了千万美元真金白银,创造了降本增效的“奇迹”,让下云开始成为一种潮流。云上的用户在对着账单犹豫着是否要下云,还没上云的用户更是内心纠结是否还要上去。在这样的背景下,作为本土云领导者的阿里云发生如此重大故障,对于犹豫观望者的信心无疑是沉重的打击。恐怕此次故障会成为公有云拐点级别的标志性事件。
阿里云一向以安全稳定高可用自居,上周还刚刚在云栖大会上吹极致稳定性之类的牛逼。但是无数层所谓的的灾备,多活,多中心,降级方案,被一次性全部击穿,打破了N个9神话。如此大范围、长时间、影响面如此广的故障,更是创下了云计算行业的历史记录。包括金融云和政务云在内(是否是私有化部署的版本?)也同样出现了服务不可用。
阿里云全球故障揭示出出关键基础设施的巨大风险:完全依托于公有云厂商的大量 Web 服务缺乏基本的自主可控性:在故障发生时除了等死做不了别的事情。同时也展现了垄断中心化基础设施的脆弱性:互联网。这个去中心化的世界奇迹现在主要是在少数几个大公司/云厂商拥有的计算机上运行。如果 AWS 的主要区域之一出现故障,几乎一半的互联网都会随之下线。某个云厂商本身成为了最大的业务单点,这可不是互联网设计的初衷!
而这次更为严峻的挑战恐怕还在后面,来自全球用户的追索赔钱事还小,真正要命的是在各个国家都在强调数据主权的时候,如果因为在中国境内的某个控制中心配置失当导致全球故障的话,(即:你真的卡了别人的脖子)我相信很多海外客户会立即采取行动,迁移到别的云供应商上:这关乎合规,与可用性无关。
去年十二月阿里云香港机房的故障已经暴露出来了许多的问题,然而一年后没有不见改进反而来了一个更大的惊喜。这样的事故对于阿里云的品牌形象绝对是致命打击,往大了说,像这样的故障对整个行业的声誉都有严重的损害。阿里云应该尽快给用户一个解释与交代,发布详细的故障复盘报告,讲清楚后续改进措施,挽回声誉与用户的信任。
毕竟,这种规模的故障,已经不是“杀一个程序员祭天”能解决的事了,得由 CEO 亲自出面解决。例如 Cloudflare 月初的管控面故障,CEO 亲自出来写了详细的事后复盘分析[3]。不幸的是,阿里云经过了几轮裁员,一年连换了三轮 CEO ,恐怕已经难有能出来扛事接锅的人了。
往者不可留,逝者不可追,比起哀悼无法挽回的损失,更重要的是从损失中吸取教训 —— 要是能从别人的损失中吸取教训那就更好了。所以,我们能从阿里云这场史诗级故障中学到什么?
不要把鸡蛋放在同一个篮子里,业务域名解析一定要套一层 CNAME,且 CNAME 域名用不同服务商的解析服务。这个中间层对于阿里云这样的故障非常重要,用另外一个 DNS 供应商,至少可以给你一个把流量切到别的地方去的选择,而不是干坐在屏幕前等死,毫无自救能力。
区域优先使用杭州与北京可用区,阿里云故障恢复明显有优先级,阿里云总部所在地的杭州(华东1)和北京(华北2)故障修复的速度明显要比其他区域快很多,这两个区域可以考虑优先使用。虽然同样都是吃故障,但你可以和阿里自家云上业务享受同种优先待遇了。
谨慎使用需要额外认证的服务:认证鉴权这样的服务属于基础中的基础,大家都期待它可以始终正常工作。然而越是人们感觉不可能出现故障的东西,真的出现故障时产生的杀伤力就越是毁天灭地。深度使用云厂商提供的 AK/SK/IAM 不仅会让自己陷入供应商锁定中,更是将自己暴露在云基础设施单点的问题里。例如在这次故障中,不使用云厂商认证体系的的 ECS/RDS 本身没有受到直接冲击:管控失能无法发起变更,但现有资源仍然可用。
谨慎使用云服务,优先使用纯资源。类似 ECS/ESSD 这样的资源以及单纯使用这两者的 RDS,可以不受管控面故障影响继续运行。然而 OSS 对象存储这样的服务会对云基础设施有额外的依赖,额外的依赖意味着额外的失效点。只使用基础云资源的另一个好处是,它们是所有云厂商的提供服务的最大公约数,有利于用户在不同公有云、以及本地自建中间择优而选。
不过,很难想象在公有云上却不用对象存储 —— 在 ECS 和天价 ESSD 上用 MinIO 自建对象存储服务并不是真正可行的选项,这涉及到公有云商业模式的核心秘密:廉价S3获客,天价EBS杀猪。
自建是掌握自己公司命运的最佳手段:如果用户想真正掌握自己的命运,最终恐怕都会走上下云自建这条路。当年互联网先辈们平地起高楼创建了这些服务,而现在只会容易的多:纯资源云与开源平替的出现让这件事变得容易太多了。IDC2.0 + 开源自建的组合越来越有竞争力:短路掉公有云这个中间商,直接与 IDC 合作显然是一个更经济实惠的选择。
在当下供过于求的情况下,稍微有点规模的用户下云省下的钱可以换几个从大厂出来的资深SRE还能盈余不少。毕竟,自家人出问题你可以进行奖惩激励督促其改进,但是云出问题能赔给你几毛钱代金券,又能顶什么用呢?
明确云厂商的 SLA 是营销工具,而非战绩承诺
在云计算的世界里,服务等级协议(SLA)曾被视为云厂商对其服务质量的承诺。然而,当我们深入研究这些由一堆9组成的 SLA 时,会发现它们并不能像期望的那样“兜底”:你以为给自己的服务上了保险可以高枕无忧,但其实白花花的银子买的是提供情绪价值的安慰剂。与其说是 SLA 是对用户的补偿,不如说 SLA 是对云厂商服务质量没达标时的“惩罚”。
比起会因为故障丢掉奖金与工作的专家工程师来说,SLA的惩罚对于云厂商属于是自罚三杯,不痛不痒。如果惩罚没有意义,那么云厂商也没有动力会提供更好的服务质量。用户遇到问题时只能提工单等死。所以,SLA 对用户来说不是兜底损失的保险单。在最坏的情况下,它是堵死了实质性追索的哑巴亏。在最好的情况下,它才是提供情绪价值的安慰剂。
尊重技术,善待工程师
阿里云这两年走了很多人:学人家马斯克推特大裁员降本增效,人家裁几千个;你几万几万的裁;队伍动荡,人心不稳,稳定性自然会受到影响。推特一天挂几次,用户捏着鼻子骂两句继续凑合用,ToB 业务跟着连环裁员连环挂,你看企业用户可忍得了这个?
很难说这跟企业文化没有关系:996 修福报,大把时间内耗在无穷的会议汇报上。领导不懂技术,负责汇总周报写PPT吹牛逼,P9 出嘴;P8 带队,真正干活的可能都是些新鲜从业务线薅来的 P6和P7 ;顶尖技术人才与真正能打的人才根本不吃这一套PUA 窝囊气,成批出来创业单干 —— 环境盐碱地化:学历门槛越来越高,人才密度却越来越低。
我亲自见证的例子是,一个独立开源贡献者单人搞的 开源 RDS for PostgreSQL,可以骑脸输出几十人 RDS 团队的产品,而对方团队甚至连发声辩白反驳的勇气都没有 —— 阿里云确实不缺足够优秀的产品经理和工程师,但请问这种事情为什么可能会发生呢?这是应该反思的问题。
阿里云作为本土公有云中的领导者,应当是一面旗帜 —— 所以它可以做的更好,而不应该是现在这幅样子。作为曾经的阿里人,我希望阿里云能吸取这次故障的教训,尊重技术,踏实做事,善待工程师。更不要沉迷于杀猪盘快钱而忘记了自己的初心愿景 —— 为用户提供物美价廉的公共计算资源,让计算和存储资源像水电一样普及。
[1]
服务状态页: https://status.aliyun.com/#/[2]
阿里云公告: https://help.aliyun.com/noticelist/articleid/1064981333.html?spm=a2c4g.789004748.n2.6.3ebb1865LCNVhx[3]
事后复盘分析: https://blog.cloudflare.com/post-mortem-on-cloudflare-control-plane-and-analytics-outage/