分布式系统,在高并发等情况下,需要有系统容错能力。系统需要具备弹性(Resiliency)的能力。
Resiliency:系统从错误,故障中恢复的能力。保障系统的可用性。
可用性定义:
Availability | Downtime |
90% (1-nine) | 36.5 days/year |
99% (2-nines) | 3.65 days/year |
99.9% (3-nines) | 8.76 hours/year |
99.99% (4-nines) | 52 minutes/year |
99.999% (5-nines) | 5 minutes/year |
99.9999% (6-nines) | 31 seconds/year ! |
( 参考:https://www.eventhelix.com/fault-handling/reliability-availability-basics/)
例如:一些常见的故障:软件设计,硬件,网络问题,网络提供商网络故障,部署在云端的服务遇到故障(云厂商机房掉电,硬件系统故障自动迁移引起延迟,云厂商例行维护或故障重启数据库,redis重启等等)
引起宕机的主要原因:
1.网络问题:网络带宽满,链路问题
2.性能问题:存储层缓慢(数据库,kv等),java Full gc,硬盘大量读写,cpu 使用率过高
3.安全问题:网络攻击,DDos,CC(Challenge Collapsar)
4.运维问题:数据库维护,应用维护,软件升级,中间件维护,操作系统维护,网络维护。监控问题。DNS配置错误
5.管理问题:没有关键服务的依赖关系,运行信息监控等
6.硬件问题:硬盘损坏,网卡损坏,路由器,硬件损坏,机房掉电,光纤意外破坏
分布式系统的弹性设计很难:
1.网络不可靠
2.依赖性的服务总是会失败
3.用户行为是不可预测的
需要考虑的模式:
1.nocode:减少代码:编写可靠且安全的应用程序最佳方式是不写任何代码----无需写入和部署
2.设置超时时间:
防止级联失败
提供故障隔离
3.重试:
如果发生异常失败,请重试
重试可以减少恢复时间,对于间歇性故事,很有效。
重试请求也可以设置超时,例如指数退避算法
需要保证幂等性
4.优雅的回退
系统故障是,使用其他的机制降级响应,而不是完全失败。
5.断路器:熔断设计
保护服务的调用依赖。当某个系统或接口不健康,并允许其恢复时,应该停止对下游的服务调用。
eg:Netflix 的Hystrix
6.弹性测试
模拟系统中的各种故障,eg:模拟网络故障,网络延迟,依赖服务缓慢,
注入故障
eg:Chaos Monkey等工具
系统设计上需要考虑:
隔离设计
异步通讯
幂等性
补偿事务
重试机制
熔断设计(断路器)
限流设计
降级设计