前言

由于实验是布置下来的个人实验,请勿直接抄袭,我这里写实操只是为了记录我的学习历程,与分享我的实验经验。

内容全部都为个人理解,不一定正确,如果你发现了文章中有存疑的地方或者你对某个地方有疑问,欢迎在评论区留言,大家一起学习。

部分常见问题可以访问下面这个文章

题目

为该系统构建弹性高可用架构,即使用Auto Scaling 组至少在不同可用区的2台实例上部署Web Server,通过ELB分发流量,如图2所示。

架构要求

准备工作

基础补习

老规矩,先补习基础

  1. Auto Scaling(自动扩展):Auto Scaling 是一种自动调整计算资源的服务,可根据应用程序的需求自动增加或减少计算资源。当流量增加时,Auto Scaling 可以自动添加更多的服务器实例来处理额外的负载,当流量减少时,它可以自动减少服务器实例以节省成本。这样可以确保应用程序始终具有所需的计算资源,同时最大程度地减少资源浪费。
  2. Application Load Balancer(应用程序负载均衡器):Application Load Balancer 是一种负载均衡服务,用于在多个服务器实例之间均衡分发传入流量。它可以根据不同的条件(如路径、主机名、端口等)将流量路由到不同的后端服务器实例,从而实现负载均衡和高可用性。Application Load Balancer 可以帮助应用程序更有效地处理流量,并确保各个服务器实例之间的负载均衡。

前面的VPC,EC2,RDS我们都基本了解,这里需要搞明白的就上面这两个概念与其的作用。一个是动态扩展一个是动态分发流量。

思路解析

1.这题需要做什么?与第一题有什么区别?我需要做什么?

在第一题中,我们创建了一个VPC,在公有子网上部署Web应用,私有子网部署RDS的MySQL数据库。在这里,我们需要使用Auto Scaling 组来在私有子网中部署web项目,然后通过负载均衡器中转分发流量到私有子网中的web应用中。

2.那么想一想,怎么通过Auto Scaling 组来在私有子网中部署web项目?或者换个说法:Auto Scaling 组怎么启动我们的web项目?

答案是通过启动模板

3.启动模板又是启动的什么?启动模板又有什么意义?

启动模板里面定义的是:用什么AMI启动什么类型的EC2实例,就是说启动模板就是一个描述使用什么AMI启动EC2的模板。

所以这里我们就有大概的一个操作思路了:把我们的Web应用打包成AMI映像(意思是这个意思,实际操作是把运行着web应用的那个EC2实例打包成AMI映像),然后定义一个启动模板,通过Auto Scaling 组自动在私有子网启动实例,然后给Auto Scaling 组启动的实例分配负载均衡器。

实操

在完成下面的操作之前先保证你EC2中的Web应用能正常启动!!!

由于实验是布置下来的个人实验,请勿直接抄袭,我这里写实操只是为了记录我的学习历程,与分享我的实验经验。

设置程序自启动

在打包映像前,我们需要先给我们的Web应用设置程序自启动,这样,从AMI启动的实例中就会自动运行我们的Web应用。由于我实验使用的Web应用是Spring Boot项目,且只需要运行一个jar包,所以我这里只需要设置自启动jar包即可。如果你的实验项目使用前后端分离,那么你还需要把你的前端项目也设置自启动。我这里只演示我的jar包自启动设置。

ssh登录到我们的EC2实例,新建一个myapp.service文件(在finalShell中,只需要在下面文件显示框中 右键->新建->文件 输入文件名称即可完成创建,其他ssh工具应该也有类似的功能,当然你选择直接在端口使用命令创建也行)

新建myapp.service文件

在myapp.service文件中完成程序自启动的配置填写(在finalShell中,双击myapp.service文件,即可填写or修改文件,文件更改完记得保存!!!!!)。

[Unit]
# 应用描述
Description=MyWebApplication
After=network.target
[Service]
# 工作目录
WorkingDirectory=/home/ec2-user/
User=root
# 运行jar包的指令,只需要把你平时运行的指令中前面的java改成/usr/bin/java。我这里因为我的jar包内的配置文件中的数据库配置是指向EC2中的MySQL,所以需要使用外置配置文件来启动spring boot项目。这里--spring.config.location的值就是我需要spring boot加载的配置文件路径。
ExecStart=/usr/bin/java -jar AWSDemo-1.0.jar --spring.config.location=/home/ec2-user/yml/application.yml
# 收到正常停止命令时不自动重启(systemctl stop 时不会自动重启)
SuccessExitStatus=143
# 在服务失败时自动重启
Restart=on-failure
# 重启前等待10秒
RestartSec=10
# 重启尝试间隔时间
StartLimitInterval=10
# 间隔时间内的最大重启尝试次数
StartLimitBurst=3

