根据流量 (Traffic) 来进行负载平衡器 (Auto Scaling Group) 的运作

根据流量 (Traffic) 来进行负载平衡器 (Auto Scaling Group) 的运作

今天主要要时做的是透过流量来进行 Auto Scaling Group,而流量我们以每一台实例的请求数量 (RequestCountPerTarget) 为警示的标准,扩展策略就使用 Step scaling policies ,下图为我们要实作的环境,为安全考虑我们将 Auto Scaling Group 放到私有子网,而 ELB 则是需要对外开放所以放在公有子网,考虑容错,所以跨两个可用区。

具有自动扩展功能的应用程序架构
图 1. 具有自动扩展功能的应用程序架构

Aoto Scaling Group 建置

接下来的操作其实跟 ASG 步进缩放政策 Step scaling policies 笔记 类似,可以参照该网址,但为方便起见我们还是操作一遍

  1. 建置 VPC 与相关的子网 - 请参阅 Amazon VPC 实操
  2. 新增 EC2 实例 - 请参阅 Amazon Elastic Compute Cloud (EC2) 笔记
  3. 新增 AMI - 建置一个 AMI 模板供后续的 Launch Configuration 使用

根据以上所建立的 EC2 实例,我们必须在该实例上进行一些雏型系统配置,作为将来检验之用

系统设定

# 安装套件 httpd php  
sudo yum -y install httpd php 
# 启动 Web Server
sudo systemctl start httpd
# 设定 Web Server 为系统服务,可在下次重开机时自动启动
sudo systemctl enable httpd

应用程序设定
首页程序 index.php

<center>
<table class='table table-bordered'>
<tr><th>Meta-Data</th><th>Value</th></tr>
<?php
  #The URL root is the AWS meta data service URL where metadata
  # requests regarding the running instance can be made
  $urlRoot="http://169.254.169.254/latest/meta-data/";
  $instanceId = file_get_contents($urlRoot . 'instance-id');
  $availabilityZone = file_get_contents($urlRoot . 'placement/availability-zone');
  # Get the instance ID from meta-data and print to the screen
  echo "<tr><td>InstanceId</td><td><i>" . $instanceId . "</i></td><tr>";
  # Availability Zone
  echo "<tr><td>Availability Zone</td><td><i>" . $availabilityZone . "</i></td><tr>";
?>
</table>
</center>

透过浏览器确认功能无误,确认首页正常运行

到 EC2 控制台,选择左边选单中的 实例,再选择刚刚建立的 EC2 实例,按鼠标右建,选择 Image > Create Image,接着输入以下内容建可以建立一个 AMI Image

Image name : ithomeAMI
Image description : ithome Web Server AMI

新增 AMI
图 2. 新增 AMI

输入 AMI 信息
图 3. 输入 AMI 信息

  1. 新增 Application Load Balancer (ALB) - 主要就是完成负载平衡的工作,可以分担流量以及容错。

进入 EC2 控制台,在左手选单下方选择负载平衡器,并在右边按下 Create Load Balancer

新增负载平衡器
图 4. 新增负载平衡器

我们选择 Application Load Balancer (ALB)

选择 Application Load Balancer
图 5. 选择 Application Load Balancer

接下来需要六个步骤来设定 ALB
步骤 1. Configure Load Balancer : 建议先看一下图一,可以发现负载平衡器会跨越两个可用区,因为唯有如此才能完成高可用性的设定,所以除了设定名字外,记得选择 VPC (PS:一个区域可以有多个 VPC )以及可用区

Name : ithomeALB
Availability Zones
VPC : vpc-0bb7004b67556d0da (172.16.0.0/16) | ithomeVPC
Availability Zones
ap-southeast-1a: subnet-0f1df807467b642f6 (ithome public subnet 1)
ap-southeast-1b: subnet-06f56dccb2a9cfcf0 (ithome public subnet 2)

设定负载平衡器的涵盖范围
图 6. 设定负载平衡器的涵盖范围

