美团2面:5个9高可用99.999%,如何实现?

news2024/9/22 17:20:57

说在前面

在40岁老架构师 尼恩的读者社区(50+)中,最近有小伙伴拿到了一线互联网企业如网易、有赞、希音、百度、网易、滴滴的面试资格,遇到一几个很重要的面试题:

问题1:你们系统,高可用怎么实现?

问题2: 4个9高可用99.99%,如何实现?

注意,最近一个小伙伴美团2面,又遇到了这个问题: 5个9高可用99.999%,如何实现?

尼恩提示,高可用的问题,是架构的核心知识,又是线上的重点难题。

所以,这里尼恩给大家做一下系统化、体系化的线程池梳理,使得大家可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”

也一并把这个题目以及参考答案,收入咱们的 《尼恩Java面试宝典》V63版本,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。

最新《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请到公号【技术自由圈】获取

文章目录

    • 说在前面
    • 架构设计的3高原则
    • 3个9的架构--通用架构
      • 高可用SLB 组件介绍
      • 什么是多可用区?
      • 主备可用区列表
    • 4个9的高可用架构—同城容灾
    • 5个9的高可用架构—异地容灾
      • 虚拟专用网络(VPC)进行实现不同地域互通
      • 参考案例:阿里云关系型数据库RDS 高可用介绍
    • 异地多活数据一致性:DTS组件
    • 说在最后
    • 参考文献
    • 推荐阅读

架构设计的3高原则

现如今,开发一个软件系统,对其要求越来越高,如果你了解一些「架构设计」的要求,就知道一个好的软件架构应该遵循以下 3 个原则:

  1. 高性能
  2. 高并发
  3. 高可用

高性能意味着系统拥有更大流量的处理能力,更低的响应延迟。

例如 1 秒可处理 10W 并发请求,接口响应时间 5 ms 等等。

高并发表示系统在迭代新功能时,能以最小的代价去扩展,系统遇到流量压力时,可以在不改动代码的前提下,去扩容系统。

高可用通常用 2 个指标来衡量:

  • 平均故障间隔 MTBF(Mean Time Between Failure):表示两次故障的间隔时间,也就是系统「正常运行」的平均时间,这个时间越长,说明系统稳定性越高
  • 故障恢复时间 MTTR(Mean Time To Repair):表示系统发生故障后「恢复的时间」,这个值越小,故障对用户的影响越小

可用性与这两者的关系:

可用性(Availability)= MTBF / (MTBF + MTTR) * 100%

这个公式得出的结果是一个「比例」,通常我们会用「N 个 9」来描述一个系统的可用性。

从这张图你可以看到,要想达到 4 个 9 以上的可用性,一年的不可以时间为 52分钟,平均每天故障时间必须控制在 10 秒以内。

系统发生故障其实是不可避免的,尤其是规模越大的系统,发生问题的概率也越大。

3个9的架构–通用架构

在阿里云平台上,对于中小型企业,业务量不是特别大,对异地容灾要求不是特别强烈,

则可采用以下高可用方案(如下图:图六),

可以在同一地域下选择购买云产品。

建议在VPC网络环境下,选择同一可用区或者同地域不同可用区的云产品。

同时建议ECS服务器至少两台,避免单点故障,在前端购买SLB,提供负载功能,这样当后端ECS资源使用紧张时可以直接横向扩展,对业务无影响。

另外,数据库业务尽量不要和应用服务部署在同一台ECS上。

防止不同服务之间资源抢占,同时方便日常管理和后期扩容。数据库服务器推荐直接购买RDS产品,数据安全有保障,同时也不需要花太多精力去运维管理。

高可用SLB 组件介绍

阿里云SLB组件使用开源软件LVS+keeplived实现4层的负载均衡。

7层采用淘宝的Tengine实现7层的负载均衡。

所有负载均衡均采用集群部署,集群之间实时会话同步,以消除服务器单点,提升冗余,保证服务稳定。在各个地域采用多物理机房部署,实现同城容灾。

