高并发系统设计:系统设计目标②系统怎样做到高可用?

wt645631686 wt645631686     2022-11-30     651

关键词:

通常来讲,一个高并发大流量的系统,系统出现故障比系统性能低更损伤用户的使用体验。

可用性的度量

可用性是一个抽象的概念,你需要知道要如何来度量它,与之相关的概念是:MTBF和MTTR。

MTBF(Mean Time Between Failure)是平均故障间隔的意思,代表两次故障的间隔时间,也就是系统正常运转的平均时间。这个时间越长,系统稳定性越高。

MTTR(Mean Time To Repair)表示故障的平均恢复时间,也可以理解为平均故障时间。这个值越小,故障对于用户的影响越小。

 

技术图片

 

 

高可用系统设计的思路

一个成熟系统的可用性需要从系统设计和系统运维两方面来做保障,两者共同作用,缺一不可。

1.系统设计

系统设计是我们做高可用系统设计时秉持的第一原则。在承担百万QPS的高并发系统中,集群中机器的数量成百上千台,单机的故障是常态,几乎每一天都有发生故障的可能。

在做系统设计的时候,要把发生故障作为一个重要的考虑点,预先考虑如何自动化地发现故障,发生故障之后要如何解决。当然了,我们还需要掌握一些具体的优化方法,比如故障转移、超时控制以及降级和限流。

①故障转移

一般来说,发生故障转移的节点可能有两种情况(如mysql的双主热备的两个主服务器):

  1. 在完全对等的节点之间做转移,也就是同级。
  2. 在不对等的节点之间,即系统中存在主节点也存在备节点。

举个例子,Nginx可以配置当某一个Tomcat出现大于500的请求的时候,重试请求另一个Tomcat节点,就像下面这样:

技术图片

 

 

我们就需要在代码中控制如何检测主备机器是否故障,以及如何做主备切换,最广泛的故障检测机制是“心跳”。

②系统间调用超时的控制

复杂的高并发系统通常会有很多的系统模块组成,同时也会依赖很多的组件和服务,比如说缓存组件,队列服务等等。它们之间的调用最怕的就是延迟而非失败,因为失败通常是瞬时的,可以通过重试的方式解决。而一旦调用某一个模块或者服务发生比较大的延迟,调用方就会阻塞在这次调用上,它已经占用的资源得不到释放。当存在大量这种阻塞请求时,调用方就会因为用尽资源而挂掉。

举例:

模块之间通过RPC框架来调用,超时时间是默认的30秒。平时系统运行得非常稳定,可是一旦遇到比较大的流量,RPC服务端出现一定数量慢请求的时候,RPC客户端线程就会大量阻塞在这些慢请求上长达30秒,造成RPC客户端用尽调用线程而挂掉。后面我们在故障复盘的时候发现这个问题后,调整了RPC,数据库,缓存以及调用第三方服务的超时时间,这样在出现慢请求的时候可以触发超时,就不会造成整体系统雪崩。

超时时间短了,会造成大量的超时错误,对用户体验产生影响;超时时间长了,又起不到作用。建议你通过收集系统之间的调用日志,统计比如说99%的响应时间是怎样的,然后依据这个时间来指定超时时间。如果没有调用的日志,那么你只能按照经验值来指定超时时间。不过,无论你使用哪种方式,超时时间都不是一成不变的,需要在后面的系统维护过程中不断地修改。

超时控制实际上就是不让请求一直保持,而是在经过一定时间之后让请求失败,释放资源给接下来的请求使用。这对于用户来说是有损的,但是却是必要的,因为它牺牲了少量的请求却保证了整体系统的可用性。

③降级

降级是为了保证核心服务的稳定而牺牲非核心服务的做法。比方说我们发一条微博会先经过反垃圾服务检测,检测内容是否是广告,通过后才会完成诸如写数据库等逻辑。