[Install]
WantedBy=multi-user.target

填写文件内容

使用mv指令把myapp.service移动到/etc/systemd/system目录下(使用sudo命令可以让我们以管理员权限运行命令,这里加上了可以防止我们的权限不足。)

sudo mv /home/ec2-user/myapp.service /etc/systemd/system/

移动myapp.service文件

运行下述指令重新加载systemd服务。

sudo systemctl daemon-reload 

刷新systemd 服务

然后即可使用下述systemctl指令管理你的java应用了。

# 启动程序自启动
sudo systemctl enable myapp.service
# 启动
sudo systemctl start myapp.service
# 停止 (这是停止指令,别傻乎乎复制运行,这里写这个只是告诉你可以运行这个指令停止应用运行)
sudo systemctl stop myapp.service
# 查看状态
sudo systemctl status myapp.service

启动程序自启动

然后,我们可以重启EC2实例,确认web应用是否有开机自启动。

重启EC2实例

访问成功

EC2重启后,访问项目路径能正常访问就是设置程序自启动成功了!

打包EC2实例的AMI映像

上面我们已经完成了EC2中Web程序的自启动,这意味着 我们只需要打包一个这个EC2实例的AMI映像,然后往后我们根据这个映像启动的EC2实例就会自动运行这个Web程序。

根据Web程序所在的EC2实例创建AMI映像

创建AMI

创建AMI_填写配置

填写映像名称与描述即可完成AMI映像的创建,就这么简单!!

创建与修改安全组

在完成接下来的操作前,我们还要提前设置好负载均衡器与后面Web应用程序实例的安全组,并且把新增的Web应用程序实例的安全组新增入站规则到RDS的安全组中。

这里的后面Web应用程序实例的安全组为什么不使用前面我们已经定义好的web程序EC2的安全组呢?因为后面Web应用程序实例是使用Auto Scaling组自动启动的,其只需对负载均衡器开放即可。而在前面第一题中定义的web程序EC2的安全组,我们对外的源设置的0.0.0.0,而且还开放了多个端口,所以这里需要新增一个web应用程序EC2的安全组。而且因为之前我们的RDS的安全组只对上一题设置的web应用程序的安全组开放,这里我们新增了一个web应用程序EC2的安全组,那么也应该再RDS的安全组中新增对应的入站规则。

先创建负载均衡器的安全组,开放80端口,因为后面我们需要通过负载均衡器的DNS访问Web项目。由于我的web项目是单体应用,这里只需要设置一条入站规则,如果你的项目是前后端分离项目,我建议除了开放80端口外,还应该加上后端项目的端口。

创建负载均衡器的安全组

创建新的Web程序EC2的安全组,端口范围填写Web程序的端口,我的是9090;源选择上面我们新建的负载均衡器的安全组,因为我们这个Web程序EC2的流量全部来自负载均衡器。由于我的web项目是单体应用,这里只需要设置一条入站规则,如果你的项目是前后端分离项目,记得分别把前后端项目的端口加到安全组上。

甚至,如果你的前后端项目分别部署在不同的EC2服务器上,你应该使用两个不同的安全组来设置。当然这种情况在这个题目下应该是不存在的

创建新的Web程序EC2的安全组

修改RDS安全组的入站规则,新增一条上面新创建的Web程序EC2的安全组

修改RDS安全组的入站规则

创建目标群组

安全组设置完毕,接下来就可以创建负载均衡器了,但创建负载均衡之前,要先得配置目标群组。

目标群组页

目标类型选择 实例

创建目标组_目标选择

这里需要注意的是端口与VPC的选择,这里的端口填写你Web应用程序的端口,我的是9090;VPC选择我们创建的那个VPC

创建目标组_基本配置

这里需要注意,不用选择实例,直接点击右下角的创建即可

创建目标群组_注册目标

这里有一个非常要注意的点,如果你的项目是前后端分离项目,那么你需要分别给前后端设置一个目标群组。这样负载均衡器才能正确分发流量。而我的项目是单体项目,所以上面演示只设置了一个目标群组。

这里打个比方:

前端项目端口:8080 后端项目端口:8989

那么你就得创建两个目标群组,一个目标群组的端口填8080,一个目标群组的端口填8989。

