设计原则
由于故障不可避免,如硬件故障、软件错误、网络延迟、突发流量等,因此在设计高可用应用系统时,必须考虑所有的硬件及系统包括的软件都可能会失效,包括IaaS、PaaS、SaaS及应用系统本身。韧性设计的目标不是试图防止这些故障的发生,而是为了在这些故障发生时,能最大程度地减轻故障对系统造成的影响,并持续稳定地运行,建议遵循以下设计原则。
高可用设计
单点故障会导致整个系统崩溃、主要功能受到影响、任务延误的系统轻度损坏或存在较大的故障隐患,因此系统的高可用设计非常关键。
高可用设计的主要手段是冗余,甚至是多级冗余的组合,包括异地容灾方式保证灾难情况下无单点:
- 冗余机制:只要条件允许,需要考虑关键组件的冗余,甚至是多级冗余的组合(例如:1+1冗余、n+1冗余、N-Way冗余等)
- 异地容灾:例如,两地三中心,保证灾难的情况也可以提供业务。
- 数据冗余:可以通过定期备份和多副本备份等方式实现以提高数持久度,并确保数据一致性。
冗余的增加,意味着成本的增加;因此在应用高可用设计时需要综合考虑冗余对成本的影响。
故障全面检测
故障检测是故障管理的前提,检测全面与检测快速都很重要,通常情况下故障检测全比故障检测快重要。
故障检测涉及以下方面:
- 检测范围:识别并跟踪检测所有组件,有重大影响的故障模式需要重点检测。
- 亚健康检测:对不引起系统故障却导致系统或服务KPI下降的亚健康异常需要能检测,如网络时延变大、磁盘变慢、内存泄露等亚健康故障。
- 备用检测:冗余系统中,主备用模块的故障都需要检测,避免静默故障。
- 有特殊寿命器件:应及时监控有特殊寿命(如本地硬盘)要求的期间健康状态,通过提前预警采取维护错误,避免故障的突然发生造成严重影响。
- 检测速度:需要根据业务综合要求,确定合适的检测速度。
- 检测影响:故障定时检测的周期,需综合考虑对CPU占用率的影响和检测延迟对业务恢复速度的影响。
- 检测模块要简单:故障检测系统、模块要比被检测系统、模块简单。
在检测到问题后,需要通过监控系统及时发现,迅速处理。
故障快速恢复
故障恢复指恢复产品执行规定功能的能力,一般情况下恢复越快影响越小。
结合业务情况,综合考虑技术实现难度、技术方案复杂度、成本等设计合适的故障恢复方案:
- 自动恢复:对于影响业务的故障,系统应尽可能自动恢复自愈,如保护倒换、局部复位或系统服务等。
- 优先恢复:优先对故障发生概率高、故障影响大的故障进行恢复。
- 分级复位:提供分级复位设计,尽可能在更小级别进行复位,以减少对业务的影响。
- 无耦合恢复:尽可能做到系统局部故障或各部件启动顺序不影响系统成功启动。
- 分层保护:系统故障保护要考虑网络分层,下层的故障保护倒换要比上层灵敏,防止系统出现乒乓倒换。
通过检测系统运行状态,或监控系统载关键指标,来判断系统是否发生故障,并针对故障可进行自动恢复处理。
可以通过故障分析方法分析各种故障模式、影响及危害,设计对应的可靠可用方案,提供冗余、隔离、降级、弹性等能力;并通过故障注入测试(FIT)验证可靠可用方案的有效性,最大程度提高业务的可靠性和可用性。
对于某些故障,即使通过各种技术手段进行冗余和自动恢复处理,但仍会导致业务中断,需要人工干预,如备份恢复或灾难恢复处理,因此需要建立高效的故障应急恢复处理流程和平台,以便在故障发生时,能快速恢复业务,减少故障影响。
过载控制
在系统请求超过系统容量时,会由于资源饱和而导致系统请求失败,在云中,可以监控系统和工作负载的利用率,来自动添加或删除资源,以维持最佳级别来满足业务需求,而无需过度配置或配置不足。
控制业务流量一般通过动态资源管理来实现,不建议简单的使用静态门限来达到防过载的目的,有可能造成资源大量浪费,过载设计应该考虑以下方面:
- 动态限流:根据系统资源消耗情况动态调整流控门限。
- 弹性扩缩容:自动检测系统资源利用率,自动进行添加或删除资源。
- 先负载均衡后流控:多个并行处理单元场景下,优先考虑负载均衡,避免单个处理单元资源受限导致业务受损;然后进行过载控制保护,使得整个系统的处理能力最大化。
- 及早控制:系统过载时,应尽可能在业务流程处理前端或业务处理较早的处理模块或底层协议层次上控制业务接入,避免中间控制带来不必要的性能消耗。
- 优先级保障:系统过载时保证高优先级的业务能够优先获得资源,优先得到处理,从而保证社会效益最大化。
变更防差错
当对系统进行升级部署、配置变更时,需要防止变更过程中由于人因差错导致系统和业务受损或失效。
通常采用防呆的方式来减少人因差错。防呆是一种预防矫正的行为约束手段,运用防止错误发生的限制方法,让操作者不需要花费注意力、也不需要经验与专业知识,凭借直觉就可准确无误地完成操作,在许多场景下可以提升效率和使用体验,也防止损坏更换的成本,因此优良的产品中防呆设计极为基础而普遍。
变更防差错通常采用以下方案:
- 角色约束:通过权限控制设计预防对不同角色的配置范围进行约束,避免越权配置导致错误。
- 查改分离:通过产品界面设计将配置界面分层分级,查看与修改分离等降低人为配置失误风险。
- 配置校验:通过配置生效机制设计确保在配置生效前进行必要的检查,避免错误配置生效。通过使用自动化方式进行配置变更处理,可减少人因输入错误的可能。
- 删除保护:在删除资源时增加保护机制,防止误删,如:删除前运行状态检查保护,资源锁定防止误删除,回收站机制等。