高可用架构的故障域设计实操踩坑笔记
2026-10-29 00:21:27
作者:
fawen
去年双11凌晨两点,我盯着监控屏上跳红的告警,后背的汗把衬衫都浸湿了。
本来以为提前做了多可用区部署,就算天塌下来也能扛住。结果一个可用区的核心交换机故障,直接把全量用户的下单接口打挂了。我们折腾了三个小时才找到根源——所有可用区的Redis缓存集群,居然都挂在了同一个跨区的物理交换机下。
说白了,我们之前所谓的高可用,根本就是个花架子。
别把多可用区当万能遮羞布
很多人对故障域的理解,还停留在“我开了三个可用区,就已经隔离了故障”的层面。
真不是。
故障域的定义其实很简单:所有会因为同一个故障点同时失效的资源,就算同一个故障域。你哪怕把服务器拆到了三个不同的可用区,只要它们依赖同一个云厂商的同一个内核版本,人家一次内核补丁的bug,三个区一起炸。你哪怕在每个区都部署了一套应用,只要所有应用的配置都存在同一个配置中心的同一个集群里,配置中心挂了,所有区的应用都没法启动。
之前有个做电商的朋友跟我吐槽,他们去年做了所谓的“三地五中心”架构,结果一次云厂商的DDoS防护策略升级,把他们所有的对外接口全拦了,四个小时没法对外服务,事后复盘才发现,所有的防护策略都绑定在了同一个云厂商的同一个账号下,根本没拆成独立的故障域。
云服务器多可用区故障域划分示意图
那些没人提前说的隐性故障点
做故障域设计最容易踩的坑,就是只盯着看得见的计算、存储资源拆,把那些藏在链路里的依赖全当透明的。
比如DNS。
你所有的域名解析都用同一个服务商的同一个账号,人家一次后台的配置操作失误,把你的解析记录全删了,哪怕你所有的服务器都在正常运行,用户也根本找不到你的网站。这种故障我见过不止一次,每次出问题的时候,运维团队都要花半个多小时才能定位到根源,因为监控屏上所有的服务器指标都是绿的。
还有第三方依赖。
之前我们公司接支付通道的时候,为了省事儿,所有的交易都走同一个第三方支付的同一个接口,结果人家一次大促期间的限流策略调整,直接把我们的支付成功率打到了10%以下。后来我们才拆了两个不同的支付服务商的接口,把流量按用户地域拆分到不同的通道里,就算其中一个通道挂了,最多影响一半的用户。
甚至连日志收集链路你都得拆。
之前我们所有的服务日志都往同一个Kafka集群里发,结果Kafka集群因为磁盘满挂了之后,我们连哪个服务出问题都查不到,本来10分钟能恢复的故障,硬生生搞了两个小时才搞定。现在想起来都气。
对吧,这些隐性的故障点,没人会主动给你列出来,全是踩坑踩出来的经验。
落地的时候别搞完美主义
不过话说回来,真要落地故障域设计的时候,很多人又容易走另一个极端——追求所谓的“全链路无单点”,把简单的系统拆得乱七八糟。
我之前见过一个创业团队,才几十个人的规模,就把每个微服务都拆成了三个独立的故障域,甚至连内部的报销系统都做了跨可用区部署,结果每个月的云成本就花了几十万,运维团队天天在排障,根本没时间做业务迭代。最后熬了半年,实在扛不住,又把系统合并回去了,纯纯折腾。
故障域的拆分粒度,永远是跟着业务的承受能力走的,不是越细越好。
你先拿个表,把核心链路的所有依赖全列出来,然后给每个依赖标上两个值:如果这个依赖挂了,会影响多少用户,以及这个依赖一年大概会出几次故障。然后优先把影响最大、故障概率最高的那个依赖的故障域拆了。
比如你是做电商的,先把用户下单、支付这两个核心链路的计算、缓存、数据库资源,拆到不同的物理机架甚至不同的可用区,再把DNS拆成两个不同的服务商解析,把支付通道接两个不同的服务商。至于内部的OA系统、后台的统计系统,就算挂了也影响不了几个用户,晚几个月再拆也完全没问题。
电商大促核心链路故障域隔离架构图
还有个很重要的事,别光靠纸面设计。
每个季度抽个时间,故意把一个故障域的资源全停了,看看会不会影响其他的链路。我见过太多团队的故障域设计图画得漂漂亮亮,真到演练的时候才发现,两个本来应该隔离的集群,居然偷偷用了同一个底层的存储资源。
哦对,还有,别等出事了再补。
去年双11那次故障之后,我们花了整整两周,把所有核心链路的故障域全梳理了一遍,该拆的拆,该补的补,后来又遇到一次交换机故障,整个用户端的影响还不到5%,半小时就恢复了。
说实话,高可用架构从来都不是靠买几个云服务就能堆出来的,全是靠一次一次踩坑,把那些藏在角落里的故障点一个个揪出来,拆成一个个独立的小区域,就算其中一个炸了,也不会牵连全局。
对吧?
免责声明:市场有风险,选择需谨慎!此文仅供参考,不作买卖依据。如有侵权请联系删除。
文章名称:
高可用架构的故障域设计实操踩坑笔记
文章链接:https://m.itcdj.com/it/229.html