步骤 2. Configure Security Settings : 没有设定

步骤 3. Configure Security Groups : 设定安全组,选择先前设定的安全组,跟原来的 EC2 实例一样

Assign a security group: Select an existing security group
_ithome_web_SG _

设定负载平衡器安全组
图 7. 设定负载平衡器安全组

步骤 4. Configure Routing : 设定要将收到的流量转给哪个对象,因为 AWS 会将这些对象设定成一个目标群 (Traget Group) ,所以我们先指定一个目标群,到后面再来设定这个目标群的内容

Target group : New target group
Name : ithomeTargetGroup

指定负载平衡器目标群
图 8. 指定负载平衡器目标群

步骤 5. Register Targets : 不要指定目标群的内容,因为目标群的实例将会由 Auto Scaling Group 静态或动态产生,如下图

负载平衡器目标群内容不指定
图 9. 负载平衡器目标群内容不指定

步骤 6. Review

完成设定后,记得在回到负载平衡器得主画面,这时候就可以看到刚刚建立的负载平衡器,这时候就可以直接复制 DNS Name 的字段,如下图,当作是网址,直接读取网页,但请注意,要等一段时间,因为 DNS 注册需要一段时间,所以可能要等五分钟后, DNS 的 TTL 到期后会再去抓取的时候,这时候网页才会正常。

负载平衡器的内容
图 10. 负载平衡器的内容

  1. 新增 Launch Configuration - 主要是提供 Auto Scaling Group 启动实例的模板,用来设定目标群内的 EC2 实例的启动组态

到 EC2 控制台,选择左边选单中的 Launch Configuration,按下右边的建立启动组态按钮

建立启动组态
图 11. 建立启动组态

完成启动组态设定

名称 : ithomeLC
AMI : ithomeAMI
实例类型 : t2.micro (1 vCPU, 1 GiB, 仅 EBS)
监控 (Monitoring) : 在 CloudWatch 中启用 EC2 实例详细监控 #重要!!!启用详细监控之后,当您使用此启动组态时,Auto Scaling 群组可以具备相关扩展政策,以 1 分钟的频率在 Amazon EC2 实例指标上扩展。
指派安全群组 :
选取现有的安全群组
ithome_web_SG
密钥对选项 :
选择现有的密钥对
ithome

启动组态设定画面
图 12. 启动组态设定画面

  1. 新增 Auto Scaling Group

到 EC2 控制台,选择左边选单中的 Auto Scaling 群组,按下右边的建立 Auto Scaling 群组按钮,接下来需要完成七个步骤来完成Auto Scaling 群组的设定

步骤 1. 选择启动模板或组态

Auto Scaling 组名 : ithomeACG
启动组态 : ithomeLC (记得一定要先按下转换至启动组态,才会切换到选择启动组态)

选择启动组态
图 13. 选择启动组态

步骤 2. 进行设定
选择私有子网

VPC : vpc-0bb7004b67556d0da (172.16.0.0/16) | ithomeVPC
子网 :
ap-southeast-1a | subnet-0c60019adc4bec5f6 (ithome private subnet 1) 172.16.1.0/24
ap-southeast-1b | subnet-0b047b309432d952c (ithome private subnet 2) 172.16.2.0/24

网络组态设定
图 14. 网络组态设定

步骤 3 (选用) 设定进阶选项

负载平衡
勾选 启用负载平衡
_Application Load Balancer _
为您的负载平衡器选择目标组 : ithomeTargetGroup
运作状态检查 - 选用
运作状态检查类型 : 勾选 EC2ELB
运作状态检查宽限期 : 150
其他设定 - 选用
监控 : 勾选 在 CloudWatch 中启用群组指针集合

负载平衡设定
图 15. 负载平衡设定

步骤 4 (选用) 设定群组大小和扩展政策

