当前位置: 首页 > news >正文

零基础5分钟上手亚马逊云科技-高可用Web系统设计最佳实践

简介:

欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列,适用于任何无云计算或者亚马逊云科技技术背景的开发者,通过这篇文章大家零基础5分钟就能完全学会亚马逊云科技一个经典的服务开发架构方案。

我会每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿云开发/架构技术解决方案,帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS最佳实践,并应用到自己的日常工作里。本次介绍的是手把手从零到一,带你设计一个云上双区高可用Web系统,系统组件包括DNS服务器、CDN网络加速器、负载均衡器、前端服务器、后端服务器和数据库,利用多可用区的组件备份和负载均衡器的健康检测,提升系统的可用性和稳定性。本方案架构图如下:

方案所需基础知识

Amazon Route 53

Amazon Route 53 是亚马逊云科技提供的一项高可用性和可扩展的 DNS(域名系统)服务。它能够将域名请求路由到亚马逊云科技服务(如 EC2、S3)或外部网站,支持全球流量路由和健康检查,确保用户访问的可靠性和速度。

Amazon CloudFront

Amazon CloudFront 是亚马逊云科技的内容分发网络(CDN)服务。它将内容缓存到全球分布的边缘位置,减少用户访问延迟,加速静态和动态内容的交付,从而提升用户的访问体验,特别适用于视频流媒体、图像、API 等高需求应用。

Elastic Load Balancer

Elastic Load Balancer(ELB)是亚马逊云科技提供的一项自动流量分配服务,它可以将流量均匀分发到多个 EC2 实例或其他目标上。ELB 提供了多种负载均衡策略,并支持自动故障转移,确保应用的高可用性和弹性。

Amazon S3

Amazon S3(Simple Storage Service)是亚马逊云科技的对象存储服务,提供高可用、低成本的存储解决方案。S3 可以用作网页前端服务器,通过静态网站托管功能,直接存储和提供静态内容(如 HTML、CSS、JavaScript、图像等),无需运行服务器。它支持全球访问和高并发处理,是托管简单网站或应用前端资源的理想选择。

为什么要设计高可用的 Web 系统?

设计高可用的 Web 系统是为了确保应用程序在面对高流量、硬件故障或其他突发事件时,仍能保持正常运行和快速响应。高可用性减少了系统停机时间,提升了用户体验,保障了业务连续性,有助于企业在竞争中保持优势。

本方案包括的内容

1. 为EC2服务器配置自动扩展组,并挂载到负载均衡器上

2. 为复杂均衡器配置对EC2服务器配置自动扩展组健康检查

3. 为Web应用系统添加双区系统模块实现高可用

项目搭建具体步骤 

1. 进入亚马逊云科技控制台,进入EC2服务主页,点击左侧Auto Scaling Groups自动扩展组,创建一个自动扩展组”TravelAgencyWebServers“。

2. 为自动扩展组添加服务器,自动扩展组会根据服务器的CPU使用率添加/移除EC2服务器。

3. 接下来我们编辑该自动扩展组,将其添加到Load Balancer负载均衡器上。

4. 我们选择添加Application Load Balancer应用层负载均衡器,并让其面向公有网络。

 5. 为应用层负载均衡器选择三个可用区”us-east-1a“、”us-east-1b“、”us-east-1c“,并创建一个新的目标组”TravelAgencyWebServers-1“放置EC2服务器,点击Update完成配置。

6. 接下来我们为应用层负载均衡器配置一个Security Group防火墙,在EC2服务主页左侧的Security Group功能中,点击Create创建。

7. 为Security Group起名”TravelAgencyLoadBalancer“,添加Description描述,选择安全组所在VPC:”TravelAgencyVpc“。并点击Add rule为安全组添加入站规则。

8. 我们选择入站规则允许的请求类型为HTTP,允许的IP范围为”0.0.0.0/0“

9.使用相同的方式配置出站规则,选择的允许出站目的地址为EC2安全组”TravelAgencyWebServer“, 配置完成后点击Create创建。

10. 接下来点击Edit配置EC2安全组”TravelAgencyWebServer“。

11. 在入站规则中允许接收来自负载均衡器安全组HTTP 80端口的请求,点击Save完成配置

