今天在我司的RPC框架中看到一个参数,如果配置了fail-fast则可设置重试次数和重试间隔时间,配置了fail-over是另一套重试次数和重试间隔时间,借此了解下保证高可用的几种常见的容错机制。
FailOver(故障转移)
failOver是一个动作(或行为),指服务器,系统,硬件,网络在出错的情况下,切换至副本或者备份的行为。failOver和switchOver基本上是相同的操作,前者强调自动切换,后者需要人工介入。系统设计都需要提供支持failOver的特性来提升高可用度。在服务的层面,自动failOver通常需要在两个server之间维护“心跳”,只要“心跳”在主备server之间通信正常,备份的server就不会启用。可能还会有第三方的server来通过运行其他组件来保证“热切换”,副本机器接收到心跳的变化就开始接管工作,有些系统也会通过发送failOver的通知来实现。(这里的热切换指可以快速从主server切换到备份server,而冷切换指系统服务会停止,等待一段时间后继续工作)
FailBack(故障恢复)
failBack是指系统恢复的过程,系统和组件恢复到failOver前的状态,并把备份节点恢复到备份的状态。
Fail-Fast(快速失败)
fail-fast是一个特性,代表系统可以在很有可能出错的场景下立即报错的特性。fail-fast的系统通常被设计成尽可能禁止操作而不是允许可能的错误流程。这种设计通常是在操作的过程中,校验系统的状态,以此校验出任何的错误。fail-fast模块的职责就是检查错误,然后让更上层的系统来处理错误。在jdk中,ArrayList的设计就是具有fail-fast特性的,如果在遍历的过程中有对List本身的改动,会通过modCount字段进行校验,校验失败会直接抛出ConcurrentModificationException。
Fail-Safe(安全失败)
fail-safe是一个特性,当出现一个错误时,通过一种尽可能减小对系统和用户的损失和方式来响应的特性。如果一个fail-safe的系统发生了异常,它会表现的尽可能安全(如果有些系统要持续性的保证高可用,那么就不能设计为fail-safe的系统)。举个例子,电梯有一个根据绳索压力控制的刹车,如果绳子断了,压力为0,这时候就会启动该刹车保证电梯不会下落,这就是一种fail-safe机制。个人理解fail-safe是一种兜底的设计思路,即使系统出错,会有planB来保证系统尽可能地工作。看很多人说CopyOnWriteArrayList是fail-Safe的,我是不太认可这个观点的,它只是设计为Thread-safe,和fail-safe没太大关系。
补充
除了上面几种类型之外,服务间实现高可用还有并行调用(forking,即同时调用多个服务节点,哪个成功用哪个结果),广播(broadcast,逐个调用所有的服务节点,有一个报错则报错)等方式,这里不展开了…
Reference
https://en.wikipedia.org/wiki/Failover
https://en.wikipedia.org/wiki/Fail-fast
https://en.wikipedia.org/wiki/Fail-safe
|