Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >高可用架构:如何做到应用升级无感知

高可用架构:如何做到应用升级无感知

作者头像
wayn
发布于 2024-03-11 12:53:47
发布于 2024-03-11 12:53:47
3870
举报
文章被收录于专栏:wayn的程序开发wayn的程序开发

十几年前,我参加阿里巴巴面试的时候,觉得阿里巴巴这样的网站Web应用开发简直小菜,因为我之前是做类似Tomcat这样的Web容器开发的,所以面试的时候信心满满。

确实,面试官前面的问题都是关于数据结构、操作系统、设计模式的,也就是我们这个专栏模块一和模块二的内容。我感觉自己回答得还不错,所以更加信心满满。这时候,面试官忽然提了一个问题:

我们的Web程序每个星期都会发布一个新版本,但是程序要求7*24小时可用,也就是说,启动新版本程序替换老程序,进行程序升级的时候,程序还在对外提供服务,用户没有感觉到停机,我们是怎么做到的呢?

应用程序升级必须要用新版本的程序包替代老版本的程序包,并重新启动程序,这段时间程序是不能对外提供服务的,用户请求一定会失败。但是阿里巴巴让这段时间的用户请求依然是成功的。打个比方,就是要在飞机飞行过程中更换发动机,还不能让乘客感觉到。这个问题当时完全不在我的知识范围之内,但是我知道这个需求场景是真实存在的,而且确实应该是可以做到的,可是我完全不知道是怎么做到的。

面试官看我瞠目结舌,笑着问我,想不想知道答案。我立刻回答说想知道,结果面试官跟我说,加入我们团队你就知道了。

这其实是一个关于互联网应用可用性的问题。我们知道,Web应用在各种情况下都有可能不可访问,也就是不可用。各种硬件故障,比如应用服务器数据库宕机、网络交换机宕机、磁盘损坏、网卡松掉等等。还有各种软件故障,程序Bug什么的。即使没有Bug,程序要升级,必须要关闭进程重新启动,这段时间应用也是不可用的;此外,还有外部环境引发的不可用,比如促销引来大量用户访问,导致系统并发压力太大而崩溃,以及,黑客攻击、机房火灾、挖掘机挖断光缆,各种情况导致的应用不可用。

而互联网的高可用是说,在上面各种情况下,应用都要是可用的,用户都能够正常访问系统,完成业务处理。

这似乎是不可能的任务。

高可用的度量

首先我们看下,什么叫做应用的高可用,以及可用性如何度量。业界通常用多少个9来说明互联网应用的可用性。比如说淘宝的可用性是4个9,就是说淘宝的服务99.99%可用。这句话的意思是,淘宝的服务要保证在所有的运行时间里只有0.01%不可用,也就是说一年大概有53分钟不可用。这个99.99%就叫做系统的可用性指标,这个值的计算公式是:

一般说来,两个9表示系统基本可用,年度不可用时间小于88小时;3个9是较高可用,年度不可用时间小于9个小时;4个9是具有自动恢复能力的高可用,年度不可用时间小于53分钟;5个9指极高的可用性,年度不可用时间小于5分钟。我们熟悉的互联网产品的可用性大多是4个9。淘宝、百度、微信,差不多都是这样。

下面我会讨论各种高可用技术方案。但不管是哪种方案,实现高可用需要投入的技术和设备成本都非常高。因此可用性并不是越高越好,而是要根据产品策略寻找高可用投入产出的最佳平衡点,像支付宝这样的金融产品就需要更高的可用性,而微博的可用性要求就会相对低一些。

可用性指标是对系统整体可用性的一个度量。在互联网企业中,为了更好地管理系统的可用性,界定好系统故障以后的责任,通常会用故障分进行管理。一般过程是,根据系统可用性指标换算成一个故障分,这个故障分是整个系统的故障分,比如10万分,然后根据各自团队各个产品各个职能角色承担的责任的不同,把故障分下发给每个团队,直到每个人,也就是说每个工程师在年初的时候就会收到一个预计的故障分。然后每一次系统出现可用性故障的时候,都会进行故障考核,划定到具体的团队和责任人以后,会扣除他的故障分。如果到了年底的时候,如果一个工程师的故障分为负分,那么很有可能会影响他的绩效考核。

高可用的架构

系统的高可用架构就是要在上述各种故障情况下,保证系统依然可以提供服务,具体包含以下几种架构方案。我们已经在前面几篇架构专栏中提到过这些架构方案,这里我们从高可用的视角重新审视以下这些架构是如何实现高可用的。

冗余备份

既然各种服务器故障是不可避免的,那么架构设计上就要保证,当服务器故障的时候,系统依然可以访问。具体上就是要实现服务器的冗余备份。