群组大小 - 选用
变更所需的容量,以指定 Auto Scaling 群组的大小。您也可以指定最小和最大容量限制。所需的容量必须在限制范围内。
所需容量 : 2 # 指的是一开始启动 Auto Scaling Group 会启动的 EC2 实例数量
容量下限 : 1 # 指的是 Auto Scaling Group 最少正在执行的 EC2 实例数量
容量上限 : 10 # 指的是 Auto Scaling Group 最多正在正常执行的 EC2 实例数量

扩展政策 - 选用
选择

等一下自行设定步骤缩放政策 Step scaling policies,所以现在先选无

设定群组大小和暂不设定扩展政策
图 16. 设定群组大小和暂不设定扩展政策

步骤 5 (选用) 新增通知

没有设定

步骤 6 (选用) 新增标签

标签
密钥 : Name # 注意大小写是不同的
数值 : itHomeWebServer

设定新启动的 EC2 实例的名称
图 17. 设定新启动的 EC2 实例的名称

步骤 7. 检阅

再次确认上述数据有无错误后,确认新增

设定步骤缩放政策 Step scaling policies

  1. 使用 Jmeter 产生流量

请参考 如何透过 JMeter 产生流量并透过 CloudWatch 监控流量 建立一个测试计划,底下简单描述操作步骤。
测试目标: ithomealb-1480018609.ap-southeast-1.elb.amazonaws.com
模拟使用者: 10 个使用者
请求频率: 1,000/minute

步骤 1. 新建 Thread Group
Jmeter 的所有任务都由线程来进行,所有任务都必须在线程组下面创建,在 AWS Test Plan 按左键。

新建 Thread Group
图 18. 新建 Thread Group

线程数量 Number of Threads: 一个用户占一个线程, 10 个线程就是仿真 10 个用户
准备时长 Ramp-Up Period(in seconds): 设置线程需要多长时间全部启动。如果线程数为 10 ,准备时长为 10 ,那么需要1秒钟启动 1 个线程。
Loop Count: 每个线程发送请求的次数。如果线程数为 10 ,循环次数为 10 ,那么每个线程发送10次请求。总请求数为 10*10 = 100 。如果勾选了“永远”,那么所有线程会一直发送请求,直到选择停止运行脚本。

设定 Thread Group
图 19. 设定 Thread Group

步骤 2. 新增 HTTP Request
我们是测试网页所以要建立 HTTP Request,在 线程群组1000 按左键,新增 > 取样 > HTTP要求

新增 HTTP Request
图 20. 新增 HTTP Request

协定: HTTP
主机: ithomealb-1480018609.ap-southeast-1.elb.amazonaws.com

设定 HTTP Request
图 21. 设定 HTTP Request

步骤 3. 新增定时器
设定在固定时间内发出特定数量的请求,在 线程群组1000 按左键,新增 > 定时器 > 固定时隔

新增定时器
图 22. 新增定时器

固定处理量定时器 Constant Throughput Timer:通过计算使总处理量(以每分钟计)尽可能接近给定的数字。当然,如果服务器不能处理它,或者如果其他定时器或耗时的测试原件阻止它,那么处理量将更低。作用在于控制吞吐量,要注意把定时器放在线程群组,并在请求的上面

目标处理量 Target throughput(in samples per minute): 1000
Calculate Throughput based on : all active threads in current thread group

设定定时器
图 23. 设定定时器

可以直接按下开始后就会执行测试计划。

  1. 建立 CloudWatch Alarm 警示

在 CloudWatch 控制台,按下右方功能选单警示,按下建立警示后,我们建立两个警示一个是新增实例 (Scale out),阈值是 RequestCountPerTarget >= 500,一个是减少实例 (Scale In),阈值是 RequestCountPerTarget <= 300。建立指标有四个步骤,分别如下:

步骤 1. 指定指标和条件

指标值设定为 Singapore > 全部 > ApplicationELB > 每个 AppELB、每个 TG 指标 > RequestCountPerTarget
,要注意要确定看到上面的图型有数据才能确定已经正确找到指标值,因为有时候会有很多个 AppELB 实体,所以需要去找一下ALB ID确认一下