反垃圾的检测是一个相对比较重的操作,因为涉及到非常多的策略匹配,在日常流量下虽然会比较耗时却还能正常响应。但是当并发较高的情况下,它就有可能成为瓶颈,而且它也不是发布微博的主体流程,所以我们可以暂时关闭反垃圾服务检测,这样就可以保证主体的流程更加稳定。

④限流

比如对于Web应用,我限制单机只能处理每秒1000次的请求,超过的部分直接返回错误给客户端。虽然这种做法损害了用户的使用体验,但是它是在极端并发下的无奈之举,是短暂的行为,因此是可以接受的。

2.系统运维

从灰度发布、故障演练两个方面来考虑如何提升系统的可用性。

①灰度发布

在业务平稳运行过程中,系统是很少发生故障的,90%的故障是发生在上线变更阶段的。比如你上了一个新的功能,由于设计方案的问题,数据库的慢请求数翻了一倍,导致系统请求被拖慢而产生故障。

如果没有变更,数据库怎么会无缘无故地产生那么多的慢请求呢?因此,为了提升系统的可用性,重视变更管理尤为重要。而除了提供必要回滚方案,以便在出现问题时快速回滚恢复之外,另一个主要的手段就是灰度发布。

灰度发布指的是系统的变更不是一次性地推到线上的,而是按照一定比例逐步推进的。一般情况下,灰度发布是以机器维度进行的。比方说,我们先在10%的机器上进行变更,同时观察Dashboard上的系统性能指标以及错误日志。如果运行了一段时间之后系统指标比较平稳并且没有出现大量的错误日志,那么再推动全量变更。灰度发布给了开发和运维同学绝佳的机会,让他们能在线上流量上观察变更带来的影响,是保证系统高可用的重要关卡。

②故障演练

故障演练指的是对系统进行一些破坏性的手段,观察在出现局部故障时,整体的系统表现是怎样的,从而发现系统中存在的,潜在的可用性问题。

一个复杂的高并发系统依赖了太多的组件,比方说磁盘,数据库,网卡等,这些组件随时随地都可能会发生故障。建议你另外搭建一套和线上部署结构一模一样的线下系统,然后在这套系统上做故障演练,从而避免对生产系统造成影响。

成为架构师课程系列怎样进行高性能高可用的高并发系统的设计?

为什么要学习高并发系统设计?在解答「为什么要学习高并发系统设计」之前,我想让你思考几个问题:在微博中,明星动辄拥有几千万甚至上亿的粉丝,你要怎么保证明星发布的内容让粉丝实时地看到呢?淘宝双十一,当你和... 查看详情

李智慧·高并发架构实战课课程大纲

1开篇词|“附身”大厂架构师,身临其境设计高并发系统201|软件建模与文档:架构师怎样绘制系统架构蓝图?302|高并发架构设计方法:面对高并发,怎么对症下药?504|网页爬虫设计:如何下载千亿级网页?605|网盘系统设计:万... 查看详情

架构高可用高并发系统的设计原则

...该这么学》学习笔记及自己的感悟:架构设计之高可用高并发系统设计原则,架构设计包括墨参考技术A通过学习《亿级流量网站架构核心技术》及《linux就该这么学》学习笔记及自己的感悟:架构设计之高可用高并发系统设计原... 查看详情

高并发系统设计三(提升性能)(代码片段)

...f0c;你可能听到最多的词儿就是“三高”,也就是“高并发”“高性能”“高可用”,它们是互联网系统架构设计永恒的主题。在前两节课中,我带你了解了高并发系统设计的含义,意义以及分层设计原则,接... 查看详情

高并发系统设计:系统设计目标③如何让系统易于扩展?

...宽等等都是系统扩展时需要考虑的因素。我们要知道系统并发到了某一个量级之后,哪一个因素会成为我们的瓶颈点,从而针对性地进行扩展。比方说,你系统的流量是每秒1000次请求,对数据库的请求量也是每秒1000次。如果流... 查看详情

