高可用系统常用解决手段浅述

所谓可用性,是指 某系统能够提供正常服务的特性。

可用性的高低是使用不可用时间占总时间的比例来衡量。不可用时间是从故障发生到故障恢复的时间。 比如,可用性 4 个 9 的系统(99.99%),它一年宕机时间不能超过53分钟(=365*24*60*(1-0.9999)) 。 做到高可用系统,需要尽可能的降低故障发生的次数和减少故障持续的时间。

出现系统不可用的原因,一种是人为的,比如发布了有 bug 的代码、不规范的发布流程导致的宕机或者网站访问量过载造成的雪崩等;另一种则是非人为的,由于外部系统和环境的变化造成的,比如硬盘老化造成的故障、机房断电、电缆中断等。我们需要在复杂的外部环境下保证系统的高可用。以下总结了常用的高可用解决手段。

1 拆分

这类解决手段不是以减少不可用时间为目的,而是以减少故障影响面为目的。因为一个大的系统拆分成了几个小的独立模块,一个模块出了问题不会影响到其他的模块,从而降低故障的影响面。手段包括:

1.1 水平拆分

系统水平拆分成三层:接入层,服务层和数据存储层。将有状态和无状态的划分开来,接入层和服务层设计成无状态的,存储层是有状态的。无状态层的服务可以平行扩展,请求落到哪台服务器都没有关系。平行扩展也有利于系统容量的扩充,快速扩容应对突然爆发流量的冲击。

1.2 垂直拆分

根据功能垂直划分,拆成相对独立的模块。有的仅是服务层做了拆分,存储层共用。更为彻底的是,拆分与该系统的业务领域模型关联,一个领域模型划分成一个模块。在数据库层面,还可以分库分表拆分,这样一个库的损坏,不会影响到其他库。分库分表需要增加路由逻辑,及保证路由规则的一致性。

1.3 读写分离

也属于垂直拆分的一种。写请求的依赖主库,读请求的依赖备库。这样做,当出现故障的时候,可以只有读请求的流量,写服务暂时关闭,从而减少了故障的影响面。但需要关注数据一致性的问题。

2 降级

这类手段不是为了避免故障的发生,而是当故障发生后,怎么减小故障所造成的损失。比如,系统正常时提供的服务能力是 100%,出现系统故障后,我们有措施能让系统服务能力不直接降到了 0,而是还能提供 50% 的服务能力。

2.1 限流

限流,流量控制。当请求量超过系统的最大容量后,访问延迟就会增加,超过峰值的流量会拖累整个系统,出现宕机。因此,需要提前流量控制,对于超过峰值的流量,可以直接拒绝掉或者随机选择拒绝。限流结合业务自定义配置,优先保证核心服务的正常响应,非核心服务可直接关闭。

2.2 异步调用

系统进行拆分之后,会分成多个模块。模块之间的依赖有强弱之分。如果是强依赖的,那么如果依赖方出问题了,也会受到牵连出问题。这时可以梳理整个流程的调用关系,做成弱依赖调用。弱依赖调用通过消息中间件的方式来实现。

异步调用不关心返回结果,不会传递依赖方的错误,进而避免造成更大规模的不可用。

2.3 同步调用合理设置超时时间

对于不能异步化的,采用同步调用,需要注意设置合理的超时时间。过长的超时,会延迟结果等待时间,导致整体的链路调用时间延长,降低整体的QPS。

经验值:超时时间设置成平均响应延迟的2倍。

2.4 失败重试

要区分调用失败的类型。有些失败是短暂偶然的(比如网络抖动),进行重试即可。而有些失败是确定,那么重试反而会造成调用请求量的放大,加重对调用系统的负担。

经验值:重试的次数一般设为3次,再多次的重试没有好处。

2.5 兜底方案

在系统真的出现了不可用的时候,需要有兜底方案。比如一些提示安抚用户,或者有跳转链接转移用户的请求。 

3 冗余