设定 RequestCountPerTarget 指标值
图 24. 设定 RequestCountPerTarget 指标值

因为需要知道 1 分钟内有多少个请求,所以需要把_统计数据_从平均数改成总和,期间 5 分钟改成 1 分钟。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o5QPtADC-1603507374290)(https://ithelp.ithome.com.tw/upload/images/20200919/20129510OMsHQaSZgI.jpg)]
图 25. 设定 RequestCountPerTarget 图形化指针

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VzdivNTV-1603507374291)(https://ithelp.ithome.com.tw/upload/images/20200919/20129510Y9nelRce0J.jpg)]
图 26. CloudWatch Alarm 指定指标

条件
阈值类型 : 静态
每当 RequestCountPerTarget 为 : 大于 >= 阈值
定义阈值 : 500
要发出警示的数据点 : 1 出于 1 # 这个意思是第一个 1 是得到的数据数,第二个 1 是采样数据的次数,举例来说,如果设定 1 出于 2,表示采样 2 次,只要有一次的 RequestCountPerTarget >= 500,就会发出警示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I0agt9OS-1603507374293)(https://ithelp.ithome.com.tw/upload/images/20200919/20129510Thr1g0ZXu7.jpg)]
图 27. CloudWatch Alarm 指定条件

步骤 2. 设定动作
记得移除预设的通知动作,不移除的话也可以,要指定 email 以及到 指定的 email 去订阅 SNS (Simple Notification Service) 主题。

移除 CloudWatch Alarm 预设通知动作
图 28. 移除 CloudWatch Alarm 预设通知动作

步骤 3. 新增名称和描述

警示名称: ithomeRequestPerTargetOutAlarm
警示描述 - 选用: ithome Step ScalingOut policy Alarm

步骤 4. 预览并建立
再次确认资料是否正确

相同方法在建立另一个警示

阈值是每当 RequestCountPerTarget < 300
警示名称: ithomeRequestPerTargetInAlarm
警示描述 - 选用: ithome Step ScalingIn policy Alarm

  1. 建立 Auto Scaling Group 扩展政策
    按下上方的服务按钮,选择 EC2 ,进入 EC2 控制台后,按下右方功能选单Auto Scaling Groups,按下刚刚建立的ithomeACG,按下方页签的自动调整规模后,在扩展政策中选择新增政策

新增Auto Scaling Group的扩展政策
图 29. 新增Auto Scaling Group的扩展政策

建立扩展政策

a. 扩展设定
政策类型: 步进扩展
扩展政策名称: ithomeRequestPerTargetOutPolicy
CloudWatch 警示: ithomeRequestPerTargetOutAlarm
采取行动: 新增
200 群组百分比 >=500
300 群组百分比 >=800
实例需求: 150 纳入指标之前的暖机秒数

b. 缩减设定
政策类型: 步进扩展
扩展政策名称: ithomeRequestPerTargetInPolicy
CloudWatch 警示: ithomeRequestPerTargetInAlarm
采取行动: 移除
50 群组百分比

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w0CIQNRk-1603507374299)(https://ithelp.ithome.com.tw/upload/images/20200919/201295100EqE6oyqbP.jpg)]
图 30. 步进扩展政策扩展与缩减设定

观察目标追踪扩展政策的运作

透过 Jmeter 发出 1000 /每分及 3000 /每分的请求

CloudWatch 扩展警示
图 31. CloudWatch CloudWatch 扩展警示

因为请求数拉的很快,所以启用的是步进扩展的第二个条件, RequestCountPerTarget >= 800 增加300%的目前群组百分比,从 2 -> 6

Auto Scaling Group 活动历史记录-扩展
图 32. Auto Scaling Group 活动历史记录-扩展

关闭 Jmeter 的请求,可以发现整个请求数,马上从七百多直线下降

CloudWatch 缩减警示
图 33. CloudWatch CloudWatch 缩减警示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值