12. 在EC2服务主页中点击左侧的Load Balancer功能,选中我们刚创建的应用负载均衡器”TravelAgencyWebServer“。

13. 复制负载均衡器DNS域名

14. 在浏览器打开后即可看到我们服务器中托管的网页文件。

15. 接下来我们在左侧的Target Group功能中,选中我们创建的Target Group目标组”TravelAgencyWebServer“,再点击”Health Checks“页面,点击Edit进行编辑,为负载均衡器添加EC2服务器的健康检测。

 16. 配置检测路径为/health,并点击”Advanced Health Check Settings“高级选项。

17. 分别配置”认为服务器不健康的检测次数“为2, ”认为不健康检测的等待时间”为2,认为健康的等待时间”为5。

18. 我们进入EC2服务器管理界面,点击”Instance State“下拉栏,再点击”Terminate Instance“删除一台服务器模拟服务器故障,触发健康检测。

19. 进入左侧菜单Auto Scaling Group功能,选中我们的Auto Scaling Group:”TravelAgencyWebServer“,查看Auto Scaling Group历史日志,发现Auto Scaling Group检测到EC2服务器被删除,成功新建了一台新的EC2服务器。

20. 我们再点击Edit配置该Auto Scaling Group

21. 我们配置"Desired Capacity"参数为2,让该Auto Scaling Group在两个可用区分别建一台EC2服务器,点击Update保存。

22. 再回到Auto Scaling Group历史日志页面中查看,Auto Scaling Group已经成功在另外一个可用区创建了新的EC2服务器

23.在EC2管理页面中,我们也可以查看该服务器已经成功被创建。

如何利用Python代码创建该Web应用系统?

下面是使用 Python boto3 创建一个 Auto Scaling 组,并将其挂载到一个跨多个可用区的 Load Balancer 上的代码示例。该 Load Balancer 开放 HTTP 80 端口,Auto Scaling 组的后端是开放 80 端口的 EC2 实例。

