单点故障

Posted by Ahan on January 3, 2025

什么是单点故障

单点故障(英语:single point of failure,缩写SPOF)是指系统中一点失效,就会让整个系统无法运作的部件,换句话说,单点故障即会整体故障。 毫无疑问,单点故障是我们在考虑稳定性问题里不得不在一开始就考虑的问题,所有高度可用的系统(商务系统、软件系统或工业系统)不会希望有单点故障造成整体故障的情形。

那么什么是“单点”呢?在”单点故障”这个术语中,”单点”指的是系统中的某个独立的组件或节点,其失效将对整个系统产生严重的影响。这个组件或节点可能是关键服务器、网络设备、电源系统、存储设备、数据库服务器等。当这个单点发生故障时,将导致整个系统的功能受限或完全瘫痪。

“独立的组件或节点”,听起来是不是还是有些抽象,我们把“单点”具象化一下,例如:

  • 磁盘
  • 物理机
  • 交换机
  • 机柜

是不是清晰非常多,以上列举的单点,都是分布式系统中,最常见的硬件类型的单点,也是最容易考虑到的单点问题。但实际上,单点问题,还可以包含一些软件问题,例如:

  • 单一进程故障
  • Kubernetes 集群(K8S出问题可能导致集群级别故障,比如管控平面整体不可用)

除了小范围的单点故障,实际上,也有更大范围的单点故障:

  • 单个机房故障
  • 单个可用区故障
  • 单个 Region 故障

读者可能会疑问,单个可用区故障,也能算单点故障吗?实际上在云上,这些都是需要考虑的。当然我们也可以把可用区、Region 这样大范围的故障单独考虑容灾方案。但本质上在笔者看来,他们就是“粒度”大一点的“单点故障”。

我们能干点啥

OK,聊清什么是单点故障后,我们再看看,单点故障对稳定性设计的影响是什么?笔者总结有以下几条:

  • 识别单一的故障域。
  • 单个(甚至多个)故障域出现问题时,系统可以继续运行,不影响其它故障域的运行。
  • 对于软件来说,在满足成本性能等一系列需求的情况下,尽可能跨多个故障域部署(最优),以获得最好的可用性,亦或者在单点故障后可以快速迁移(次优)。例如在一个可用区发生整体故障(小概率事件),可以快速(比如10min)在另外一个可用区恢复相关的业务。
  • “鸡蛋不要放一个篮子里”,重要服务,不要集中放在同一个故障域里。

举例来说,对于服务 A 来说, Kubernetes 是一种可能的故障域。那么如果服务 A 可以在多个 K8s 集群里同时部署,并同时对外提供服务(Active-Active),那么这种方案是最好的,即使单个 K8s 集群发生故障,仍然有另外一个集群可以继续提供服务 A。 次优的方案是 Active-Standby,当一个集群故障后,另外一个集群的服务开始正式对外提供,或者临时在另外一个集群部署服务(不太推荐)。