冗余,目的是避免单点故障。比如对于接入层和服务层,可以平行扩展机器部署,这样一台机器宕机,可以将请求转移到其他机器。数据层的冗余比较复杂,增加一份备份数据,需要考虑一致性的问题。按照分布式系统的 CAP 理论三者不可用同时满足的原理,为了满足可用性和分区容错性,就必须牺牲一致性,因此考虑使用弱一致性、最终一致性的解决方案来解决(此类文章很多,略)。

冗余备份有全量和增量之分,有热备和冷备之分。冗余可以是两台机器的主备冗余,可以是多机的集群式冗余。从部署来看,可以是跨机架、跨机房到跨城的备份。多机复制部署,上层调用采用负载均衡策略,还需要注意负载均衡设备的单点问题。

失败通知和失败切换

当集群机器某台机器出现了故障,或者某个进程挂了,能够快速的发现,并且告警通知出来。路由选择器能快速的切除掉这台机器,当恢复后又能自动的加入回来。

4 灰度发布

有个观点,单点和发布是可用性最大的敌人。线网出现了故障,查故障的原因,一个常用的办法就是追查下最近是否有发过版本,比较下发布前后的代码。

使用灰度发布策略,发布并且验证没问题后再全量发布。灰度发布的策略,包括搭建预发布环境,有专用的预发布机器;或者路由策略先摘除灰度发布的机器,验证正常后再加入该机器;或者采用UIN取模灰度策略,验证没问题后再取消灰度策略。尽量采用自动化发布,减少人为发布的流程。尽量选择在访问量低峰时段升级,减小影响用户群。

回滚机制

出现问题后,能有有效的回滚机制。涉及到数据修改的,发布后会引起脏数据的写入,需要有可靠的回滚流程,保证脏数据的清除。

除了发布流程外,还应该在其他开发流程上做规范,比如代码控制,集成编译、自动化测试、静态代码扫描等。

5 切换

切换之前需要做好监控。监控应该是贯穿于上述所有手段的。比如业务某个模块访问量要监控,依赖的调用方出问题要监控,某个机房故障了要监控,发布了服务要监控等。监控既包括系统层面的(比如CPU、内存、网络、IO、进程),还包括业务层面的(请求量、错误率、耗时)。监控的间隔需要支持到分钟级甚至到秒级的。

监控不是目的,监控没法保证高可用,切换才是目的,从故障的系统切换到正常的系统才能保证可用性。比如监控某台机器硬盘出问题了,那么会告警出来,然后使用一台新的机器替换。

切换可以是自动的,也可以是人工的。人工切换会有延迟恢复的问题,但能做到准确。自动切换,会比较快速,但必须要确保切换源是正常的,否则可能会引起更加严重的事故。切换后,要有实时的效果反馈。

原文发布时间为:2017-04-05

时间: 2024-11-05 22:34:05

高可用系统常用解决手段浅述的相关文章

如何建设高可用系统

本文转自:http://ifeve.com/%E5%A6%82%E4%BD%95%E5%BB%BA%E8%AE%BE%E9%AB%98%E5%8F%AF%E7%94%A8%E7%B3%BB%E7%BB%9F/ 如何建设高可用系统 面试的时候经常会问一个问题,如何建设高可用系统?大家可以一起探讨下. "高可用性"(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性.以下是高可用系统的设计建议:   设计建议 减少单点 – 去单

业务爆发式增长 电商 IT 系统如何保证高可用?

对于各个电商平台来说,由于电子商务.互联网+.O2O 等各种概念的冲击,电商的业务形态及用户规模都不尽相同,各大电商公司也都在摸索适合自己业务高速发展的技术和业务架构.其中最关键的一点就是,如何才能让自身的基础设施满足企业业务不断发展的需求?如何才能在业务爆发式增长的前提下保证 IT 系统的性能.可靠性?今天的内容主要集中在如何保证业务爆发式增长背后的电商 IT 系统高可用.
 什么是电商平台的高可用? 1.核心业务的"永动机" 由于电商业务系统承载着商品展示.线上支付.物流跟踪.抢购

可用性高达五个9!支付系统高可用架构设计实战