03|系统设计目标:如何提升系统性能?

提到互联网系统设计,你可能听到最多的词儿就是“三高”,也就是“高并发”“高性能”“高可用”,它们是互联网系统架构设计永恒的主题。   查看详情

高并发系统设计的15个锦囊(代码片段)

...面的面试官问了一道场景设计题目:如何设计一个高并发系统。当时我回答得比较粗糙,最近回想起来,所以整理了设计高并发系统的15个锦囊,相信大家看完会有帮助的。如何理解高并发系统所谓设计高并发系... 查看详情

高并发系统设计的15个锦囊(代码片段)

...面的面试官问了一道场景设计题目:如何设计一个高并发系统。当时我回答得比较粗糙,最近回想起来,所以整理了设计高并发系统的15个锦囊,相信大家看完会有帮助的。如何理解高并发系统所谓设计高并发系... 查看详情

如何设计一个高可用高并发秒杀系统

作者:vincentsu,腾讯PCG后台开发工程师如今的互联网已经在海量服务领域有了很成熟的理论,因此自己也很庆幸,能够从0到1完整践行海量服务。微视春节项目中的集卡瓜分活动,是一个典型的秒杀场景,自己参与其中,分享一... 查看详情

高并发系统设计

高并发系统设计半同步半异步I/O的设计模式(halfsync/halfasync) 查看详情

看过来!商城系统的三高(高并发高性能高可用)了解一下!

...师在设计系统时要考虑到业务功能的实现,保证系统的高并发性和高可用性。下面就带大家了解什么是高并发?什么是高性能?什么是高可用?1、商城高并发(HighConcurrency)图片来自互联网, 查看详情

高并发高可用架构设计之简介

设计一个好的架构需要满足:高并发、高性能、高可用三个条件。举一个实际的例子,如高并发方面要求QPS大于10万;高性能方面要求请求延迟小于100ms;高可用方面要高于99.99%。注:QPS(QueryPerSecond):每秒请求数,就是说服务... 查看详情

高并发高可用架构设计之简介

设计一个好的架构需要满足:高并发、高性能、高可用三个条件。举一个实际的例子,如高并发方面要求QPS大于10万;高性能方面要求请求延迟小于100ms;高可用方面要高于99.99%。注:QPS(QueryPerSecond):每秒请求数,就是说服务... 查看详情

系统架构高可用系统设计原则01(代码片段)

...用“高可用性”(HighAvailability)简称HA,通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。通俗来讲就是通过专业的设计保障系统相关服务能够不间断的稳定运行。度量方式:%availability=(T... 查看详情

面试题:如何设计一个高并发的系统?(代码片段)

...知识点比较多,主要考察的是面试者的综合技术能力。高并发系统的设计手段有很多,主要体现在以下五个方面。1、前端层优化①静态资源缓存:将活动页面上的所有可以静态的元素全部静态化,尽量减少动态元素;通过CDN、... 查看详情

什么是高可用

一、什么是高可用高可用HA(HighAvailability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。假设系统一直能够提供服务,我们说系统的可用性是100%。如果系统每运行100个时... 查看详情

大厂都是如何对高并发系统做到高可用的?(代码片段)

高可用性(HighAvailability,HA)系统具备较高的无故障运行的能力。Hadoop1.0的NameNode是单点,一旦故障,整个集群不可用。Hadoop2提出的NameNodeHA方案就是同时启动两个NameNode:一个处Active状态另一个处Standby状... 查看详情

高并发高性能下的会员系统[同程艺龙]—高可用架构设计实践

目录会员系统[同程艺龙]—高可用架构设计实践ES高可用方案ES双中心主备集群架构ES流量隔离三集群架构ES集群深度优化提升会员Redis缓存方案Redis双中心多集群架构高可用会员主库方案MySQL双中心Partition集群方案会员主库平滑迁... 查看详情