iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 1
0
自我挑戰組

AWS架構應用系列 第 18

根據流量來進行負載平衡器的運作 - Day18

根據流量來進行負載平衡器的運作 - Day18

今天主要要時做的是透過流量來進行 Auto Scaling Group,而流量我們以每一台實例的請求數量 (RequestCountPerTarget) 為警示的標準,擴展策略就使用 Step scaling policies ,下圖為我們要實作的環境,為安全考量我們將 Auto Scaling Group 放到私有子網,而 ELB 則是需要對外開放所以放在公有子網,考慮容錯,所以跨兩個可用區。

具有自動擴展功能的應用程式架構
圖 01、具有自動擴展功能的應用程式架構

Aoto Scaling Group 建置

接下來的操作其實跟 ASG 步驟縮放政策 Step scaling policies - Day15 類似,可以參照該網址,但為方便起見我們還是操作一遍

  1. 建置 VPC 與相關的子網 - 請參閱 Amazon VPC 練習 - Day07
  2. 新增 EC2 實例 - 請參閱 Amazon Elastic Compute Cloud (EC2) - Day08
  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
圖 02、新增 AMI

輸入 AMI 資訊
圖 03、輸入 AMI 資訊

  1. 新增 Application Load Balancer (ALB) - 主要就是完成負載平衡的工作,可以分擔流量以及容錯。

進入 EC2 主控台,在左手選單下方選擇負載平衡器,並在右邊按下 Create Load Balancer

新增負載平衡器
圖 04、新增負載平衡器

我們選擇 Application Load Balancer (ALB)

選擇 Application Load Balancer
圖 05、選擇 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)

設定負載平衡器的涵蓋範圍
圖 06、設定負載平衡器的涵蓋範圍

步驟 2. Configure Security Settings : 沒有設定

步驟 3. Configure Security Groups : 設定安全組,選擇先前設定的安全組,跟原來的 EC2 實例一樣

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

設定負載平衡器安全組
圖 07、設定負載平衡器安全組

步驟 4. Configure Routing : 設定要將收到的流量轉給哪個對象,因為 AWS 會將這些對象設定成一個目標群 (Traget Group) ,所以我們先指定一個目標群,到後面再來設定這個目標群的內容

Target group : New target group
Name : ithomeTargetGroup

指定負載平衡器目標群
圖 08、指定負載平衡器目標群

步驟 5. Register Targets : 不要指定目標群的內容,因為目標群的實例將會由 Auto Scaling Group 靜態或動態產生,如下圖

負載平衡器目標群內容不指定
圖 09、負載平衡器目標群內容不指定

步驟 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產生流量

請參考 如何產生流量與監控流量 - Day17 建立一個測試計畫,底下簡單描述操作步驟。
測試目標: ithomealb-1480018609.ap-southeast-1.elb.amazonaws.com
模擬使用者: 10 個使用者
請求頻率: 1,000/minute

步驟 1. 新建 Thread Group
jmeter 的所有任務都由執行緒來進行,所有任務都必須在執行緒組下面創建,在 AWS Test Plan 按左鍵。

新建 Thread Group
圖 8、 新建 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
圖 9、 設定 Thread Group

步驟 2. 新增 HTTP Request
我們是測試網頁所以要建立 HTTP Request,在 執行緒群組1000 按左鍵,新增 > 取樣 > HTTP要求

新增 HTTP Request
圖 10、 新增 HTTP Request

協定: HTTP
主機: ithomealb-1480018609.ap-southeast-1.elb.amazonaws.com

設定 HTTP Request
圖 11、 設定 HTTP Request

步驟 3. 新增計時器
設定在固定時間內發出特定數量的請求,在 執行緒群組1000 按左鍵,新增 > 計時器 > 固定時隔

新增計時器
圖 12、 新增計時器

固定處理量計時器 Constant Throughput Timer:通過計算使總處理量(以每分鐘計)盡可能接近給定的數字。當然,如果伺服器不能處理它,或者如果其他計時器或耗時的測試原件阻止它,那麼處理量將更低。作用在於控制輸送量,要注意把計時器放在執行緒群組,並在請求的上面

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

設定計時器
圖 13、 設定計時器

可以直接按下開始後就會執行測試計畫。

  1. 建立 CloudWatch Alarm 警示

在 CloudWatch 主控台,按下右方功能選單警示,按下建立警示後,我們建立兩個警示一個是新增實例 (Scale out),閾值是 RequestCountPerTarget >= 500,一個是減少實例 (Scale In),閾值是 RequestCountPerTarget <= 300。建立指標有四個步驟,分別如下:

步驟 1. 指定指標和條件

指標值設定為 Singapore > 全部 > ApplicationELB > 每個 AppELB、每個 TG 指標 > RequestCountPerTarget
,要注意要確定看到上面的圖型有資料才能確定已經正確找到指標值,因為有時候會有很多個 AppELB 實體,所以需要去找一下ALB ID確認一下

設定 RequestCountPerTarget 指標值
圖14、設定 RequestCountPerTarget 指標值

因為需要知道 1 分鐘內有多少個請求,所以需要把_統計資料_從平均數改成總和,期間 5 分鐘改成 1 分鐘。

設定 RequestCountPerTarget 圖形化指標
圖 15、設定 RequestCountPerTarget 圖形化指標

CloudWatch Alarm 指定指標
圖 16、CloudWatch Alarm 指定指標

條件
閾值類型 : 靜態
每當 RequestCountPerTarget 為 : 大於 >= 閾值
定義閾值 : 500
要發出警示的資料點 : 1 出於 1 # 這個意思是第一個 1 是得到的資料數,第二個 1 是採樣資料的次數,舉例來說,如果設定 1 出於 2,表示採樣 2 次,只要有一次的 RequestCountPerTarget >= 500,就會發出警示

CloudWatch Alarm 指定條件
圖 17、CloudWatch Alarm 指定條件

步驟 2. 設定動作
記得移除預設的通知動作,不移除的話也可以,要指定 email 以及到 指定的 email 去訂閱 SNS (Simple Notification Service) 主題。

移除 CloudWatch Alarm 預設通知動作
圖 18、移除 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的擴展政策
圖 19、新增Auto Scaling Group的擴展政策

建立擴展政策

a. 擴展設定
政策類型: 步進擴展
擴展政策名稱: ithomeRequestPerTargetOutPolicy
CloudWatch 警示: ithomeRequestPerTargetOutAlarm
採取行動: 新增
200 群組百分比
執行個體需求: 150 納入指標之前的暖機秒數

b. 縮減設定
政策類型: 步進擴展
擴展政策名稱: ithomeRequestPerTargetInPolicy
CloudWatch 警示: ithomeRequestPerTargetInAlarm
採取行動: 移除
50 群組百分比

步進擴展政策擴展與縮減設定
圖 20、步進擴展政策擴展與縮減設定

觀察目標追蹤擴展政策的運作

透過 Jmeter 發出 1000 /每分及 3000 /每分的請求

CloudWatch 擴展警示
圖 21、CloudWatch CloudWatch 擴展警示

因為請求數拉的很快,所以啟用的是步進擴展的第二個條件, RequestCountPerTarget >= 800 增加300%的目前群組百分比,從 2 -> 6

Auto Scaling Group 活動歷史記錄-擴展
圖 22、Auto Scaling Group 活動歷史記錄-擴展

關閉 Jmeter 的請求

CloudWatch 縮減警示
圖 23、CloudWatch CloudWatch 縮減警示


上一篇
如何產生流量與監控流量 - Day17
下一篇
Amazon Simple Storage Service (Amazon S3) - Day19
系列文
AWS架構應用24
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言