前言:
通常,构建一个弹性架构的时候,即使是一个最基础的入门版,也至少需要SLB+2*ECS+RDS(至少需要2台ECS),如下图和内容所示:
【入门级】标准弹性架构建设方式 方案介绍:【上云基础系列-02】企业推荐!必学必会的上云标准架构(弹性架构)
|
基于“入门级标准弹性架构”建站教程:
|
但是,很多小微企业刚开始上云的时候,为了节省成本不愿意购买更多的服务器,此时可以低成本的大家一个架构么?答案是可以!
通过 “应用型负载均衡ALB+ESS弹性伸缩+1台云服务器ECS+数据库RDS”,也可以低门槛搭建一个既便宜又好用的弹性架构。
那么,增加了这么多产品,如何做到低成本的呢,关键在于业务初期的产品选型和计费方式,总体有以下几个策略:
1)ALB、RDS等新增产品,选择按量付费,可以有效节省业务初期流量不大时的费用
2)通过ESS弹性伸缩,不需要提前购买服务器资源,但是当业务增长或减少时,能根据设定的策略自动调整计算资源数量(即业务所需的实例数量),应对业务流量波动的同时,提高资源利用率,有效降低成本。
整个方案,在保障低成本的同时,也不牺牲业务架构的弹性设计,更避免了很多人因为节省成本选择了单体架构后频繁改造架构的困局。
“应用型负载均衡ALB+ESS弹性伸缩+1台云服务器ECS+数据库RDS”的弹性架构 精简版
实战教程:
以下,是一个Web应用上云经典架构实战。选择并模拟一套开源的代码架构(若依开源代码),通过在 “应用型负载均衡ALB+ESS弹性伸缩+1台云服务器ECS+数据库RDS”的精简版弹性架构上进行部署,并成功上线。
一、部署网站应用
先使用“若依开源代码”构建一个用户权限管理系统的网站应用。以此来掌握云服务器、数据库等云服务产品的使用,为构建一个高可用的业务架构,以保障业务系统的稳定性和高可用性打稳基础。
1.1登陆阿里云ECS,准备搭建项目运行环境
- 进入ECS控制台,找到ECS实例,远程连接到系统内。准备安装JDK环境、Maven环境、Node环境
1.2安装JDK环境
- 在服务器ECS系统内安装JDK环境,输入以下代码在linux中安装JDK
yum install -y java-1.8.0-openjdk-devel.x86_64
- JDK默认安装目录在/usr/lib/jvm,其完整路径为/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.402.b06-1.el7_9.x86_64/
- 配置java环境变量,修改/etc/profile文件,在此文件的末尾加上以下代码(注意:等号两边不要有空格)
vim /etc/profile #进入到profile文件,在末尾加上以下配置,注意:等号两边不要有空格 export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.402.b06-1.el7_9.x86_64/ export PATH=$PATH:$JAVA_HOME/bin
- 执行命令刷新配置文件以生效
source /etc/profile
- 查看JDK版本
java -version
- 看到JDK版本则成功:
1.3安装Maven环境
- 在服务器ECS系统内安装Maven环境
yum -y install maven-3.0.5-17.el7.noarch
- 查看Maven安装路径
ls /usr/share/mavenmaven
- 在默认安装目录下创建Maven仓库文件夹:
mkdir /usr/share/maven/repository
- 编辑 settings.xml 文件:
- 在settings.xml文件中修改两个地方:本地仓库文件路径和Maven镜像仓库
vim /usr/share/maven/conf/settings.xml
#进入文件后,修改<localRepository>标签对中的路径,修改本地仓库为上一步创建的文件夹/usr/share/maven/repository路径 |
修改前: |
修改后: |
- 在标签对中添加对,修改镜像仓库为阿里云国内Maven镜像仓库,提供java所需依赖项
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
- 配置Maven环境变量,修改/etc/profile文件,在此文件的末尾加上以下代码(注意:等号两边不要有空格)
vim /etc/profile #进入到profile文件,在末尾加上以下配置,注意:等号两边不要有空格 MAVEN_HOME=/usr/share/maven/ PATH=$MAVEN_HOME/bin:$PATH export MAVEN_HOME PATH
- 执行命令刷新配置文件以生效
source /etc/profile
- 看到Maven版本则成功
1.4安装Node环境
- 在服务器ECS系统内安装Node环境,需要ECS有公网能力
wget https://nodejs.org/dist/v14.2.0/node-v14.2.0-linux-x64.tar.gz
- 创建Node安装路径
mkdir /usr/local/node
- 解压下载的node.js 到上一步创建的安装路径中
tar -zxvf node-v14.2.0-linux-x64.tar.gz -C /usr/local/node
- 创建软链接,使在任何路径下都可以执行Node
ln -s /usr/local/node/node-v14.2.0-linux-x64/bin/node /usr/local/bin/node ln -s /usr/local/node/node-v14.2.0-linux-x64/bin/npm /usr/local/bin/npm
- 配置Node环境变量,修改/etc/profile文件,在此文件的末尾加上以下代码(注意:等号两边不要有空格)
vim /etc/profile #进入到profile文件,在末尾加上以下配置,注意:等号两边不要有空格 export NODE_HOME=/usr/local/node/node-v14.2.0-linux-x64/bin/ export PATH=$PATH:$NODE_HOME:/usr/local/bin/
- 执行命令刷新配置文件以生效
source /etc/profile
- 看到Node版本则成功
1.5安装Git
- 在服务器ECS系统内安装Git环境
yum -y install git
- 看到Git版本则成功
1.6通过git下载若依开源项目源码(前后端不分离版)至ECS
- 下载若依源码,需要ECS有公网能力
git clone https://gitee.com/y_project/RuoYi.git
- 若依代码成功下载至 /root/RuoYi 文件夹内
- 查看数据库连接池文件“application-druid.yml”,将索引的数据库地址与阿里云RDS相匹配(本操作前,需要先进行1.7步骤中的RDS配置)
- 说明:localhost位置代表数据库地址IP/URL,3306端口号,ry是数据库名称,username/password是数据库用户名和密码
1.7配置RDS
- 登录RDS控制台,进入RDS实例,准备进行RDS数据库配置
- 将ECS地址加入到白名单,(购买RDS时若已将VPC网段加入白名单则忽略此步骤)
- 创建数据库名称为“ry”,与数据库连接池文件中数据库名称“ry保持一致
- 获取数据库内网地址,稍后修改数据库连接池文件“application-druid.yml”中localhost为RDS内网地址
- 创建RDS账号用户名密码,稍后修改数据库连接池文件“application-druid.yml”中用户名密码与之一致
- 修改若依的数据库连接池文件
- 数据库信息保持与RDS一致
vim RuoYi/ruoyi-admin/src/main/resources/application-druid.yml
- 登录若依官网:https://ruoyi.vip/,进入“RuoYi源码下载”,如下图所示
- 参照若依开源项目代码中数据库文件,将若依项目的数据文件,通过sql安装至阿里云数据库RDS(浏览器打开此网页先不要关闭)
- 打开官网的quartz.sql文件,复制SQL语句
- 登陆RDS数据库,将上一步复制的SQL语句粘贴到RDS的名为ry的数据库中
- 找到数据库ry,并粘贴若依sql/quartz.sql文件中的sql语句,执行。
- 注意:本教程使用DMS导入sql代码时,不支持commit事务,复制的sql代码最后一行"commit;"需要删除,再点击执行
- 在RDS中新建一个sql窗口
- 打开Ruoyi官网的数据库文件中的ry_20240112.sql文件,复制sql语句
- 继续在数据库ry中,粘贴若依sql/ry_20240112.sql文件中的sql语句
1.8编译打包Ruoyi项目
- 在服务器ECS系统内部,编译Ruoyi项目
cd RuoYi #当前路径默认在/root下,Ruoyi源码默认也下载在此路径,进入到Ruoyi目录中 mvn clean package -Dmaven.test.skip=true #将文件夹内文件,编译打包成jar包
- 查看打包后的jar包地址,在ruoyi-admin/target目录下会有一个ruoyi-admin.jar的jar包
- 运行jar包,成功启动若依框架程序
nohup java -jar ruoyi-admin/target/ruoyi-admin.jar > output.log 2>&1 &
命令释义: |
nohup:确保程序在用户退出后仍继续运行 |
java -jar ruoyi-admin/target/ruoyi-admin.jar:执行jar文件中的主类。 |
> output.log:将标准输出重定向到名为的文件中,用于保存程序运行时的输出信息。 |
2>&1:将标准错误输出重定向至标准输出,即也写入到output.log文件中。 |
&:使命令在后台运行。 |
- 查看后台是否运行了Ruoyi程序,显示Running的Ruoyi程序则成功
job
- 查看启动日志
- 日志保存在output.log中,查看日志也可以看是否启动成功,出现以下内容则成功
1.9构建Ruoyi的Systemd服务
systemd提供了一个系统和服务管理器,使用systemctl命令对服务进行开启、关闭、重启等操作。systemd管理(开/关/重启)服务时会读取对应的配置文件,也称之为unit文件。也就是说,要想使用systemd来管理服务,此服务就要配置unit文件。
为Ruoyi配置unit文件,使可以通过systemctl命令管理Ruoyi,并让Ruoyi开机自启
/etc/systemd/system/设置了开机自启的软件的unit文件
/usr/lib/systemd/system 系统所有已安装软件的unit文件
vim /etc/systemd/system/ruoyi.service 创建并进入到文件中设置以下: [Unit] Description=RuoYi Admin Service After=network.target [Service] User=root WorkingDirectory=/root/RuoYi/ruoyi-admin/target ExecStart=/usr/bin/java -jar /root/RuoYi/ruoyi-admin/target/ruoyi-admin.jar SuccessExitStatus=143 TimeoutStopSec=10 Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target
systemctl enable ruoyi.server --now
二、构建包含业务服务的实例镜像
为确保后续扩容出的实例中有部署业务,需要先以该实例为基础创建自定义镜像,后续创建的实例会以该镜像作为基础镜像,在实例启动时,您的业务服务也随之启动
- 进入ECS控制台,将地域切换到在步骤1中准备的实例的地域。
- 找到步骤1中准备好的ECS实例,在右侧操作列,选择┇> 云盘与镜像 > 创建自定义镜像。
- 在弹出的创建自定义镜像对话框中,记录镜像名称,方便后续查找,单击确认按钮,等待镜像创建完成。可以在ECS控制台左侧导航栏单击实例与镜像 > 镜像查看镜像创建进度。
三、创建管理服务集群的伸缩组
弹性高可用架构的核心是通过伸缩组实现服务器的快速扩容和缩容,创建并启用伸缩组具体操作如下:
- 登录弹性伸缩控制台,在伸缩组管理页面,单击创建伸缩组按钮进入创建伸缩组页面。按照以下表格或截图配置完成创建,未涉及的配置项保持默认。
配置项 |
说明 |
伸缩组名称 |
根据界面提示输入。本案例伸缩组名称为TelescopeGroup。 |
伸缩组类型 |
选中ECS。 |
组内实例配置信息来源 |
选中选择已有实例。 |
选择已有实例 |
选择在步骤1中准备的ECS实例。 |
组内最小实例数 |
伸缩组中实例数的最小值,当伸缩组实例数低于该值时,会自动触发扩展。本案例最小实例数为1。 手动创建添加进伸缩组里的实例占用配额。例如最小实例数为1,创建伸缩组时同时手动添加已有实例到伸缩组中,则符合组内最小实例数为1,当没触发报警任务时伸缩组默认不会创建新实例。 |
组内最大实例数 |
伸缩组中实例数的最大值,当伸缩组实例数高于该值时,会自动触发收缩。本案例最大实例数为5。 |
默认冷却时间(秒) |
伸缩组发生伸缩活动后的默认冷却时间。在冷却时间内,伸缩组会拒绝由报警任务触发的伸缩活动请求,其他类型任务触发的伸缩活动可以绕过冷却时间立即执行,例如手动执行任务、定时任务。 本案例设置为300。 |
专有网络、选择交换机 |
这两个配置项会根据您选择的ECS实例,自动填充。 重要:建议创建并选择多个可用区的交换机,避免出现单一可用区实例库存不足导致扩容失败,创建交换机,请参见创建交换机。 |
展开高级配置 > 实例的健康检查 |
选中实例状态检查和负载均衡健康检查,启用该功能后,系统会根据健康检查的结果,确保伸缩组中的所有实例及其业务服务正常运行。一旦发现服务异常,将及时用新实例替换故障实例。 |
添加已有实例 |
将步骤1创建好的实例添加进伸缩组中 |
- 伸缩组创建完成后在伸缩组管理页,找到刚刚创建的伸缩组,在右侧操作列下,单击查看详情进入该伸缩组的详情页。
- 修改伸缩配置中的实例镜像。
在通过选择已有实例创建伸缩组后,会根据此ECS的原始镜像创建一个伸缩配置,但扩容出的新实例是原始镜像,不包含后续部署好的业务服务软件包。因此需要将步骤2中自定义的镜像添加到伸缩组中作为基础镜像。
- 如图所示,在实例配置来源 > 伸缩配置页签下,单击唯一的伸缩配置操作列下的修改镜像。
- 在弹出的修改镜像的弹框中,选择自定义镜像,选择步骤2中创建的镜像。单击确认按钮完成修改。
- 启用伸缩组。
在伸缩组管理页,点击右上角的启用按钮。
四、创建伸缩规则与报警任务
4.1创建伸缩规则
- 在伸缩组管理页,找到创建的伸缩组,在右侧操作列下,单击查看详情进入该伸缩组的详情页。
- 在页面上方,单击伸缩规则与报警任务页签
- 在伸缩规则页签下,单击创建伸缩规则。
- 分别创建扩容和缩容的规则
4.2创建报警任务
- 在伸缩组管理页,找到创建的伸缩组,在右侧操作列下,单击查看详情进入该伸缩组的详情页。
- 在页面上方,单击伸缩规则与报警任务页签
- 在报警任务页签下,单击创建报警任务。
- 分别创建扩容和缩容的报警任务
五、创建负载均衡作为统一入口
为伸缩组创建并关联负载均衡,使用户请求通过负载均衡器自动分摊到集群的各台ECS实例,从而平衡负载,最大化资源利用率。本案例使用应用型负载均衡(ALB),具体操作如下:
5.1 创建负载均衡
- 登录应用型负载均衡ALB控制台。
- 在实例页面,单击创建应用型负载均衡。
- 在应用型负载均衡(按量付费)购买页面,按照以下表格或截图配置完成创建。
配置项 |
说明 |
地域 |
与步骤1中实例的地域一致。 |
实例网络类型 |
选择公网。 |
VPC |
选择步骤1中准备实例的VPC。 |
可用区 |
至少选择两个,如果选择的可用区没有交换机,需要根据界面提示创建对应可用区的交换机。创建交换机的操作说明,请参见创建交换机。 |
5.2 创建ALB后端服务器组
此后端服务器组将会关联到伸缩组,伸缩组创建的实例会自动添加到该后端服务器组,通过负载均衡对外提供服务。
- 购买ALB后,到应用型负载均衡ALB控制台,选择对应地域。
- 单击左侧导航栏的服务器组进入服务器组页面,单击创建服务器组按钮,根据界面提示完成后端服务器组的创建。未提及配置项保持默认。
配置项 |
说明 |
服务器组类型 |
选择服务器类型。 |
服务器组名称 |
根据界面提示输入。本案例伸缩组名称为Telescope-group |
VPC |
选择步骤1中准备的实例的VPC。 |
5.3 为负载均衡器配置监听
创建一个HTTP监听来转发来自HTTP协议的请求,负载均衡实例在监听到HTTP请求时,可以将请求转发到后端服务器组的ECS实例中。
- 到应用型负载均衡ALB控制台,选择对应的地域。
- 单击左侧导航栏的实例,找到步骤4.1创建的负载均衡,在右侧操作列下单击创建监听,根据界面提示完成后端服务器组的创建。未提及配置项保持默认。
配置项 |
说明 |
选择监听协议 |
选择HTTP。 |
监听端口 |
负载均衡对外提供服务的端口,本案例服务的使用80,代表监听访问该负载均衡器80端口的请求。 |
选择服务器组 |
选择步骤4.2创建的服务器组。 |
5.4 为伸缩组关联负载均衡
- 在伸缩组管理页,找到步骤3中创建的伸缩组,在右侧操作列下,单击查看详情进入该伸缩组的详情页。
- 在基本信息页签下,找到关联负载均衡ALB、NLB服务器组,单击添加关联负载均衡ALB、NLB服务器组,在弹出的对话框中单击添加服务器组,根据界面提示,关联步骤4.2创建的后端服务器组。完成配置后,单击确认按钮完成关联负载均衡的操作。
重要:该配置项中的端口设置为您的业务服务对外提供服务的端口,本示例的业务服务使用80端口。
创建伸缩组时手动创建到伸缩组的ECS实例,默认不会同步关联到ALB服务器中。若想将已有ECS实例作为ALB服务器的中后端服务器,需要在关联ALB服务器时,勾选"挂载或卸载服务器组时,将伸缩组现有的实例加入或移出服务器组机器分组(只针对本次挂载或卸载的服务器组)",需要在ALB服务器中手动添加。详情请参加添加后端服务器。
六、为伸缩组关联RDS数据库
- 在伸缩组管理页,找到步骤3中创建的伸缩组,在右侧操作列下,单击查看详情进入该伸缩组的详情页。
- 在基本信息页签下,找到关联数据库,在弹出的对话框中单击添加数据库,根据界面提示,关联RDS。完成配置后,单击确认按钮完成关联数据库的操作。
七、扩展实例(验证)弹性伸缩
在准备好伸缩组配置了伸缩规则和报警任务且已关联负载均衡之后,此时可以开始扩展实例,验证集群是否可以正常工作。
步骤3创建伸缩组时,组内最小实例数选择的1,且将已有实例(步骤1创建的有业务环境的实例)加入到伸缩组中
- 在伸缩组管理页,找到创建的伸缩组,在右侧操作列下,单击查看详情进入该伸缩组的详情页。
- 在页面上方,单击实例列表页签,找到手动创建的ECS实例,点击ECS实例ID,进到ECS控制台
- 远程此ECS,进行压测,使ECS的CPU消耗超过70%,验证伸缩组是否正常扩容ECS实例。
yum -y install stress #安装stress压测工具
nproc #查看CPU个数
stress --cpu 2 --timeout 600s #压测命令--cpu 2
表示启动2个工作线程,每条线程对应一个CPU;--timeout 600s
表示运行时间限制为600秒(十分钟)
- 等待几分钟后,查看报警任务是否触发
- 登录伸缩组管理控制台,找到左侧导航栏的报警任务,看到以触发add-rule扩容规则。
- 验证实例列表中是否扩容了新的ECS实例
- 在伸缩组管理页,找到创建的伸缩组,在右侧操作列下,单击查看详情进入该伸缩组的详情页。
- 在页面上方,单击实例列表页签,在自动创建列表看到扩容的ECS实例。
- 验证是否自动关了到ALB服务器中
- 登录ALB控制台,在左侧导航栏展开应用型负载均衡ALB,找到服务器组,通过服务器ID点击进去,在后端服务器页签看到扩容的ECS实例。