import boto3# 创建 ELB 客户端
elb = boto3.client('elbv2')# 创建 Load Balancer
load_balancer_response = elb.create_load_balancer(Name='my-load-balancer',Subnets=['subnet-0123456789abcdef0', 'subnet-abcdef0123456789'],  # 替换为你的子网IDSecurityGroups=['sg-0123456789abcdef0'],  # 替换为你的安全组IDScheme='internet-facing',Type='application',IpAddressType='ipv4'
)load_balancer_arn = load_balancer_response['LoadBalancers'][0]['LoadBalancerArn']# 创建目标组
target_group_response = elb.create_target_group(Name='my-target-group',Protocol='HTTP',Port=80,VpcId='vpc-0123456789abcdef0',  # 替换为你的VPC IDHealthCheckProtocol='HTTP',HealthCheckPort='80',HealthCheckPath='/',Matcher={'HttpCode': '200'},TargetType='instance'
)target_group_arn = target_group_response['TargetGroups'][0]['TargetGroupArn']# 创建监听器并将其附加到 Load Balancer
listener_response = elb.create_listener(LoadBalancerArn=load_balancer_arn,Protocol='HTTP',Port=80,DefaultActions=[{'Type': 'forward','TargetGroupArn': target_group_arn}]
)print(f"Load Balancer and Listener created successfully. Load Balancer ARN: {load_balancer_arn}")# 创建 EC2 客户端
ec2 = boto3.client('ec2')# 创建 Launch Template
launch_template_response = ec2.create_launch_template(LaunchTemplateName='my-launch-template',VersionDescription='version1',LaunchTemplateData={'ImageId': 'ami-0123456789abcdef0',  # 替换为你需要的AMI ID'InstanceType': 't2.micro',  # 替换为你需要的实例类型'SecurityGroupIds': ['sg-0123456789abcdef0'],  # 替换为你的安全组ID'UserData': 'IyEvYmluL2Jhc2gKc3VkbyB5dW0gaW5zdGFsbCBuZ2lueCB5dW0gc3RhcnQgbmdpbng=',  # Base64编码的User Data'KeyName': 'my-key-pair'  # 替换为你的密钥对名称}
)launch_template_id = launch_template_response['LaunchTemplate']['LaunchTemplateId']# 创建 Auto Scaling 客户端
autoscaling = boto3.client('autoscaling')# 创建 Auto Scaling 组
autoscaling.create_auto_scaling_group(AutoScalingGroupName='my-auto-scaling-group',LaunchTemplate={'LaunchTemplateId': launch_template_id,'Version': '$Latest'},MinSize=2,MaxSize=4,DesiredCapacity=2,VPCZoneIdentifier='subnet-0123456789abcdef0,subnet-abcdef0123456789',  # 替换为你的子网IDTargetGroupARNs=[target_group_arn],HealthCheckType='ELB',HealthCheckGracePeriod=300,AvailabilityZones=['us-west-2a', 'us-west-2b']  # 替换为你的可用区
)print("Auto Scaling Group created successfully.")

代码解释:

  1. Step 1: 创建 Load Balancer 并配置监听器

    • 创建了一个 Application Load Balancer(ALB),并配置了跨多个可用区的子网。
    • 创建了一个目标组,并配置健康检查。
    • 创建了一个监听器,将其配置为监听 HTTP 80 端口,并将流量转发到目标组。
  2. Step 2: 创建 Launch Template

    • 创建了一个 Launch Template,指定了 AMI ID、实例类型、安全组、用户数据等配置。
  3. Step 3: 创建 Auto Scaling 组

    • 使用 Launch Template 创建了一个 Auto Scaling 组,设置了最小、最大和期望的实例数量,并将其挂载到之前创建的 Load Balancer 上。

以上就是在亚马逊云科技上设计一个高可用Web系统架构的最佳实践全部步骤。欢迎大家关注0基础5分钟上手AWS系列,未来获取更多国际前沿的AWS云开发/云架构方案!

相关文章:

零基础5分钟上手亚马逊云科技-高可用Web系统设计最佳实践

简介: 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列,适用于任何无云计算或者亚马逊云科技技术背景的开发者,通过这篇文章大家零基础5分钟就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我会每天介绍一个基于亚马逊云科技…...

培训学校课程管理系统-计算机毕设Java|springboot实战项目

🍊作者:计算机毕设匠心工作室 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目…...

基于STM32的智能婴儿床控制系统设计(手机APP+蓝牙无线控制)(210)

文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】设计实现的功能【3】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】HC05工作模式配置1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】项目背景【5】摘要1.4 开发工具的选择【1】设备端开发【2】上…...

四、前后端分离通用权限系统(4)

🌻🌻 目录 一、前端开发和前端开发工具1.1、前端开发介绍1.2、下载和安装 VS Code1.2.1、下载地址1.2.2、插件安装1.2.3、创建项目1.2.4、保存工作区1.2.5、新建文件夹和网页1.2.6、预览网页1.2.7、设置字体大小 二、Node.js2.1、Node.js 简介2.1.1、什么…...

时序预测|基于贝叶斯BO-卷积-双向门控单元-注意力机制的单变量时间序列预测模型BO-CNN-BiGRU-Attention

时序预测|基于贝叶斯BO-卷积-双向门控单元-注意力机制的单变量时间序列预测模型BO-CNN-BiGRU-Attention 文章目录 前言时序预测|基于贝叶斯BO-卷积-双向门控单元-注意力机制的单变量时间序列预测模型BO-CNN-BiGRU-Attention 一、BO-CNN-BiGRU-Attention模型1. 贝叶斯优化&#…...

计算机毕业设计PySpark+Flask bilibili弹幕情感分析 B站视频数据可视化 B站爬虫 机器学习 深度学习 NLP自然语言处理 大数据毕业设计

### 开题报告:基于PySpark和Flask的B站弹幕情感分析系统 #### 一、研究背景 在网络视频平台的用户互动中,弹幕(Danmaku)作为一种实时评论的形式,已经成为观众表达观点和情感的重要方式。尤其是在B站(哔哩…...

点击展开详细说明网站html引导页源码

点击展开详细说明网站html引导页源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面,重定向这个界面 https://download.csdn.net/download/huayula/89…...

Android 架构模式之 MVP

目录 架构设计的目的对 MVP 的理解代码ModelViewPresenter Android 中 MVP 的问题试吃个小李子ModelViewPresenter 大家好! 作为 Android 程序猿,你有研究过 MVP 架构吗?在开始接触 Android 那一刻起,我们就开始接触 MVC 架构&am…...

Ciallo~(∠・ω・ )⌒☆第二十二篇 入门request请求库使用

请求库是用于发送HTTP请求的工具。常见的请求库有requests,它是一个功能强大且易于使用的HTTP库。 使用requests库发送GET请求: import requests url "https://httpbin.org/get"# 携带get请求参数 params {"pn": 10,"size&q…...

设计模式-创建型模式-原型模式

1.原型模式定义 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象; 1.1 原型模式优缺点 优点 当创建一个新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过复制一个已有的实例…...

遗传算法与深度学习实战(7)——使用遗传算法解决N皇后问题

遗传算法与深度学习实战(7)——使用遗传算法解决N皇后问题 0. 前言1. N 皇后问题2. 解的表示3. 遗传算法解决 N 皇后问题小结系列链接 0. 前言 进化算法 (Evolutionary Algorithm, EA) 和遗传算法 (Genetic Algorithms, GA) 已成功解决了许多复杂的设计…...

R语言:如何安装包“linkET”

自己在R语言中安装包“linkET”时报错不存在叫‘linket’这个名字的程辑包 尝试了install.packages("linkET")和BiocManager::install("linkET")两种安装办法都不行 >install.packages("linkET") WARNING: Rtools is required to build R pa…...

JSON, YAML, XML, CSV交互可视化

1、jsoncrack https://jsoncrack.com/editor...

Android UI:PopupWindow:源码分析:设置WindowManager.LayoutParams中的各种参数

文章目录 设置flags是否包含某些flag设置gravity设置type设置softInputMode设置windowAnimations设置width/height设置token 在WindowManager.addView之前设置在WindowManager.addView之后,可通过i熬夜难过update方法设置设置format设置flags是否包含某些flag 1666 …...

MySQL:从入门到放弃

基础查询 MySQL:基础查询 Mybatis:基础巩固-DDL 项目实战 MySQL:按照日期分组查询 查询开始时间与结束时间在指定的日期范围之内,并且结束时间可以为NULL的数据...

C++OpenGL三维显示镜面反射光线漫反射实例

程序示例精选 COpenGL三维显示镜面反射光线漫反射实例 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《COpenGL三维显示镜面反射光线漫反射实例》编写代码,代码整洁,…...

【前端面试】从npm 升级到 pnpm的总结

pnpm优势 pnpm 和 npm 在性能上存在一些明显的差异,这也是一些开发者选择从 npm 切换到 pnpm 的原因。以下是一些关键的差异和原因: 1. 速度: pnpm 比 npm 快了近 2 倍,它通过优化的依赖管理,显著提高了安装速度 。 2. 磁盘空间效率: pnpm 使用基于内容寻址的文件系…...

同步外网YUM源-3

在企业实际应用场景中,仅仅靠光盘里面的RPM软件包是不能满足需要,我们可以把外网的YUM源中的所有软件包同步至本地,可以完善本地YUM源的软件包数量及完整性。 获取外网YUM源软件常见方法包括Rsync、Wget、Reposync,三种同步方法的区别Rsync方式需要外网YUM源支持RSYNC协议…...

Linux的oracle数据库导入其他用户导出的数据库文件

如果用户使用的是expdp的命令,导入就要使用impdp命令,本文以impdp为例进行介绍 1、查看当前创建的所有dmp导出目录 select * from dba_directories 2、为创建的目录赋权限 比如咱们将数据库导入到test用户, grant read,write on directo…...

FLUX.1 文生图模型微调指南

FLUX.1 是 Black Forest Labs 今年夏天发布的文本转图像模型系列。FLUX.1 模型为开源图像生成模型树立了新标准:它们可以生成逼真的手、清晰的文本,甚至可以生成搞笑表情包这样异常困难的任务。 现在,你可以使用 Ostris 的 Replicate 上的 A…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

接口测试中缓存处理策略

在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...