对于互联网应用和企业大型应用而言,多数都尽可能地要求做到7*24小时不间断运行,而要做到完全的不间断运行可以说"难于上青天". 为此,对应用的可用性程度一般衡量标准有三个9到五个9. 对于一个功能和数据量不断增加的应用,要保持比较高的可用性并非易事.为了实现高可用,付钱拉从避免单点故障.保证应用自身的高可用.解决交易量增长等方面做了许多探索和实践. 在不考虑外部依赖系统突发故障,如网络问题.三方支付和银行的大面积不可用等情况下,付钱拉的服务能力可达99.999%. 本文重点讨论如何提高

亿级流量电商详情页系统的大型高并发与高可用缓存架构实战

对于高并发的场景来说,比如电商类,o2o,门户,等等互联网类的项目,缓存技术是Java项目中最常见的一种应用技术.然而,行业里很多朋友对缓存技术的了解与掌握,仅仅停留在掌握redis/memcached等缓存技术的基础使用,最多了解一些集群相关的知识,大部分人都可以对缓存技术掌握到这个程度.然而,仅仅对缓存相关的技术掌握到这种程度,无论是对于开发复杂的高并发系统,或者是在往Java高级工程师.Java资深工程师.Java架构师这些高阶的职位发展的过程中,都是完全不够用的.技术成长出现瓶颈,在自己

来自 Google 的高可用架构理念与实践

在 Google 我参与了两个比较大的 Project. 第一个是 YouTube,其中包括 video transcoding,streaming 等.Google 的量很大,每个月会有 1PB 级别的存储量.存储.转码后,我们还做 Global CDN.到 2012 年的时候,峰值流量达到 10 TBps,全球 10 万个节点,几乎每台机器都是 16/24 核跑满, 10G uplink 也是跑满的状态. 然后我加入了 Google Cloud Platform Team, 也就是 Borg

《高可用架构·中国初创故事(第3期)》一来自Google的高可用架构理念与实践

来自Google的高可用架构理念与实践 CTO @ coding.net .2007 - 2015 年初在 Google 的 Moutain View 担任 SRE (Site Reliability Engineering)职位. 参与了 Google 的两个项目:第一个是 Youtube,工作内容涵盖 Video transfer.Coding.Streaming.Global CDN 等:第二个是 Google Cloud Platform Team,主要工作是管理 Google 全球 1

阿里移动|《蚂蚁金服移动端高可用技术实践》

摘要:对于移动技术而言,2017年是继往开来之年.一方面是移动技术领域进入深水区,另一方面移动技术边界和内涵被不断重塑.阿里巴巴希望进一步推动移动应用研发事实标准落地,从而赋能整个行业开发者.在2017年杭州云栖大会上,蚂蚁金服高级技术专家竹光为大家分享了蚂蚁金服移动端在高可用技术方面的具体实践. 演讲嘉宾简介:竹光,蚂蚁金服高级技术专家.2015年加入支付宝,主要负责客户端的稳定性和高可用,曾多次参与双11.双12.春节红包等大促的技术保障工作,主要负责保证活动期间支付宝客户端的稳定性以及可用

Nginx+Keepalived实现站点高可用

公司内部 OA 系统要做线上高可用,避免单点故障,所以计划使用2台虚拟机通过 Keepalived 工具来实现 nginx 的高可用(High Avaiability),达到一台nginx入口服务器宕机,另一台备机自动接管服务的效果.(nginx做反向代理,实现后端应用服务器的负载均衡)快速搭建请直接跳至 第2节. 1. Keepalived介绍 Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat.corosync.p

聊聊高可用架构——异地多活

很久没写了,要长草了. 今天咱们来聊聊高可用系统架构的热点--异地多活. 现在比较吊的多活方式是异地三节点,有多少公司真正实现了就不得而知了.为什么要做异地多活,主要是为了提升系统的容灾能力,比如单机房的网络故障.地震火灾等不可抗因素,都有可能造成整个机房瘫痪. 在上一家公司负责支付系统开发的时候,由于我们在天津机房的硬件设施太过老旧,经常时不时地网络故障,进而逼我们搭建了一个异地多活的架构.我们先来看看我们当时的做法.整个部署结构如下图:              通过域名做负载均衡,将请求路