付同学的技术客栈/

系统可用性:故障一定会发生,关键是怎么收住

所属专题 高并发海量数据系统架构 第 9 篇 / 共 11 篇 查看专题目录

有一次团队以为自己有备份,直到真的需要恢复。

备份文件确实存在,但恢复脚本很久没跑过;恢复出来的数据还要校验;应用连接怎么切,缓存怎么处理,消息积压怎么补,都没有完整演练。

那一刻才会明白:高可用不是文档里写了“有备份”“有主从”“有回滚”,而是故障发生时,这些东西真的能跑起来。

故障一定会发生。关键是影响范围有多大,持续多久,能不能收住。

可用性这个词听起来很大,真正出事时却很具体。

可能是一个第三方接口超时,可能是一台机器磁盘满了,可能是 Redis 抖了一下,也可能是某个发布把配置带错了。

用户不会区分你是数据库问题、缓存问题还是外部服务问题。他只会觉得系统刚才不能用了。

所以做可用性设计时,我更关心一件事:当某一块真的坏掉时,系统还能不能给用户一个可接受的结果,而不是把技术细节原样甩到页面上。

现场判断 高可用不是保证不坏,而是坏了以后影响范围能不能被收住。

备份、主从、灰度、回滚,只有演练过、能执行,才算真的属于系统能力。

一、先消除明显单点

单点故障是高可用里最基础的问题。

一个服务只有一个实例,一台机器挂了服务就没了。数据库没有复制和备份,磁盘损坏可能就是灾难。网关、缓存、MQ 只有单节点,也都可能成为系统瓶颈。

消除单点的常见方式是多实例、主从、集群、负载均衡、自动故障转移。

但多实例不是简单多启动几个进程。服务要能被健康检查,要能自动摘除异常节点,要能处理重复请求,还要确保配置和版本一致。

高可用的第一步,是让系统不要因为一个点坏掉就整体停摆。

二、主从切换和容灾要演练

很多系统文档里都有主从切换,但真正出事时却切不过去。

原因很简单:平时没演练。

主从切换要考虑数据延迟、连接重连、写入口切换、应用配置刷新、缓存一致性、业务补偿。数据库切换成功,不等于业务完全恢复。

容灾备份也是一样。备份文件存在,不代表真的能恢复。要定期做恢复演练,确认备份可用、恢复时间可接受、恢复后数据完整。

未经演练的方案,只能算愿望。

可用性底线

很多高可用方案写在文档里很完整,真正出事时卡在这些细节上。

能切换

主从、实例、流量入口都要真的切得过去。

能恢复

备份要能还原,恢复后数据还要能校验。

能回滚

发布、配置、数据库变更,都要提前想好退路。


三、多活很强,但也很贵

多活听起来很美:多个机房同时提供服务,一个地方挂了,另一个地方继续扛。

但多活的复杂度很高。流量调度、数据同步、跨地域延迟、冲突处理、全局 ID、缓存一致性、故障切换,每一个都不简单。

不是所有系统都需要多活。

很多业务先做好同城高可用、异地灾备、核心链路容灾,已经能覆盖大部分风险。只有当业务规模、可用性要求和团队能力都到位时,再考虑更复杂的多活。

架构不是越高级越好,能稳定落地才重要。

四、灰度发布是在降低人为故障

很多线上故障不是机器坏了,而是新版本发布出了问题。

灰度发布的价值,是让新版本先影响一小部分流量。观察没问题后,再逐步扩大范围。如果发现异常,可以及时停止或回滚。

灰度一定要配合监控。只发 5% 流量但没有指标观察,也很难判断好坏。

常见观察指标包括错误率、接口耗时、核心业务转化、消息积压、数据库压力、日志异常。

灰度不是慢慢发版这么简单,它是带观察的发布。

五、回滚机制要比发布更熟

发布前最应该问的问题之一是:如果出问题,怎么回去?

代码能不能回滚,数据库变更能不能兼容,配置能不能恢复,缓存和消息会不会受影响,这些都要提前想。

特别是数据库变更,不能只写升级脚本,也要考虑兼容和回退。很多时候更稳的方式是先兼容旧字段和新字段,分阶段发布,而不是一次性切换。

真正成熟的发布体系,不是发布按钮多漂亮,而是回滚足够快。

六、可以带走的判断清单

  • 单点要消除,但多实例也要配健康检查和摘除机制。
  • 主从切换、备份恢复必须定期演练。
  • 多活很贵,不要为了高级而高级。
  • 灰度发布必须有观察指标。
  • 数据库变更要考虑兼容和回退。
  • 回滚流程要比发布流程更熟。

高可用不是让系统永远不失败,而是让失败可控。


本系列:

高并发海量数据系统架构 第 9 篇 / 共 11 篇
查看专题目录

留下一条评论

暂无评论