无论是在传统软件时代还是在互联网、云时代,系统终究会在某个时间点失败,尤其是在分布式、云架构的互联网时代,业务快速发展促使技术架构快速演进,使架构变得越来越复杂,失败更是由小概率偶发事件变成常态。因此面向失败设计,把面向失败当成系统设计的一部分,并且准备好从失败中恢复的策略,拥有先知先觉的防范意识和充分的技术准备,对系统的设计、甚至企业的生死存亡都很关键。
2001年9月11日,美国世贸中心双子大厦遭受了谁也无法预料的恐怖打击。灾难发生前,约有350家企业在世贸大厦中工作。事故发生一年后,重返世贸大厦的企业变成了150家,有200家企业由于重要信息系统的破坏,关键数据的丢失而永远的关闭、消失了。其中的一家公司称,自己要恢复到灾难前的状态需要50年的时间。
同样是令人恐怖的“9.11”,世贸大厦倒塌后,在世贸大厦租有25层的金融界巨头摩根斯坦利公司最为世人所关注。但是事发几个小时后,该公司宣布:全球营业部可以在第二天照常工作。这都是因为该公司建立的数据备份和远程容灾系统,它们保护了公司的重要数据,在关键时刻挽救了摩根斯坦利,同时也在一定程度上挽救了全球的金融行业。
面向失败设计有哪些原则呢?
1、冗余设计避免单点故障
硬件和软件都不可靠,环境和人都存在极大的不确定性,虽然无法避免失败场景的发生,但是可以通过冗余设计来规避局部失败对系统的影响。冗余设计避免单点故障这一策略在互联网技术架构中处处可见,比如重要的服务通常都会部署多个、数据库的主备结构、服务调用的重试机制、存储的多副本等,冷备、热备、两地三中心、异地多活等。
2、自动化运维管控
面向失败设计不仅要求你的系统足够健壮,同时要求你能够在第一时间感知到失败的发生。对系统关键指标做精细化监控,在出现问题的时候能以最快的速度将最准确的信息传递到人或者运维系统,所有的运维动作都需要遵循灰度原则,做到可灰度、可监测、可回滚,即便出现了失误也能控制好爆炸半径,并且做到快速恢复。
3、为不可预料的情况备好预案及演练
能够抵抗失败和从失败中快速恢复是面向失败设计的核心思想,然而即便已经做了万全的设计,也并非所有的失败场景都是系统能够自动抵御的。你需要考虑到所有的失败场景,并准备好相应的应对预案。做好预案需要对失败场景有全面的考虑:会发生哪些失败?失败会带来什么问题?应对策略是什么?预期的恢复时间多久?恢复后的影响面有多大?需要通知到哪些角色?等这一系列的因子构成了一个完整的预案体系。通过不断演练,来保障能力和进化升级。对于代价非常巨大的事件,做好前期的充分演练是非常有必要的,比如军事演练、消防演练等都属于这一范畴。
准备好迎接失败就不怕失败,企业如此,人生也如此。生于忧患死于安乐,有危机意识的人通常都不会过的很差。