SLB在整体设计上让其可用性高达99.99%。

且能够根据应用负载进行弹性扩容,在任意一台SLB故障或流量波动等情况下都能做到不中断对外服务。

什么是多可用区?

云产品的可用区指的是一套独立的基础设施,不同的可用区之间基础设施(网络,电力和空调等)相互独立,即一个可用区出现基础设施故障不影响另外一个可用区。

为了向广大用户提供更加稳定可靠的负载均衡服务,阿里云负载均衡已在各地域(Region)部署了多可用区以实现同地域下的跨机房。

当主可用区的机房故障或不可用时,负载均衡仍然有能力在非常短的时间内(约30秒)切换到另外一个备可用区的机房并恢复服务的能力;当主可用区恢复时,负载均衡同样会自动切换到主可用区的机房提供服务。

关于负载均衡主备可用区,请注意:

  • SLB支持跨可用区挂载后端ECS,即只要ECS和SLB实例在同一个地域即可。SLB可以同时将流量分发至不同可用区的ECS上。
  • 正常情况下,备可用区的SLB实例处于待机状态。您不可以手动切换SLB实例的主备工作状态,只有当阿里云检测到整个可用区不可用时如如机房整体断电、机房出口光缆中断等,负载均衡才会切换到备可用区。而并非某个实例出现故障,就切换到备可用区。
  • SLB和ECS是不同的集群。可用区A的SLB不可用时,ECS并不一定不可用,因此如果仅因为SLB集群故障导致的SLB主备倒换,备可用区的SLB依然可以将流量分发至不同可用区的ECS。但当整个可用区的所有集群断电或光缆中断时,那么可用区的所有服务(包括但不限于SLB、ECS等)就都无法正常工作了。

主备可用区列表

下表列举了阿里云各地域的主备可用区,您也可以通过DescribeZones接口查询可用的主备可用区。

下表列举了各地域的主备可用区,您也可以通过DescribeZones接口查询可用的主备可用区。

4个9的高可用架构—同城容灾

对中大型用户来说,希望业务系统要求具备同城容灾的能力,可以考虑在同城不同可用区之间对原有应用架构做一套完整的备份。

如果某个可以去出现像IDC机房断电或者火灾等故障时,可以通过前端切换DNS来及时恢复业务。

如下图:

5个9的高可用架构—异地容灾

对于一些大型企业在业务安全全性、服务可用性和数据可靠性方面既要求具备同城容灾又要求具备异地容灾时,可以采用这种容灾架构方式既可以解决单机房故障也可以应对像地震等灾难性故障。

不同地域之间可以采用阿里云的高速通道进行私网通信,保障数据库之间的数据实时同步,将数据传输延迟降到最低。

故障发生时可以通过前端DNS实现秒级切换,及时恢复业务。

如下图:

虚拟专用网络(VPC)进行实现不同地域互通

当ECS位于不同地域时,如何实现它们之间的内网互通呢?

首先,ECS之间的内网互通可以通过虚拟专用网络(VPC)进行实现。

VPC是阿里云提供的一种高度可定制化的网络隔离环境,用户可以在VPC内创建自己的私有网络,并通过VPC内网连接不同地域的ECS和RDS实例。

其次,用户可以通过VPC间对等连接方式实现地域之间的内网互通。通过创建对等连接,不同地域的VPC可以直接通信,从而使得位于不同地域的ECS和RDS实例能够通过内网进行互访。对等连接提供了低延迟、高带宽的网络通信,保障了数据的安全和速度。

除了VPC对等连接,用户还可以选择使用阿里云的内网专线接入(VBR)服务。通过VBR,用户可以自建专线连接不同地域的私有网络,实现ECS和RDS之间的内网互通。这种方式适用于需要大量数据传输或对网络可靠性有更高要求的场景。

另外,为了加强内网互通的安全性,用户可以使用安全组和访问控制列表(ACL)进行网络访问控制。

安全组可以定义入站和出站规则,控制对ECS和RDS的访问权限;ACL可以根据源和目标IP地址、协议及端口号等信息,精细控制子网和VPC之间的流量。