冗余备份是说,提供同一服务的服务器要存在冗余,即任何服务都不能只有一台服务器,服务器之间要互相进行备份,任何一台服务器出现故障的时候,请求可以发送到备份的服务器去处理。这样,即使某台服务器失效,在用户看来,系统依然是可用的。

我在负载均衡架构这篇文章中讲了通过负载均衡服务器,将多台应用服务器构成一个集群共同对外提供服务,这样可以利用多台应用服务器的计算资源,满足高并发的用户访问请求。事实上,负载均衡还可以实现系统的高可用。

负载均衡服务器通过心跳检测发现集群中某台应用服务器失效,然后负载均衡服务器就不将请求分发给这台服务器,对用户而言,也就感觉不到有服务器失效,系统依然可用。

回到我们开头的问题,阿里巴巴就是用这种方法实现的。应用程序升级的时候,停止应用进程,但是不影响用户访问。因为应用程序部署在多台服务器上,应用程序升级的时候,每次只STOP一台或者一部分服务器,在这些机器上进行程序升级,这个时候,集群中还有其他服务器在提供服务器,因此用户感觉不到服务器已经停机了。

此外我在数据存储架构这篇文章中提到的数据库主主复制,也是一种冗余备份。这个时候,不只是数据库系统RDBMS互相进行冗余备份,数据库里的数据也要进行冗余备份,一份数据存储在多台服务器里,保证当任何一台服务器失效,数据库服务依然可以使用。

失败隔离

保证系统高可用的另一个策略是失败隔离,将失败限制在一个较小的范围之内,使故障影响范围不扩大。具体实现失败隔离的主要架构技术是消息队列

一方面,消息的生产者和消费者通过消息队列进行隔离。如果消费者出现故障的时候,生产者可以继续向消息队列发送消息,而不会感知到消费者的故障,等消费者恢复正常以后再去从消息队列中消费消息,所以从用户处理的视角看,系统一直是可用的。

发送邮件消费者出现故障,不会影响生产者应用的运行,也不会影响发送短信等其他消费者正常的运行。

另一方面,由于分布式消息队列具有削峰填谷的作用,所以在高并发的时候,消息的生产者可以将消息缓冲在分布式消息队列中,消费者可以慢慢地从消息队列中去处理,而不会将瞬时的高并发负载压力直接施加到整个系统上,导致系统崩溃。也就是将压力隔离开来,使消息生产者的访问压力不会直接传递到消息的消费者,这样可以提高数据库等对压力比较敏感的服务的可用性。

同时,消息队列还使得程序解耦,将程序的调用和依赖隔离开来,我们知道,低耦合的程序更加易于维护,也可以减少程序出现Bug的几率。

限流降级

限流和降级也是保护系统高可用的一种手段。在高并发场景下,如果系统的访问量超过了系统的承受能力,可以通过限流对系统进行保护。限流是指对进入系统的用户请求进行流量限制,如果访问量超过了系统的最大处理能力,就会丢弃一部分的用户请求,保证整个系统可用,保证大部分用户是可以访问系统的。这样虽然有一部分用户的请求被丢弃,产生了部分不可用,但还是好过整个系统崩溃,所有的用户都不可用要好。

降级是保护系统的另一种手段。有一些系统功能是非核心的,但是它也给系统产生了非常大的压力,比如说在电商系统中有确认收货这个功能,即便我们不去确认收货,系统也会超时自动确认收货。

但实际上确认收货这个操作是一个非常重的操作,因为它会对数据库产生很大的压力:它要进行更改订单状态,完成支付确认,并进行评价等一系列操作。如果在系统高并发的时候去完成这些操作,那么会对系统雪上加霜,使系统的处理能力更加恶化。

解决办法就是在系统高并发的时候,比如说像淘宝双11的时候,当天可能整天系统都处于一种极限的高并发访问压力之下,这时候就可以将确认收货、评价这些非核心的功能关闭,将宝贵的系统资源留下来,给正在购物的人,让他们去完成交易。

异地多活

我们前面提到的各种高可用策略,都还是针对一个数据中心内的系统架构,针对服务器级别的软硬件故障而言的。但如果整个数据中心都不可用,比如说数据中心所在城市遭遇了地震,机房遭遇了火灾或者停电,这样的话,不管我们前面的设计和系统多么的高可用,系统依然是不可用的。

为了解决这个问题,同时也为了提高系统的处理能力和改善用户体验,很多大型互联网应用都采用了异地多活的多机房架构策略,也就是说将数据中心分布在多个不同地点的机房里,这些机房都可以对外提供服务,用户可以连接任何一个机房进行访问,这样每个机房都可以提供完整的系统服务,即使某一个机房不可使用,系统也不会宕机,依然保持可用。

