文章目录
- 分布式故障基础知识
- 故障类型
- 故障检测
- 故障恢复
- 分布式故障检测原理
- 故障恢复策略
分布式故障基础知识
故障类型
- 在任何一个分布式系统中,故障都是不可避免的。这里的故障,通常包括两类:
- 一类是物理故障,比如硬盘损坏、断电断网、硬件升级等;
- 另一类是软件层故障,比如系统存在 Bug 导致系统崩溃、系统负载过高导致系统崩溃等。
- 在讨论分布式系统故障时,我们通常还会从是否是网络导致的故障的角度来进行故障划分,包括节点故障和网络故障,而这两类故障可能同时包括物理故障和软件层故障。由于软件层故障和具体的程序实现等相关,因此主要由开发者根据自己的实现去解决;而物理故障通常具有很多共同特征。
节点故障
- 简单地说,节点故障就是单个机器自身出现故障。比如,由机器 A、B,……,Z 构成的分布式集群中,机器 A 自身出现故障,而不是非机器之间的网络连接出现故障,就是节点故障。
- 节点故障有很多种,大体可以分为两类:
- 一类是硬件故障,比如机器硬盘损坏、内存接触不良等;
- 另一类是软件故障,比如由于请求过多,超过服务器处理能力上限,导致无法处理,又或者是机器被攻击,导致机器瘫痪等。
- 节点故障在软件层的表现结果是,该机器无法为用户提供服务。
网络故障
- 简单地说,网络故障就是分布式集群中,节点之间无法完成通信。比如,由机器 A,B,……,Z 构成的分布式集群中,机器间比如机器 A 和 B 之间无法完成通信,就属于网络故障。
- 网络故障也有很多种,比如路由器故障、DNS 故障、网络线路断裂等。这些物理故障在软件层的表现结果是,机器间无法通信,影响分布式应用正常提供服务。
故障检测
- 故障检测,就是指通过一定的方式识别或发现故障。就好比,我们把火灾、地震等危险事件看作是故障,采用火灾报警器、地震仪等来检测发现火灾或地震。
- 如果可以提前检测到事件的发生,就能将损失降到最小。在分布式系统中,检测硬件故障通常比较麻烦,因此会通过查看软件层的表现结果来进行故障检测。比如,网络故障导致服务器之间无法通信,因此就可以通过检测服务器之间是否可以通信(比如,服务器之间心跳包是否可以正常地发送和接收),来检测是否存在网络故障。
故障恢复
- 故障恢复,就是指修复分布式系统中出现的故障,使系统恢复正常。简单来说,故障恢复就是故障发生之后的弥补方案,可以理解为对故障进行修正或修复,以保证服务正常运行,有点类似“知错能改,善莫大焉”。
分布式故障检测原理
- 在分布式系统中,常见的故障检测方法是心跳机制。基于心跳进行故障检测的策略主要分为两类,固定心跳检测策略和根据历史心跳信息预测故障策略。
故障恢复策略
-
关于故障恢复策略,从单节点故障和网络故障两个维度展开。
-
对于单节点故障问题,往往采取主备策略,即当主节点故障后,从备节点中选出一个作为新的主节点,以继续提供服务。这种备升主的方式比较好理解。
-
如下图所示,用户 A 访问分布式集群时一直是与 Master 交互的,但当 Master 故障后,其他 Slave 会通过分布式选举算法选出一个新的主节点。假设,从 Slave 1、Slave 2 和 Slave 3 中选举出 Slave 2 作为新的 Master,则 Slave 2 需要承担原来 Master 的职责,继续为用户提供服务,因此当用户 A 再次访问集群时,提供服务的是新选出的 Master,也就是 Slave 2。这就是备升主的过程。
-
从用户 A 的角度来看,并不会感受到服务有什么异常,因为依旧可以正常访问集群。因此,主备策略可以大大提高分布式系统的可用性,在分布式系统中随处可见。比如Redis 集群、ZooKeeper 集群等,都是采用了这种主备策略来做故障恢复。
-
对于网络故障问题的解决方案,简单来说就是 C、A、P 选择的问题,即在分布式系统的可用性和数据一致性之间做权衡。根据不同的应用场景,选择不同的解决方案。
-
当分布式系统中出现网络故障时,对于高可用性要求严格的系统,比如要求必须及时响应用户的场景,就需要采用保 AP 弃 C 的策略;对于数据一致性有严格要求的系统,比如银行、金融系统等场景,就需要采用保 CP 弃 A 的策略。
-
网络故障恢复问题也可以看作数据复制的问题,即网络故障恢复后节点间数据同步的问题。
-
节点故障和网络故障也有交叉的地方,比如网络故障产生的原因可能是节点故障,即因为节点故障导致节点间无法通信,而不是纯粹的网络链路问题。这种情况有两种可能性,一种是节点临时性故障,即一段时间后就会恢复;一种是节点永久性故障,即节点不会恢复。针对第一种情况,只需等到故障恢复后,数据进行同步即可;第二种情况则需要备升主策略来解决。
知识扩展:固定心跳检测和基于历史心跳信息预测故障的策略,各有什么特点呢?
固定心跳检测的核心是,固定周期 T 秒发送心跳,若连续 k 次未收到心跳回复(时间 T 内),则判断心跳超时的时间为 kT 秒。可以看出,k 和 T 的设置非常重要。比如,对于要求秒级故障检测的场景(时延敏感性场景),则 kT≤1s,因此需要将 T 设置为 ms 级,比如200ms,k 设置为 1000/200=5 次。但,这样一来容易导致误判。因为判断超时的时间设置得太短,很可能是系统做内存回收或系统本身有高任务在运行导致心跳回复延后。对于时延不太敏感的场景,k 或 T 可以设置得大一些,降低误判率,但却会增加发现故障的时间。
φ值故障检测。φ值故障检测是基于心跳间隔符合正态分布的假设,通过对历史心跳数据采样来预测当前心跳是否超时的。也就是说,心跳间隔符合比较平稳或符合规律的情况下,比较适合,但对于具有突发情况或心跳间隔无规律的场景误判率比较高。
在网络状况确定且比较稳定的场景下,大多数系统会采用固定心跳检测策略,因为其可以根据网络状况与业务场景自主设定合适的 k 和 T 值,简单有效;而当网络状况有所变化,且变化有规律的场景,则可以使用φ值故障检测策略。
你知道的越多,你不知道的越多。