简介: 无论是一个域,一个 BG,还是一个站点,尽管范畴有大有小,对象有所不同,但其高可用的理念都是相通的,明天将本人对高可用的一点点思考以及总结的【nPRT 公式】分享给大家。
我是乐羊,一个酷爱危险防控的人,之前参加过蚂蚁 Glocal 多个站点从 0 到 1 的建站和高可用建设,目前正在参加蚂蚁大平安的高可用建设。无论是一个域,一个 BG,还是一个站点,尽管范畴有大有小,对象有所不同,但其高可用的理念都是相通的,明天将本人对高可用的一点点思考以及总结的【nPRT 公式】分享给大家。
本文采纳“高可用是什么,为什么要高可用,怎么做高可用,为什么这么做,软件危险又在哪里”的逻辑来介绍。
一、高可用是一种管制危险的能力
高可用是一种面向危险设计,使零碎具备管制危险,提供更高的可用性的能力。
二、为什么要高可用
对于一个公司而言,“为什么要高可用”能够残缺了解为“公司为什么要(做零碎)高可用”。以公司为对象,从内看包含:人,软件(物),硬件(物);从外看包含:客户,股东,社会;从本身看包含:公司。
高可用的大前提:所有事物都不是 100% 牢靠的
- 所有事物都是变动的(惟一不变的是变动)。
- 所有变动的都不是 100% 牢靠的。
- 论断:所有事物都不是 100% 牢靠的。
内因:人、物都不是 100% 牢靠的
- 从人的层面:人都是有可能犯错的。
- 从软件层面:软件都是有可能有 BUG 的。
- 从硬件层面:硬件都是有可能会坏的。
从概率学角度剖析,但凡有可能会出错的,只有变动次数足够多,最终出错的概率会有限趋向于 1。
外因:无高可用,对外影响面是很大的
- 从客户角度:无高可用,客户服务可能会中断。
- 从股东层面:无高可用,股价可能会上涨。
- 从社会角度:无高可用,社会秩序可能受影响。
根因(实质):管制危险
从公司本身角度:管制危险,保障公司价值,防止伤及基本。
三、如何做高可用
如何做高可用,实质上就是:如何管制危险。
1、危险相干概念
- 危险:指将来会产生危害的一种可能性,但理论未产生,记为 r。
- 故障:指已产生或正在产生危害的一种事实,是危险变事实的后果。
- 危险概率:指一个危险变故障的概率。用它来示意危险触发为故障的难易水平,记为 P(r)。
- 故障影响范畴:指在单位工夫内,一个故障造成的危害影响,记为 R(r)。
- 故障影响时长:指一个故障继续的工夫,记为 T(r)。
- 故障影响面:指一个故障影响范畴乘以故障影响时长的总和。这里用故障影响面来示意故障总的危害水平,记为 F(r)。
- 危险冀望:指每个危险变故障的概率乘以每个危险变故障后的故障影响面的总和。这里用危险冀望来示意危险的潜在危害水平,记为 E(r)。
2、危险冀望的公式
依据上节的定义,能够推导出危险冀望的公式如下:
r 代表危险,危险冀望会随着危险的数量 n 和每个危险的 P、R、T 降落而降落,简称 nPRT 公式。
注:如果要援用该公式请注明出处。
3、管制危险的 4 大因素(nPRT)
缩小危险数量,n
从源头远离危险,做到与危险载体无连贯,无关系;那么该危险概率就是 0,也不关怀该危险产生后的故障影响面是大是小,齐全不关怀。
- 例如:重大节日流动,实施全站封网,变更的数量就会失去一个显著的降落,就是典型的缩小危险数量。
- 例如:零碎 A 齐全不依赖 Oracle,那零碎 A 就不必关怀 Oracle 的任何危险,哪怕美国总统忽然紧急发表 Oracle 立刻立即禁止在中国应用,零碎 A 也无所谓。
- 例如:最近新冠大风行,人传人很可怕,如果你明天抉择不下班不出门,那你明天就不必放心被里面的行人和共事传染。
升高危险变故障的概率(即:减少危险变故障的难度),P
把危险当成一个对象对待,给它层层设卡,减少危险变故障的门槛和难度,不要再让“不小心多了一个空格或字符,零碎就挂了”这种惨案轻易呈现。
- 例如:人员 B 要对系统 C 进行变更,能够对人员 B 减少变更认证考试,对变更内容要求线下(或仿真)测试,对变更内容进行 CR,零碎 C 提供变更成果预览能力(相似监控模式或试运行),万一人员 B 想歹意变更搞破坏,还能够减少非同人复核,零碎 C 能够减少防错设计进行爱护等等。
- 例如:以新冠为例,带口罩,勤洗手,多通风等就能够升高染上新冠的概率。
减小故障影响范畴,R
以大拆小,将一个整体拆分成 N 个小的个体,每个个体之间进行互相隔离,单个个体出问题仅影响单个个体,实现小而美。
- 例如:分布式架构就是这个的榜样,集中式一损俱损,分布式一损即 N 分之一损。
- 例如:以新冠为例,网格化治理,各省或市间的流动进行限度,跨省必须核酸 + 隔离 14 天,无效管制新冠的流传范畴。
缩短故障影响时长,T
故障影响时长由故障发现工夫和故障止血工夫决定,所以要早发现早止血。
发现形式分为:事先的预警,预先的告警。尽可能朝事先预警去做,给止血争取时间甚至将危险扼杀在摇篮中。
止血形式分为:切换,回滚,扩容,降级 or 限流,BUG 修复等。故障呈现时第一优先准则为疾速止血(如切换、回滚、扩容),严禁去定位根因;当无奈疾速止血时以少流血为第二优先准则,如降级、限流。
止血效率:主动 vs 人工;一键化 vs 多步操作。尽可能用自动化去代替人工操作,若人工操作时尽量实现一键化,晋升止血速度。
- 例如:对于容量水位,能够在警戒线之前划一条预警线,提前预警,从容应对。
- 例如:分布式应用集群,任何一台应用服务器有问题时,负载平衡会通过心跳查看主动把有问题的应用服务器剔除,将申请转发给其余(热)备份冗余的服务器上。
- 例如:以新冠为例,但因为每个生命都是举世无双的,没有方法切换,也没有方法回滚,也不能降级(波及人道主义),只能隔靴搔痒缓缓医治。
4、高可用架构设计的 7 大外围准则
依据 nPRT 公式,在高可用架构设计时有以下 7 个外围准则:
少依赖准则:能不依赖的,尽可能不依赖,越少越好(n)
因为所有事物都不是 100% 牢靠的,当 2 个事物之间有了关系,那么就会相互影响,就互为对方的一个危险,一个出问题可能会影响另外一个。咱们对立用依赖来泛指这里的“关系”。
- 例如:一个零碎同时依赖 Oracle,Mysql,OB 三种关系型数据库,少依赖准则是改成仅依赖最成熟稳固的 OB,不依赖 Oracle 和 Mysql。
什么场景适宜多依赖?
当引入依赖(n 变大)能够减小 PRT 中的一个或多个,且使 E(r)整体下降时。
- 例如:为解决 DB 危险,引入分布式缓存,只有 2 者不同时挂的时候仍然可用。
弱依赖准则:肯定要依赖的,尽可能弱依赖,越弱越好(P)
事物 a 强依赖事物 b,一旦 b 出问题时,那么 a 也会出问题,一损俱损。
所以任何强依赖都要尽可能的转化成弱依赖,能够间接升高出问题的概率。
- 例如:交易外围链路在交易胜利后要要给用户发放积分权利;交易外围零碎须要依赖积分权利零碎,好的形式是采纳弱依赖,应用异步化的形式,这样积分权利零碎不可用时,大概率不会影响交易外围链路。
扩散准则:鸡蛋不要放一个篮子,扩散危险(R)
打散拆分成 N 份;防止全局只有 1 份,否则一有问题影响范畴就是 100%。
- 例如:所有交易数据都放在同一个库同一张表外面,万一这个库挂了,此时影响所有交易。
- 例如:将本人所有的钱买了同一只股票,万一这只股票是乐视就惨了。
平衡准则:平均扩散危险,防止不平衡(R)
最好 N 份中的每份都是平衡的;防止某个份额过大,否则过大的那份一有问题就影响范畴过大了。
- 例如:xx 利用集群有 1000 台,但因为引流组件 BUG,导致所有流量引到了其中 100 台下面,导致负载重大不平衡,最初因负载无奈扛着全面解体。相似重大故障曾经产生了屡次。
- 例如:将本人所有的钱买了 10 只股票,其中一只占比 99%,万一这只股票是乐视就惨了。
隔离准则:管制危险不扩散,不放大(R)
每份之间是互相隔离的;防止一份有问题影响其余的也有问题,流传扩散了影响范畴。
- 例如:交易数据拆分成 10 库 100 表,然而部署在同一台物理机上;万一某张表有一条大 SQL 把网卡打满了,那 10 库 100 表都会受影响。
- 例如:将本人所有的钱均分买了 10 只股票,每只都占 10%,但 10 只都是乐视系的。
- 例如:现代赤壁之战就是一个典型的背面例子,铁锁连船导致隔离性被毁坏,一把大火烧了 80w 大军。
隔离是有级别的,隔离级别越高,危险流传扩散的难度就越大,容灾能力越强。
- 例如:一个利用集群由 N 台服务器组成,部署在同一台物理机上,或同一个机房的不同物理机上,或同一个城市的不同机房里,或不同城市里,不同的部署代表不同的容灾能力。
- 例如:人类由有数人组成,生存在同一个地球的不同洲上,这意味着人类不具备星球级别的隔离能力,当地球呈现毁灭性影响时,人类是不具备容灾的。
隔离准则是一个极其重要的准则,它是后面 4 个准则的前提。没有做好隔离,后面 4 个准则都是软弱的,危险很容易流传扩散开,毁坏后面 4 个准则的成果。大量实在系统故障是因为隔离性做得不好导致的,如:线下影响线上,离线影响在线,预发影响生产,一条烂 SQL 影响整个库(或整个集群)等等。
扩散,平衡,隔离是管制危险影响范畴的 3 个外围准则。打散拆分成 N 份,每一份都是平衡的,且互相隔离,一份有问题,影响范畴为 1 /N。
无单点准则:要有冗余或其余版本, 做到有路可退(T)
疾速止血的形式是切换,回滚,扩容等;回滚和扩容属于非凡的切换,回滚指的是切换到某个版本,扩容指的是将流量切换到新扩容的机器上。
切换得有中央可切才行,所以不能有单点(这里特指强依赖的单点,弱依赖的能够降级),要有冗余备份或其余版本;单点会限度整体的可靠性。
假如单点的可靠性假如是 99.99%,它要晋升到 99.999% 是十分艰难的,然而如果无单点而是依赖 2 个(1 个挂掉没有关系,只有不同时挂就行),那整体可靠性就是 99.999999% 会有质的晋升。
单点故障会导致无奈疾速止血,拉长整个止血工夫,去单点至关重要。这里的单点不仅仅指的是零碎节点,也蕴含人员,如订阅告警的人,应急的人等等。
对于(重要)数据节点,必须满足无单点准则,否则极其状况下可能造成数据永恒失落,永远无奈复原;(重要)数据节点满足无单点准则后,保障数据一致性比可用性要求更重要。
- 例如:一个商户仅反对一个领取渠道,就是典型的单点,万一这个领取渠道挂了就不能领取了。
- 例如:一个家庭的所有支出仅依赖父亲一个的薪资支出,万一这个父亲病了,就没有支出了。
无单点准则和扩散准则的区别:
- 当节点无状态的状况下,打散拆分成 N 份,每份都是雷同的性能,互为冗余,即:节点无状态状况下,扩散准则和无单点准则等价,满足一个即可。
- 当节点有状态的状况下,打散拆分成 N 份,每份都是不雷同的,每份都没有冗余,须要针对每份再做冗余,即:节点有状态状况下,既要满足扩散准则又要满足单点准则。
自我爱护准则:少流血,就义一部分,爱护另外一部分(P&R&T)
内部的输出都不是 100% 牢靠的,有时候是无心的谬误,有时候甚至是歹意的毁坏,因而针对内部输出要有防错设计,给本人多一些爱护。
极其状况下可能无奈(疾速)止血,能够思考少流血,就义一部分爱护另外一部分。例如:限流,降级等。
- 例如:大促峰值期间,个别会提前降级掉很多性能,同时限流,次要是为了爱护峰值绝大部分人的交易领取体验。
- 例如:人体在失血过多或疼痛适度时就会触发休克景象,这也是一种典型的自我爱护机制。
四、软件危险在何方
后面介绍了管制危险的办法,回到软件系统这个畛域,它的危险又在哪里?
以软件系统为对象,从内看包含:计算零碎和存储系统;从外看包含:人员,硬件,上游零碎,上游零碎;以及(隐含的)工夫。
因为每个对象都是由其余对象组成的,因而每个对象还能够持续往细合成(实践上能够有限合成上来),下面的合成形式次要是为了简化了解。
1、软件系统危险的起源
危险源于(有危害的)变动,一个对象的危险来源于所有跟它有关系的对象的(有危害的)变动。因而,软件系统危险的起源,分为以下 7 大类:
计算零碎变动:运行变慢,运行谬误
零碎运行所依赖的服务器资源(如 CPU,MEM,IO 等),利用资源(RPC 线程数,DB 连接数等),业务资源(业务 ID 满了,余额有余,业务额度不够等)的负载等都会影响零碎运行的危险冀望。
存储系统变动:运行变慢,运行谬误,数据谬误
零碎运行所依赖的服务器资源(如 CPU,MEM,IO 等),存储资源(并发数等),数据资源(单库容量,单表容量等)的负载和数据一致性等都会影响存储系统运行的危险冀望。
人的变动:变更出错
变更人员的数量,平安生产意识,熟练程度,变更的数量,变更的形式等都会影响变更的危险冀望。
因为变更的人多,变更的次数也多,导致变更成为蚂蚁所有故障起源里的 TOP1,这也是为什么“变更三板斧”这么闻名的起因。
“变更三板斧”正确的排序应该是“可灰度,可监控,可应急”;可灰度代表的是 R,可监控和可应急代表的是 T。
思考:如果变更三板斧让你再加一板斧,你感觉应该是什么?
硬件变动:损坏
硬件的数量,品质,应用年限,颐养等都会影响硬件的危险冀望,硬件损坏会影响下层软件系统不可用。
上游变动:申请变大
申请分为 3 个维度:(由有数 API 会集而成的)网络流量,(由有数 KEY 申请组成的)API,KEY。
- 网络流量过大会造成网络梗塞,影响网络通道中的所有网络流量申请。
- API 申请过大会造成对应服务集群过载,影响整个服务机器上的所有 API 申请,甚至往外流传。
- KEY 申请过大(俗称“热点 KEY”)会造成单机过载,影响单机上所有 KEY 申请,甚至往外流传。
所以大促保障的时候,不仅仅是关注外围 API 的容量保障,还须要思考网络流量和热点 KEY。
上游变动:响应变慢,响应谬误
上游服务的数量,服务等级,服务可用率等影响上游服务的危险冀望。上游响应变慢可能会拖慢上游,上游响应谬误可能会影响上游运行后果。
工夫变动:工夫到期
工夫到期往往被人漠视,但它往往具备突然性和全局破坏性,一旦工夫到期触发故障会导致十分被动,所以要提前辨认,尽早预警,如:秘钥到期,证书到期,费用到期,跨时区,跨年,跨月,跨日等。
- 例如:2019 年日本运营商软银因证书到期引发 3000w 用户长达 4 小时通信中断。
以上每一大类危险都能够基于 nPRT 公式进行逐个剖析解决。
2、危险的数量:毕生三,三生万物
任何一个事物既是由其余事物组成的又是其余事物的组成部分,有限循环上来;毕生三,三生万物,危险的数量是无穷无尽的。
向内看,内含内,能够无限小上来;当原子粒度的问题流传开时,也可能影响软件系统的可用性,就像 100 纳米的新冠病毒就能够影响人体的可用性一样。
向外看,外有外,能够无限大上来;当太阳系覆灭,软件系统的可用性天然就不复存在。
尽管危险无穷无尽,然而只有咱们对危险多一些理解,依据管制危险的一些理念和准则,还是能够更好的升高危险冀望。
谈一谈敬畏之心:
- 咱们对世界的认知是无限的,这也让咱们少了许多恐怖,同时也让咱们少了一些敬畏之心。
- 咱们真正要敬畏的不是处罚条例,而是咱们不晓得的,以及咱们不晓得咱们不晓得。
五、结束语
- 所有事物都是变动的。
- 所有事物都不是 100% 牢靠的。
- 因而才有了危险,危险是不可见的,可见的是故障。
- 危险是不能毁灭光的,然而能够远离,能够缩小。
- 故障是不可避免的,然而能够推延,能够放大影响范畴,缩短影响工夫。
nPRT 公式不仅仅实用于软件系统危险,也实用于其余危险畛域,心愿对大家有用。
作者:开发者小助手_LS
原文链接
本文为阿里云原创内容,未经容许不得转载