总的来说,ECS和RDS位于不同地域时,可以通过VPC的对等连接或者内网专线接入等方式实现内网互通。这些方法都提供了安全可靠的云上网络环境,满足了用户在分布式架构中对内网通信的需求。

注意跨地域的延迟

异地多活面临的主要挑战是网络延迟,以北京到上海 1468 公里,即使是光速传输,一个来回也需要接近10ms,在实际测试的过程中,发现上海到北京的网络延迟,一般是 30 ms。

参考案例:阿里云关系型数据库RDS 高可用介绍

阿里云关系型数据库(简称RDS):是一种稳定可靠、可弹性伸缩的在线数据库服务。

RDS默认采用主备架构(备用实例正常情况下对用户不可见),两个实例位于不同服务器,自动同步数据。主实例不可用时,系统会自动将数据库连接切换至备用实例。切换是分钟级别,而且不需要人工介入,全部由系统自动完成,应用系统也无需任何变更。这种架构足以满足90% 用户的高可用需求。

如下图:

用户如果对系统可用性有更高的要求,希望可以做到机房容灾,

阿里云RDS可以选择购买多可用区RDS,多可用区是在单可用区的级别上,将同一地域的多个单可用区组合成的物理区域。

相对于单可用区RDS实例,多可用区RDS例可以承受更高级别的灾难,如下图:

RDS同城容灾架构

图四:RDS同城容灾架构

除了同城容灾之外,对于数据可靠性有强需求用户,比如是有监管需求的金融业务场景,RDS提供异地灾备实例,帮助用户提升数据可靠性。

RDS通过数据传输服务(DTS)实现主实例和异地灾备实例之间的实时同步。

主实例和灾备实例均搭建主备高可用架构,当主实例所在区域发生突发性自然灾害等状况,主节点(Master)和备节点(Slave)均无法连接时,可将异地灾备实例切换为主实例,在应用端修改数据库链接地址后,即可快速恢复应用的业务访问。

如下图:

图:RDS异地容灾架构

异地多活数据一致性:DTS组件

异地多活架构中,为了支持业务流量在各个地域之间的灵活切换,必须解决各个业务中心之间的数据同步问题。

阿里云数据传输服务DTS支持RDS实例之间的双向同步,实现业务中心之间的数据同步,保证数据全局一致,从而实现异地多活技术架构的快速复制。

数据传输服务DTS从2013年起,已连续4年平稳支撑了阿里巴巴异地多活(3个业务中心)底层的全局数据同步。

自2014年在阿里云为用户提供服务以来,DTS已经为上万用户提供可靠、稳定的数据流服务。

DTS支持异地多活架构中数据层之间的数据同步,实现数据全局一致。下面是一个简单的异地多活业务架构图:

如上图所示,业务按照某个维度将流量切分到各个业务中心(亦称单元)。

切分维度的选择要遵循如下原则:

(1) 拆分后,需要实现业务的单点写。例如按照会员切分,那么同一个会员的访问只能在某个业务中心单点写。

(2) 拆分维度要能够尽量保证业务在单元内封闭,即所有的业务请求都能够在单元内完成,以减少跨地域的访问调用。

对于用户分布比较广的业务,可以根据用户分布进行业务中心部署区域的选择。

例如国际化业务,可以选择中国、欧洲、北美 等多点进行业务中心的部署,区域附近的用户的业务请求直接落在就近区域,以最大程度降低用户访问延迟,从而有效提升用户体验。

当流量切分到各个单元后,各个单元的数据层均会有数据写入,通过DTS进行数据层的数据双向同步,实现数据全局一致。当某个业务中心(单元)出现故障时,可以修改流量切分规则将流量秒级切换到其他单元,从而有效得保证了业务的持续可用,完美得避免了故障造成的经济损失及对公司品牌的影响。

说在最后

高可用相关面试题,是非常常见的面试题。以上的内容,如果大家能对答如流,如数家珍,基本上 面试官会被你 震惊到、吸引到。