创建负载均衡器

目标群组创建好,接下来就能创建负载均衡器

创建一个负载均衡器,选择这里的Application Load Balancer

负载均衡器选择

名称随意;模式选择 面向互联网;

创建ALB_基本配置

VPC选择我们创建的VPC;子网一定要选择该可用区下的公有子网!!!不然你这个ALB分配的ip只会是局域网ip,而不是公有ip。

创建ALB_网络映射

安全组选择我们上面已经为这个负载均衡器创建好的安全组。

侦听器和路由这个要注意:还是老原因,我这项目是单体项目,只需要一个侦听器,把负载均衡器的80端口流量转发到我上面设置好的目标组即可。

如果你是前后端项目,我推荐的做法是80端口转发到你的前端项目的目标组上,后端项目 添加一个侦听器 端口填你后端项目一样的端口,目标组选后端项目的目标组,并且确保负载均衡器的安全组把后端项目一样的端口也开放了

创建ALB_安全组与路由

创建启动模板

负载均衡器创建完,我们接下来就开始配置启动模板

这里的 Auto Scaling 指导 勾上,方便配置

创建启动模板_启动模板名称和说明

映像选择我们已经配好程序自启动的那个

创建启动模板_AMI选择

实例类型我们可以先不配,等后面让Auto Scaling组自动适配;密钥对为了方便管理,我这里选择了默认的密钥对;网络信息里面的安全组选择我们上面创建的新的Web程序实例安全组

创建启动模板_相关配置

最后,点击创建即可

创建Auto Scaling组

如果前面的操作你的完成了,那么恭喜你,可以操作最后一步了,创建我们的Web应用程序实例的Auto Scaling组

名称随意,启动模板选择前面已经创建好的启动模板

创建Auto Scaling组_步骤一

这里的实例类型要求没有固定方案,具体可以根据你的项目来。比如我的项目在vCPU方面大概1-2就行,而内存需要2以上(因为我们前面在配置EC2环境时,装了MySQL,MySQL是一个非常吃IO的程序,所以这里内存我建议你得2G以上)

创建Auto Scaling组_步骤二(1)(1)

当然,如果你不喜欢上面这种以属性来决定实例类型,你也可以手动设置实例类型。比如,我原来的项目EC2用的下面这个2h2g的t3.small,那么选择这个实例类型为主类型,然后使用系统推荐的同系列实例类型做备选。两种实例类型选择方式任君选择!!!

创建Auto Scaling组_步骤二(1)(2)

实例分配一定要选择100%按需,因为我们的实验账号只支持按需实例;分配策略因为我上面实例类型要求 选的是基于属性,所以只能选择 最低价格 这个策略。

创建Auto Scaling组_步骤二(2)

网络设置:VPC选择我们创建的VPC,子网按照题目要求选择两个私有子网

创建Auto Scaling组_步骤二(3)

这里的负载均衡器选择,是根据目标群组来决定的,所以选择上面我们创建的那个(这里一样,前后端分离项目应该选择两个目标组)

创建Auto Scaling组_步骤三(1)

这里我们可以选择开启弹性负载均衡运行状况检查,其他设置开启CloudWatch 指标收集,后面需要用到。

创建Auto Scaling组_步骤三(2)

所需容量:2 所需最小容量:2 所需最大容量:因为要体现出动态扩展的功能,这里我填了3

这个自动扩展其实是实验的加分项,因为这里用到了CloudWatch 指标做AutoScaling,答辩记得和老师说!!!

创建Auto Scaling组_步骤四(1)

这个实例维护策略我直接用的默认第一个,有兴趣的可以自己研究一下。

创建Auto Scaling组_步骤四(2)

步骤五、六没必要配置,直接 跳至审核 即可,然后查看各项信息,完成创建即可。

检查架构搭建情况

恭喜你,你已经完成了整个架构的搭建,接下来就是检查服务情况正不正常了。

先打开EC2实例页,可以看到相关的两个实例正在创建。

EC2正在创建

打开负载均衡器页,点击创建的负载均衡,资源映射标签,可以看到相关的资源正常(前后端分离项目应该比我这要复杂)

负载均衡正常

打开负载均衡器页,点击创建的负载均衡,详情标签,可以找到负载均衡器的DNS,复制到浏览器打开,即可访问web应用

复制ALB的DNS

打开上面复制的ALB的DNS,成功访问web项目

成功访问Web应用

最后修改:2024 年 05 月 09 日
如果觉得我的文章对你有用,请随意赞赏