异地多活的架构考虑的重点就是,用户请求如何分发到不同的机房去。这个主要可以在域名解析的时候完成,也就是用户进行域名解析的时候,会根据就近原则或者其他一些策略,完成用户请求的分发。另一个至关重要的技术点是,因为是多个机房都可以独立对外提供服务,所以也就意味着每个机房都要有完整的数据记录。用户在任何一个机房完成的数据操作,都必须同步传输给其他的机房,进行数据实时同步。

数据库实时同步最需要关注的就是数据冲突问题。同一条数据,同时在两个数据中心被修改了,该如何解决?为了解决这种数据冲突的问题,某些容易引起数据冲突的服务采用类似MySQL的主主模式,也就是说多个机房在某个时刻是有一个主机房的,某些请求只能到达主机房才能被处理,其他的机房不处理这一类请求,以此来避免关键数据的冲突。

小结

除了以上的高可用架构方案,还有一些高可用的运维方案:通过自动化测试减少系统的Bug;通过自动化监控尽早发现系统的故障;通过预发布验证发现测试环境无法发现的Bug;灰度发布降低软件错误带来的影响以及评估软件版本升级带来的业务影响等等。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 waynblog 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
架构设计---高可用的处理
系统的高可用架构就是要在上述各种故障情况下,保证系统依然可用提供服务,具体包括以下几种架构方案。
小马哥学JAVA
2023/02/27
4210
架构设计---高可用的处理
高可用架构和系统设计经验
可用性是一个可以量化的指标,计算的公式在维基百科中是这样描述的:根据系统损害、无法使用的时间,以及由无法运作恢复到可运作状况的时间,与系统总运作时间的比较。行业内一般用几个9表示可用性指标,对应用的可用性程度一般衡量标准有三个9到五个9;一般我们的系统至少要到 4 个 9(99.99%)的可用性才能谈得上高可用。
Allen.Wu
2022/12/19
1.6K0
大型网站技术架构,网站的高可用架构(三)
我们通常使用多少个9来衡量网站的可用性,比如4个9代表一个服务99.99%可用,即该需要保证在单位时间内只有0.01%的时间可以发生故障服务不可用。2个9与3个9的意思也同样如此。但对于网站整体而言,想要达到4个9甚至5个9的可用性,除了过硬的技术、大量的设备资金投入还需要有个好运气。
用户5997198
2019/08/12
1.2K0
大型网站技术架构,网站的高可用架构(三)
分布式架构中的三高:高并发、高性能、高可用
互联网应用以及云计算的普及,使得架构设计和软件技术的关注点从如何实现复杂的业务逻 辑,转变为如何满足大量用户的高并发访问请求。
用户2146693
2021/11/24
8.9K0
分布式架构中的三高:高并发、高性能、高可用
架构概述之架构演化、模式与核心要素
如何打造一个高可用、高性能、易扩展、可伸缩且安全的应用系统?相信这是困扰着无数开发者的难题,在这里我们以一个网站为例,来讨论一下如何做好大型应用系统的架构设计。
架构之家
2022/07/12
3020
架构概述之架构演化、模式与核心要素
大型网站架构基础,我们需要知道这八个架构范式
今天我会跟大家分享的是,我们在做大型网站基础架构的时候,要知道的这八个架构范式,帮助大家了解大型网站架构中相对成熟且经过大量案例检验的这些技术和方案。
brookwang
2022/06/24
5150
大型网站架构基础,我们需要知道这八个架构范式
技术角 | 架构学习书摘总结(三)高可用架构模式(下)
最近阅读了一本架构方面的入门图书叫《从零开始学架构:照着做,你也能成为架构师》,部分内容比较不错,先做书摘总结,以便加深印象与未来回顾学习。
ZNing
2020/05/13
8960
《大型网站技术架构》读书笔记之五:万无一失之网站的高可用架构
此篇已收录至《大型网站技术架构》读书笔记系列目录贴,点击访问该目录可获取更多内容。
Edison Zhou
2018/08/20
5100
《大型网站技术架构》读书笔记之五:万无一失之网站的高可用架构
工作十年,在腾讯沉淀的高可用系统架构设计经验
👉腾小云导读 在系统的开发过程中,很多开发者都为了实现系统的高可用性而发愁。本文从研发规范层面、应用服务层面、存储层面、产品层面、运维部署层面、异常应急层面这六大层面去剖析一个高可用系统的架构设计需要有哪些关键的设计和考虑。希望腾讯的经验方法,能够给广大开发者提供参考。内容较长,您可以收藏后持续阅读。 👉看目录点收藏,随时涨技术 1 高可用系统的架构设计思想     1.1 可用性和高可用概念     1.2 高可用系统设计思想 2 研发规范层面     2.1 方案设计和编码规范     2.2 容量规划
腾讯云开发者
2023/03/14
5.5K0
工作十年,在腾讯沉淀的高可用系统架构设计经验
如何打造一个高并发,处理海量数据,高性能,易扩展,可伸缩,高可用的网站?
简而言之,采用分布式系统,分布式应用和服务,分布式数据和存储,分布式静态资源,分布式计算,分布式配置和分布式锁。
lyb-geek
2018/10/24
1.3K0
高可用架构之异地多活
当谈到架构的高可用时,无论是高可用计算架构,还是高可用存储架构,其本质的设计目的都是为了解决部分服务器故障的场景下,如何保证系统能够继续提供服务。但在一些极端场景下,有可能所有服务器都出现故障。例如,典型的有机房断电、机房火灾、地震、水灾……这些极端情况会导致某个系统所有服务器都故障,或者业务整体瘫痪,而且即使有其他地区的备份,把备份业务系统全部恢复到能够正常提供业务,花费的时间也比较长,可能是半小时,也可能是一天。因为备份系统平时不对外提供服务,可能会存在很多隐藏的问题没有发现。如果业务期望达到即使在此类灾难性故障的情况下,业务也不受影响,或者在几分钟内就能够很快恢复,那么就需要设计异地多活架构。
架构狂人
2023/08/16
5300
高可用架构之异地多活
读《大型网站技术架构》
《大型网站技术架构》是自己接触的第一本架构知识的书籍,还是在14年时买的实体书,前后读了几遍,颇有所得,后来实体书被朋友借走再没归还,也就没再翻过。
高广超
2018/12/12
1.2K1
大型网站技术架构核心原理与案例分析(一)
高并发,大流量;高可用;海量数据;用户分布广泛,网络情况复杂;安全环境恶劣;需求快速变更,发布频繁;渐进式发展;
硬核项目经理
2019/08/06
8320
大型网站架构技术模型
三层架构逻辑上可以部署在同一台物理机上,但随着网站业务的发展,必须要对已分层的模块进行分开部署,也就是三层结构分别部署在不同的服务器上。使网站拥有越来越多的计算资源以应对越来越多的用户访问。
马士兵的朋友圈
2020/09/08
1.1K0
大型网站架构技术模型
基于SOA的高并发和高可用分布式系统架构和组件详解
基于SOA的分布式高可用架构和微服务架构,是时下如日中天的互联网企业级系统开发架构选择方案。在核心思想上,两者都主张对系统的横向细分和扩展,按不同的业务功能模块来对系统进行分割并且使用一定的手段实现服务之间的通信,并且基于弹性云服务搭建高可用的分布式解决方案。
用户7353950
2022/06/23
8830
基于SOA的高并发和高可用分布式系统架构和组件详解
如何设计一个高可用系统?要考虑哪些地方?
高可用描述的是一个系统在大部分时间都是可用的,可以为我们提供服务的。高可用代表系统即使在发生硬件故障或者系统升级的时候,服务仍然是可用的。
Guide哥
2020/05/07
4.3K0
如何设计一个高可用系统?要考虑哪些地方?
B 站崩了,总结下「高可用」和「异地多活」
不用想象一种异常场景了,这就真实发生了:B 站晚上 11 点突然挂了,网站主页直接报 404。
悟空聊架构
2021/07/16
8520
B 站崩了,总结下「高可用」和「异地多活」
教你用 3 台机器搞定一个 Redis 高可用架构
基于内存的 Redis 应该是目前各种 Web 开发业务中最为常用的 key-value 数据库了。
Java技术栈
2019/07/12
6840
教你用 3 台机器搞定一个 Redis 高可用架构
大型互联网架构概述
描述:通常服务器操作系统使用 linux,应用程序使用 PHP 开发,然后部署在 Apache 上,数据库使用 Mysql,通俗称为 LAMP。汇集各种免费开源软件以及一台廉价服务器就可以开始系统的发展之路了。
李红
2019/05/29
6480
跨数据中心下的 Kafka 高可用架构分析
导语 本文介绍了 Kafka 跨数据中心的两种部署方式,简要分析两种方式下的不同架构以及优缺点,对这些架构可能碰到的问题也提供了一些解决思路;同时也说明了 Kafka 跨数据中心部署的社区解决方案和商业化解决方案。 背景 Kafka 作为世界上最流行的消息中间件之一,一般是客户数据链路中的核心组件,高可用性是客户很关注的因素。近期在对接云上客户时发现,客户对 Kafka 的高可用也有需求,行业架构师也想了解 Kafka 高可用的方案细节;有些客户是需要云上 Kafka 的高可用能力,有些客户需要 IDC
腾讯云中间件团队
2023/04/28
1.9K0
跨数据中心下的 Kafka 高可用架构分析
推荐阅读
相关推荐
架构设计---高可用的处理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档