最终,让面试官爱到 “不能自已、口水直流”。offer, 也就来了。

学习过程中,如果有啥问题,大家可以来 找 40岁老架构师尼恩交流。

参考文献

https://zhuanlan.zhihu.com/p/549472160

https://zhuanlan.zhihu.com/p/96917394

推荐阅读

《网易一面:单节点2000Wtps,Kafka怎么做的?》

《字节一面:事务补偿和事务重试,关系是什么?》

《网易一面:25Wqps高吞吐写Mysql,100W数据4秒写完,如何实现?》

《亿级短视频,如何架构?》

《炸裂,靠“吹牛”过京东一面,月薪40K》

《太猛了,靠“吹牛”过顺丰一面,月薪30K》

《炸裂了…京东一面索命40问,过了就50W+》

《问麻了…阿里一面索命27问,过了就60W+》

《百度狂问3小时,大厂offer到手,小伙真狠!》

《饿了么太狠:面个高级Java,抖这多硬活、狠活》

《字节狂问一小时,小伙offer到手,太狠了!》

《收个滴滴Offer:从小伙三面经历,看看需要学点啥?》

《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》PDF,请到下面公号【技术自由圈】取↓↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/931640.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

根据案例写PLC程序-红绿灯控制

案例: 1、南北方向红灯点亮30s后熄灭; 2、在点亮南北方向红灯的同时点亮东西方向绿灯,并在点亮25s后,以0.5s熄灭0.5s点亮的时间闪烁3次后熄灭; 3、在东西方向绿灯熄灭后,东西方向黄灯点亮2s后熄灭&#xff…

手把手教你训练自己的Lora

本文教你手把手训练自己的Lora模型, 炼制的是Stable Diffusion的Lora模型。 1 准备工作 1.1 训练工具 当然, 我们可以使用Stable Diffusion的源码进行修改, 然后训练Lora模型。 但对于非专业用户来说, 这个门槛太高了。 推荐使…

Cookie for Mac:隐私保护工具保护您的在线隐私

随着互联网的发展,我们每天都会浏览各种网站,享受在线购物、社交娱乐和学习资料等各种便利。然而,您是否曾经遇到过需要频繁输入用户名和密码的情况?或者不方便访问您常用的网站?如果是这样,那么Cookie for…

无涯教程-机器学习 - 数据可视化

在上一章中,无涯教程讨论了数据对于机器学习算法的重要性,以了解具有统计信息的数据,还有另一种称为可视化的方式来理解数据。 借助数据可视化,可以看到数据的属性保持什么样的关联,这是查看要素是否与输出相对应的最…

ELK高级搜索(二)

文章目录 7.Java api 文档管理7.1 es技术特点7.2 获取数据7.3 文档查询7.4 文档新增7.5 文档修改7.6 文档删除7.7 文档bulk 8.图解es内部机制8.1 es分布式基础8.2 分片shard、副本replica8.3 单node环境创建index8.4 多node环境replica shard8.5 横向扩容…

WPF基础入门-Class7-WPF-MVVN框架

WPF基础入门 Class7-MVVN框架 使用框架可以省掉如Class6中的ViewModelBase.cs的OnPropertyChanged,亦方便命令传参 1、NuGet安装CommunityToolkit.Mvvm(原Mircrosoft.Toolkit.Mvvm)也可以安装MVVMLight等其他集成库 2、显示页面&#xff1…

【LeetCode-中等题】240. 搜索二维矩阵 II

