软件系统的基本目标之可靠性 Reliability
我们在设计软件系统的时候,一般要考虑几个基本的目标:高可靠,可扩展,可维护。
可靠性 Reliability
可靠性可以理解为系统出现故障(Fault),也能正常工作。
故障(Fault)是指系统的一部分状态偏离其标准。 故障可能会导致系统失效(failure)。
失效(failure)是系统作为一个整体停止对外提供服务。系统失效会导致服务不可用,降低可用性。
可用性(Avaiability)指的就是,我们的系统可以正常服务的时间占比。
容错(fault-tolerant)设计是为了防止(预料并应对)因故障而导致系统失效。
故障分类
DDIA 里故障的分类可以分为三大类:硬件故障、软件错误、人为错误。
硬件故障
对于一台机器来说磁盘、内存、网卡、电源等硬件故障随时可能发生。10 年前,一般通过增加冗余度来提高单台机器的可靠性。比如磁盘可以做 RAID,服务器可以双路电源、备用发电机等。随着云技术的发展,现代系统一般都通过云平台使用大量的机器,硬件故障也变得非常常见。但优选考虑已经不在是硬件冗余,因为硬件故障是随机的、相互独立的,大量硬件不可能同时发生失效。 所以现在一般是通过系统设计来降低单台机器失效对系统的影响。
软件错误
软件错误是来自内部的系统性错误(systematic error) 。例子包括:
性能问题。资源不够,比如 CPU 时间、内存、硬盘空间或者网络带宽。
错误输入。对输入没有做安全校验和异常捕获导致系统崩溃。比如输入的格式、参数类型错误。
依赖服务慢,无响应。比如查询数据超时。
级联故障。
人为错误
系统总是在更新和修改,运维过程中就配置错误是导致服务中断的首要因数。
度量指标
MTTF(Mean Time To Failure) 平均故障前的时间,即系统平均能够正常运行多长时间才发生一次故障。系统的可靠性越高,MTTF 越长。
MTTR(Mean Time To Repair) 平均修复时间,即从故障出现到故障修复的这段时间,这段时间越短越好。
实现高可靠性(可用性)
系统设计
failover(故障转移)。冗余服务、数据、硬件。载均衡通过健康检测(Health Check)在发生单点故障是进行故障转移。对于
超时控制。当对依赖系统的请求发生超时时,应该快速失败。长时间阻塞会引发级联故障。
流量削峰。当系统有大量事件产生时,通过消息队列来削峰填谷。
延迟响应。对于一些长时间处理的请求可以通过消息队列异步处理完成后在通知用户。
服务降级。当负载过高时,对于一些不重要的系统,可以通过返回一些默认值来降低系统负载。保证核心系统可用。
限流和过载。当负载过高时,在服务端对请求进行限流,在客户端进行过载保护。
系统运维
测试。单元、系统集成、手动黑盒测试之后在发布。
发布。蓝绿发布、灰度发布、滚动发布。
快速恢复。回滚工具。
解耦。分离生产、测试环境。
监控。统一的性能和错误指标。
故障演练。
良好的实践。准备部署服务要遵守 handbook。
版权声明: 本文为 InfoQ 作者【BlockQuant】的原创文章。
原文链接:【http://xie.infoq.cn/article/a83e33394a05086a1514c2826】。未经作者许可,禁止转载。
评论