故障、容错
容错性简述
什么是故障
任何系统在长时间运行过程中,都可能发生故障。要么是设备上运行的服务故障;要么是设备的软件系统故障;要么是硬件系统故障;要么是通信链路故障;要么是时钟错乱故障等。
什么是容错
任何系统都有可能出现故障,每个系统都必须解决故障,如早期的RDBMS对于事务故障、系统故障、硬件故障等都有自己的容错方案(备份、恢复等)。
当系统出现故障后就可能会导致系统不可用,因此避免这些故障或故障后的解决方案就是容错。
分布式系统下的容错
集中式系统下,故障产生原因可能是设备上的服务、设备软硬件、网线等,对于大型系统来说,这些故障很难发生,服务通常可以认为是稳定的,因为轻易不会去动它;软硬件同样是稳定的。
分布式系统下,故障产生的原因变多了,如通信失败、时钟错乱等,故障原因的增多增加了故障的概率。另一方面集中式系统下只有单个设备,而分布式系统下是多个设备协作的,因此故障概率也从1变为了多。
所以由于分布式系统下这两种情况导致了故障率的增大,因此在分布式系统下需要专门进行针对系统进行容错。
分布式系统下的故障避免或解决方式
针对事务相关故障,使用分布式事务、WAL等技术解决。
针对系统软硬件故障,使用复制技术解决。
针对时钟故障,使用Ntp等时钟同步技术解决。
针对通信故障,使用重试、fullback等技术解决。
事务故障
事务执行失败
- 使用分布式事务解决,如2PC,事务失败后,所有设备不要提交,设备自身进行回滚。
事务执行成功但未持久化
- 设备自身使用WAL等技术实现服务重启后的恢复。
通信故障
目标设备无法找到
- 返回缓存消息
- 返回fullback消息
- 直接报错
接收端未收到响应
- 返回超时错误
- 再次查询接收端是否接收到消息
- 重试
发起端未收到响应
- 返回超时错误
- 再次查询接收端是否接收到消息
- 重试
消息不全
- 重试
- 通信接口支持幂等
时钟故障
发起端时钟过期、过早
- 使用更精确的时钟
- 使用NTP等协议实现时钟同步
服务故障
进程崩溃
- 守护进程拉起崩溃的进程
- 负载均衡,调用端探测服务从而切换下一次的目标设备
- 复制技术实现多个副本
设备故障
软件系统崩溃
- 负载均衡,调用端探测服务从而切换下一次的目标设备
- 复制技术实现多个副本
网卡、CPU、磁盘等硬件损坏
- 负载均衡,调用端探测服务从而切换下一次的目标设备
- 复制技术实现多个副本