文章目录 题目方法一:暴力双for查找方法二:二分查找,对每二维数组进行拆分,一行一行的进行二分查找方法三:列倒序Z字形查找 题目 方法一:暴力双for查找 public boolean searchMatrix(int[][] matrix, int …

Ansible 修改文件内容

按照下方所述,创建一个名为 /home/greg/ansible/issue.yml 的 playbook : 该 playbook 将在所有清单主机上运行 该 playbook 会将 /etc/issue 的内容替换为下方所示的一行文本: 在 dev 主机组中的主机上,这行文本显示 为&#x…

计算机msvcp120.dll丢失的解决方法,非常靠谱的三个解决方法

今天,我将为大家分享一个关于电脑报错msvcp120.dll解决方法的话题。在日常生活中,我们可能会遇到这样的问题:电脑突然出现“程序无法正常运行”的提示,然后要求我们重新安装某个软件或者升级系统。这时候,我们很可能会…

docker 学习-- 04 实践搭建 1(宝塔)

docker 学习-- 04 实践 1(宝塔) docker 学习-- 01 基础知识 docker 学习-- 02 常用命令 docker 学习-- 03 环境安装 docker 学习-- 04 实践 1(宝塔) 通过上面的学习, 已经可以搭建简单的案例, 接着我会搭…

适应高速率网络设备的-2.5G/5G/10G网络变压器/网络滤波器介绍

Hqst盈盛(华强盛)电子导读:在高速发展的互联网/物联网时代,为满足高网速的网络数据传输需求,网络设备在制造中也要选用合适的网络变压器/滤波器产品,有哪些可供选择的高速率网络变压器产品也是广大采购人员…

实验五 Linux 内核的安装与加载(三种方式)

【实验目的】 掌握 uboot 的使用方法,能够使用 uboot 安装和加载内核 【实验环境】 ubuntu 14.04 发行版FS4412 实验平台 【注意事项】 实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行,以“#”开头的命令表 示在开发板下执行 【实验步骤】 …

Consul的简介与安装

1、Consul简介 Consul是一套开源的分布式服务发现和配置管理系统,由HashiCorp公司用Go语言开发,Consul提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服…

python--文件管理系统

文件系统管理项目说明文档 项目说明 基本任务 在内存中开辟一个空间作为文件存储器,在其上实现一个简单的文件系统退出这个文件系统时,需要该文件系统的内容保存到磁盘上,以便下次可以将其回复到内存中来 具体要求 文件存储空间管理可采取链…

WPF基础入门-Class5-WPF命令

WPF基础入门 Class5-WPF命令 1、xaml编写一个button&#xff0c;Command绑定一个命令 <Grid><ButtonWidth"100"Height"40" Command"{Binding ShowCommand}"></Button> </Grid>2、编写一个model.cs namespace WPF_Le…

机械臂手眼标定ZED相机——眼在手外python、matlab

目录 1.眼在手外原理 2.附上眼在手外求得手眼矩阵的python代码 3.眼在手外标定步骤 1&#xff09;打印棋盘格 2&#xff09;得到hand数据 3&#xff09;得到camera数据 4.运行python得到手眼矩阵 1.眼在手外原理 眼在手外所求的手眼矩阵是基坐标到相机的转换矩阵 2.附上…

软件设计师学习笔记6-存储系统

1.层次化存储体系 1.1层次化存储结构 局部性原理是层次化存储结构的支持 时空局部性&#xff1a;刚被访问的内容&#xff0c;立即又被访问(eg: 循环体 ) 空间局部性&#xff1a;刚被访问的内容&#xff0c;临近的空间很快被访问(eg:数组) 1.2层次化存储结构的分类 DRAM&…

基于Tkinter的PanedWindow组件进行窗口布局

在用Tkinter进行可视化界面开发中&#xff0c;界面布局是最需要最先考虑的&#xff0c;哪些组件放在什么地方都需要优先规划&#xff0c;我们可以用place或者pack进行边开发边布局&#xff0c;这需要人为的去对齐&#xff0c;费时费力。在Tkinter中有个组件PanedWindow可以帮助…

手把手教你搭建一个盲盒小程序,轻松掌握开发技巧

在当今社交媒体时代&#xff0c;微信公众号已成为企业、个人传播和推广的重要工具。而微信公众号盲盒小程序则是一个更为创新和互动的方式&#xff0c;能够吸引更多用户的关注和参与。下面&#xff0c;我们将为大家介绍一下微信公众号盲盒小程序的制作完全攻略。 1. 注册登录【…