简介:
欢迎来到小李哥全新亚马逊云科技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'], # 替换为你的子网ID
SecurityGroups=['sg-0123456789abcdef0'], # 替换为你的安全组ID
Scheme='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 ID
HealthCheckProtocol='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', # 替换为你的子网ID
TargetGroupARNs=[target_group_arn],
HealthCheckType='ELB',
HealthCheckGracePeriod=300,
AvailabilityZones=['us-west-2a', 'us-west-2b'] # 替换为你的可用区
)
print("Auto Scaling Group created successfully.")
代码解释:
Step 1: 创建 Load Balancer 并配置监听器
- 创建了一个 Application Load Balancer(ALB),并配置了跨多个可用区的子网。
- 创建了一个目标组,并配置健康检查。
- 创建了一个监听器,将其配置为监听 HTTP 80 端口,并将流量转发到目标组。
Step 2: 创建 Launch Template
- 创建了一个 Launch Template,指定了 AMI ID、实例类型、安全组、用户数据等配置。
Step 3: 创建 Auto Scaling 组
- 使用 Launch Template 创建了一个 Auto Scaling 组,设置了最小、最大和期望的实例数量,并将其挂载到之前创建的 Load Balancer 上。
以上就是在亚马逊云科技上设计一个高可用Web系统架构的最佳实践全部步骤。欢迎大家关注0基础5分钟上手AWS系列,未来获取更多国际前沿的AWS云开发/云架构方案!