文章目录
高可用是什么
高可用是一种控制风险的能力,是一种面向风险设计,使系统具备控制风险,提供更高的可用性的能力。简单可以理解为通过种种措施使系统对外不间断地提供服务,保证服务的响应时间,减少因软件、硬件、人为造成的故障对服务的影响,在故障发生时,访问服务的用户并不会感觉到。核心就是自动检测,自动切换,自动恢复,模式有主从、双主、集群方式。
为什么要高可用
对于一个公司而言,“为什么要高可用”可以完整理解为“公司为什么要做系统高可用”。以公司为对象,从内看包括:人,软件(物),硬件(物);从外看包括:客户,股东,社会;从自身看包括:公司。
高可用的大前提:所有事物都不是100%可靠的
- 所有事物都是变化的(唯一不变的是变化)。
- 所有变化的都不是100%可靠的。
- 结论:所有事物都不是100%可靠的。
内因:人、物都不是100%可靠的
- 从人的层面:人都是有可能犯错的。
- 从软件层面:软件都是有可能有BUG的。
- 从硬件层面:硬件都是有可能会坏的。
从概率学角度分析,凡是有可能会出错的,只要变化次数足够多,最终出错的概率会无限趋向于1。
外因:无高可用,对外影响面是很大的
- 从客户角度:无高可用,客户服务可能会中断。
- 从股东层面:无高可用,股价可能会下跌。
- 从社会角度:无高可用,社会秩序可能受影响。
根因(本质):控制风险
从公司自身角度:控制风险,保障公司价值,避免伤及根本。
控制风险的几个因素
- 减少风险源
- 减少风险发生的概率
- 减小风险影响的范围
- 缩短风险持续的时间
高可用设计的七大原则
少依赖原则
能不依赖的,尽可能不依赖,由于所有事物都不是100%可靠的,当2个事物之间有了关系,那么就会相互影响,就互为对方的一个风险,一个出问题可能会影响另外一个。
弱依赖原则
一定要依赖的,尽可能弱依赖,事物a强依赖事物b,一旦b出问题时,那么a也会出问题,所以任何强依赖都要尽可能的转化成弱依赖,可以直接降低出问题的概率。
分散原则
鸡蛋不要放一个篮子,分散风险,资源应该打散拆分成N份;避免全局只有1份,否则一有问题影响范围就是100%。
均衡原则
均匀分散风险,最好N份中的每份都是均衡的;避免某个份额过大,否则过大的那份一有问题就影响范围会比较大。
隔离原则
控制风险不扩散,不放大,每份之间是相互隔离的;避免一份有问题影响其他的也有问题,传播扩散了影响范围。另外隔离是有级别的,隔离级别越高,风险传播扩散的难度就越大,容灾能力越强。
隔离原则是一个极其重要的原则,它是前面4个原则的前提。没有做好隔离,前面4个原则都是脆弱的,风险很容易传播扩散开,破坏前面4个原则的效果。大量真实系统故障是因为隔离性做得不好导致的,如:线下影响线上,离线影响在线,预发影响生产,一条烂SQL影响整个库(或整个集群)等等。
分散,均衡,隔离是控制风险影响范围的3个核心原则。打散拆分成N份,每一份都是均衡的,且相互隔离,一份有问题,影响范围为1/N。
无单点原则
架构设计应考虑“冗余”,快速止血的方式是切换,回滚,扩容等;回滚和扩容属于特殊的切换,回滚指的是切换到某个版本,扩容指的是将流量切换到新扩容的机器上。
切换的前提是有备份,所以不能有单点(这里特指强依赖的单点,弱依赖的可以降级),要有冗余备份或其他版本;单点会限制整体的可靠性。
假设单点的可靠性假设是99.99%,它要提升到99.999%是非常困难的,但是如果无单点而是依赖2个(1个挂掉没有关系,只要不同时挂就行),那整体可靠性就是99.999999% 会有质的提升。
单点故障会导致无法快速止血,拉长整个止血时间,去单点至关重要。这里的单点不仅仅指的是系统节点,也包含人员,如订阅告警的人,应急的人等等。
对于(重要)数据节点,必须满足无单点原则,否则极端情况下可能造成数据永久丢失,永远无法恢复;(重要)数据节点满足无单点原则后,保障数据一致性比可用性要求更重要。
无单点原则和分散原则的区别:
- 当节点无状态的情况下,打散拆分成N份,每份都是相同的功能,互为冗余,即:节点无状态情况下,分散原则和无单点原则等价,满足一个即可。
- 当节点有状态的情况下,打散拆分成N份,每份都是不相同的,每份都没有冗余,需要针对每份再做冗余,即:节点有状态情况下,既要满足分散原则又要满足单点原则。
自我保护原则
外部的输入都不是100%可靠的,有时候是无意的错误,有时候甚至是恶意的破坏,因此针对外部输入要有防错设计,给自己多一些保护,手段如削峰、限流等。
软件系统的风险源
从内看包括:计算系统和存储系统;从外看包括:人员,硬件,上游系统,下游系统;以及(隐含的)时间。
计算系统
计算系统变化过程是先运行变慢,最后运行错误,系统运行所依赖的服务器资源(如CPU,MEM,IO等),应用资源(RPC线程数,DB连接数等),业务资源(业务ID满了,余额不足,业务额度不够等)的负载等都会影响系统运行的风险期望。
存储系统
存储系统变化过程是先运行变慢,然后运行错误,最后导致数据错误。系统运行所依赖的服务器资源(如CPU,MEM,IO等),存储资源(并发数等),数据资源(单库容量,单表容量等)的负载和数据一致性等都会影响存储系统运行的风险期望。
人的因素
变更人员的数量,安全生产意识,熟练程度,变更的数量,变更的方式等都会影响变更的风险期望。
由于变更的人多,变更的次数也多,导致变更成为蚂蚁所有故障来源里的TOP1,这也是为什么“变更三板斧”这么出名的原因。“变更三板斧”正确的排序应该是“可灰度,可监控,可应急”;可灰度代表的是R,可监控和可应急代表的是T。
硬件
硬件的数量,质量,使用年限,保养等都会影响硬件的风险期望,硬件损坏会影响上层软件系统不可用。
上游变化
上游最大的问题就是请求会变大,请求分为3个维度:(由无数API汇集而成的)网络流量,(由无数KEY请求组成的)API,KEY。
- 网络流量过大会造成网络堵塞,影响网络通道中的所有网络流量请求。
- API请求过大会造成对应服务集群过载,影响整个服务机器上的所有API请求,甚至往外传播。
- KEY请求过大(俗称“热点KEY”)会造成单机过载,影响单机上所有KEY请求,甚至往外传播。
所以电商在大促保障的时候,不仅仅是关注核心API的容量保障,还需要考虑网络流量和热点KEY。
下游变化
下游服务的数量,服务等级,服务可用率等影响下游服务的风险期望。下游响应变慢可能会拖慢上游,下游响应错误可能会影响上游运行结果。
时间问题
时间到期往往被人忽视,但它往往具有突然性和全局破坏性,一旦时间到期触发故障会导致非常被动,所以要提前识别,尽早预警,如:秘钥到期,证书到期,费用到期,跨时区,跨年,跨月,跨日等。
高可用集群的衡量标准
通常用平均无故障时间(MTTF)来度量系统的可靠性,用平均故障维修时间(MTTR)来度量系统的可维护性。于是可用性被定义为:HA=MTTF/(MTTF+MTTR)*100%,具体HA衡量标准:
描述 | 通俗叫法 | 可用性级别 | 年度停机时间 |
---|---|---|---|
基本可用性 | 2个9 | 99% | 87.6小时 |
较高可用性 | 3个9 | 99.9% | 8.8小时 |
具有故障自动恢复能力的可用性 | 4个9 | 99.99% | 53分钟 |
极高可用性 | 5个9 | 99.999% | 5分钟 |
高可用集群实现原理
自动侦测(Auto-Detect)/ 故障检查
自动侦测阶段由主机上的软件通过冗余侦测线,经由复杂的监听程序,逻辑判断,来相互侦测对方运行的情况。常用的方法是:集群各节点间通过心跳信息判断节点是否出现故障。
当有节点(一个或多个)和另外节点互相接收不到对方心跳信息时,如何决定哪一部分节点是正常运行的,而哪一部分是出现故障需要隔离的(避免集群脑裂),这时候通过法定票数(quorum)决定,即当有节点故障时,节点间投票决定哪个节点是有问题的,票数大于半数为合法。
一般组成集群的节点数量为单数台(2n+1),当集群分区脑裂时,节点数量小于一半(>n+1)的分区自动停止对外提供服务。
自动切换/故障转移(FailOver)
自动切换阶段某一主机如果确认对方故障,则正常主机除继续进行原来的任务,还将依据各种容错备援模式接管预先设定的备援作业程序,并进行后续的程序及服务。
通俗地说,即当A无法为客户服务时,系统能够自动地切换,使B能够及时地顶上继续为客户提供服务,且客户感觉不到这个为他提供服务的对象已经更换。
通过上面判断节点故障后,将高可用集群资源(如VIP、httpd等)从该不具备法定票数的集群节点转移到故障转移域(FailoverDomain,可以接收故障资源转移的节点)。
自动恢复/故障回转(FailBack)
自动恢复阶段在正常主机代替故障主机工作后,故障主机可离线进行修复工作。在故障主机修复后,透过冗余通讯线与原正常主机连线,自动切换回修复完成的主机上。
高可用的实现
硬件
电源
采用双路供电
磁盘
可以分为RAID0、RAID1、RAID5等
* RAID0:又称为stripe或者striping,代表了RAID级别中最高的存储性能,原理就是把连续的数据分散到多个磁盘上进行存取,这样,系统有数据请求就可以被多个磁盘并行的执行,每个磁盘执行属于它自己的那部分数据请求,这样可以充分利用总线的带宽。
* RAID1:通过磁盘数据镜像实现数据冗余,在成对的独立磁盘上产生互为备份的数据,当原始数据繁忙时,可直接从镜像拷贝中读取数据,这样就提高了读取性能,并保证了数据的可靠性和安全性。当一个磁盘失效时,系统就可以自动切换到镜像磁盘上读写。
* RAID5:可以理解为RAID0和RAID1的折中方案,可以为系统提供数据安全保障,但保障程度要比mirror低,而磁盘空间利用率要比mirror高。
* RAID10:主要是一个RAID0和RAID1的结合,利用奇偶校验实现条带集镜像,继承了RAID0的快速和RAID1的安全
网卡:(bonding,双路)在linux服务器上可以利用bonding技术,将多个网卡当做一个网卡使用,不仅提高了带宽而且提高了可用性。
交换机
LACP、VRRP
* LACP(Link Aggregration Control Protocol,链路汇聚控制协议):是一种实现链路动态汇聚的协议,LACP协议通过LACPDU(LACP Data Unit,链路汇聚控制协议数据单元)与对端交互信息。当启用某一端口的LACP协议后,该端口将发送LACPDU向对端通告自己的系统优先级,系统MAC地址,端口优先级,端口号和操作Key。对端接受到这些信息后,将这些信息与其他端口所保存的信息比较以选择能够汇聚的端口,从而双发可以对端口加入或退出某个动态汇聚组达成一致。
* 虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议,VRRP广泛应用在边缘网络中,它的设计目标是支持特定情况下IP数据流量失败转移不会引起混乱,允许主机使用单路由器,以及及时在实际第一跳路由器使用失败的情形下仍能够维护路由器间的连通性。
软件
常见互联网分布式架构如上,分为:
(1)反向代理层:系统入口,反向代理
(2)站点应用层:实现核心应用逻辑,返回html或者json
(3)服务层:如果实现了服务化,就有这一层
(4)数据-缓存层:缓存加速访问存储
(5)数据-数据库层:数据库固化数据存储
我们先列出目前我们系统有哪些环节,每个环节是否薄弱. 客户端访问服务器端,经过很多环节,任何环节出问题,都不能访问:
(1)接入层(反向代理层):
- dns被劫持:域名是否使用https。
- 黑客攻击:是否有弱密,服务器权限,数据库权限
- ddos攻击:是否有必要使用高防IP接入流量。
- CC攻击:免费和收费版域名分开,网关是否有限流和防刷措施。
(2)应用层:
- 应用服务器宕机。
- 应用服务bug。
- 第三方服务不可用。
(3)服务层:
- 服务不可用或者出现bug
- 第三方服务不可用。
(4)数据和缓存层:
- 数据库服务器磁盘损坏导致数据库不可用等。
方法论上,高可用是通过冗余+自动故障转移来实现的,整个互联网分层系统架构的高可用,又是通过每一层的冗余+自动故障转移来综合实现的。
引自:https://mp.weixin.qq.com/s?__biz=MzIzOTU0NTQ0MA==&mid=2247502336&idx=1&sn=e5edd5fc48c8580ace85b9b065d32f38&scene=21#wechat_redirect
https://blog.csdn.net/u010489158/article/details/87029449
https://blog.csdn.net/mingongge/article/details/117049858
https://blog.csdn.net/Java_supermanNO1/article/details/102464796
https://mp.weixin.qq.com/s/lBtSJEcDzJKxXKtiOWABWA
https://mp.weixin.qq.com/s/97fH0yRXNs1nUPH8ffrfVg