SAA-C03-002_EC2_04_AWS Fundamentals 世界快播报
2023-07-02 20:59:05    哔哩哔哩

## Scalability & High Availability

- 可扩展性意味着应用程序或系统可以通过 adapting(适应)来处理更大的负载

- 有两种可扩展性:


(资料图片仅供参考)

- **Vertical Scalability**(垂直可扩展性):

- 增加实例大小

- →

- 常见于非分布式系统(数据库)

- RDS,ElasticCache可以水平扩展

- 垂直扩展有上限(硬件限制)

- **Horizontal Scalability**(水平可扩展性)

- 增加实例数量

- 常见于分布式系统

- 在web应用/当前应用程序中很常见

- 由于云服务的存在,很容易进行水平扩展

- **High Availability**(高可用性)

- 通常与水平扩展同时使用

- 高可用性意味着至少在两个 AZ 中运行程序/系统

- 高可用性的目的是在数据丢失时可以幸存

- 高可用性可能是被动的(RDS Multi AZ)

- 也可以是活跃的(用于水平扩展)

* * *

## Scalability & High Availability for EC2

- 垂直缩放:增加实例大小(scale up/down)

- 最小从 ( RAM,1 vCPU) 到最大 ( RAM,448 vCPU)

- 水平缩放:增加实例数量(scale out/in)

- Auto Scaling Group(自动缩放组)

- Load Balancer(负载均衡器)

- 高可用性:跨 AZ 运行同一程序的多个实例

- Auto Scaling Group multi AZ

- Load Balancer multi AZ

* * *

* * *

## Load Balancer

- 负载平衡将流量转发到下游的多个服务器(例:EC2 Instance)

<br>

user1↘-------------------------------↗EC2 Instance

user2→Elastic Load Balancer→EC2 Instance

user3↗-------------------------------↘EC2 Instance

<br>

* * *

## Why use a load balancer

- 将负载分散在多个下游实例

- 将单点访问点(DNS)暴露给应用程序

- 定期对实例进行**运行状况检查**

- 为网站提供 SSL 终止(HTTPS)

- 用 cookies 强制粘性

- 跨区域高可用性

- 将公共流量与私有流量分开

* * *

## Why use an Elastic Load Balancer

- 弹性负载均衡器是一种托管负载均衡器(managed load balance)

- AWS 保证它正常工作

- AWS 负责升级,维护和高可用性

- AWS 仅提供几个配置旋钮(knobs)

- 设置自己的负载均衡器得到成本更低,但是会花费更多时间和努力

- 与多个 AWS 产品/服务继承

- EC2,EC2 自动缩放组,Amazon ECS

- AWS Certificate Manager(ACM = AWS 证书管理器),CloudWatch

- Route 53,AWS WAF,AWS Global Accelerator

* * *

## Health Check

- 运行 Health Check(**运行状况检查**)对负载均衡器至关重要

- **运行状况检查**使负载均衡器能够知道他转发的流量的实例是否可以回复请求

- 在端口和路线上进行**运行状况检查**(/health is common 健康状况常见)

- 如果响应不是 200(OK),则实例不健康

<br>

ELB→ Health Check[Protocol:HTTP, Port:4567, Endpoint:/health]→EC2 Instance

* * *

## Type of load balancer on AWS

- AWS 有 4种 托管负载均衡器

- Classic Load Balancer(经典负载均衡器)(v1 - old generation) - 2009 - CLB

- HTTP, HTTPS, TCP, SSL(secure TCP)

- Application Load Balancer(应用负载均衡器)(v2 - new generation) - 2016 - ALB

- HTTP, HTTPS, WebSocket

- Network Load Balancer(网络负载均衡器)(v2 - new generation) - 2017 - NLB

- TCP, TLS(secure TCP), UDP

- Gateway Load Balancer(网关负载均衡器) - 2020 - GWLB

- Operates at layer 3(Network layer) - IP Protocol

- 建议使用新一代负载均衡器,有更多功能,CLB已被取消

- 一些负载均衡器可以设置为 internal(private)或 external(public)ELBs

* * *

## Load Balancer Security Groups

Users [HTTP/HTTPS from anywhere]→ Load Balancer[HTTP Restricted to load balancer] → EC2

Load Balancer Security Groups:

|Type|Protocol|Port Range|Source|Description|

|---|---|---|---|---|

|HTTP|TCP|80|/0|Allow HTTP from anyhwere|

|HTTPS|TCP|443|/0|Allow HTTPS from anywhere|

<br>

Application Security Group: Allow traffic only from Load Balancer

|Type|Protocol|Port Range|Source|Description|

|---|---|---|---|---|

|HTTP|TCP|80|sg-054vdr405dsfd(load-balancer)|Allow HTTP from anywhere|

<br>

* * *

## Classic Load Balancers(v1)

- 支持 TCP(Layer 4), HTTP & HTTPS(Layer 7)

- Health checks(**运行状况检查**)基于 TCP 或 HTTP

- Fixed hostname(固定主机名):

<br>

Client [Listener] → CLB [internal] → EC2

<br>

* * *

## Application Load Balancer(V2)

- 应用程序负载均衡器作用于第七层(HTTP)

- 跨机器(目标组)对多个HTTP应用程序进行负载均衡

- 对同一机器上的多个应用程序进行负载平衡(例:容器 Containers)

- 支持 HTTP/2 和 WebSocket

- 支持重定向(例:从HTTP到HTTPS)

- 将列表路由到(Routing tables)不同目标组:

- 基于URL路径(/users & /posts)

- 基于URL主机名( & )

- 基于查询字符串,Headers(标头)(/users?id=123&order=false)

- ALB 适合微服务和基于容器的应用(例:Docker 和 Amazon ECS)

- 具有端口映射功能,可以重定向到ECS中的动态端口

- 相比之下,每个应用程序需要多个经典负载均衡器

* * *

## Application Load Balancer(v2)HTTP Based Traffic

<br>

www [Router/user] → External Application Load Balancer [HTTP] → Target Group for User application 

www [Route/search] → External Application Load Balancer [HTTP] → Target Group for Search application

<br>

* * *

## Application Load Balancer(v2) Target Groups

- EC2 实例(可由自动缩放组管理) - HTTP

- ECS 任务(由 ECS 本身管理) - HTTP

- Lambda 函数 - HTTP 请求转换为 JSON 时间

- IP 地址 - 必须是 private IP

- ALB 可以路由到多个目标组

- **运行状况检查**在目标组级别

* * *

## Application Load Balancer(v2)Query String/Parameters Routing

<br>

www ← [Request] → External Application Load Balancer(v2) ← [?Platform=Mobile] →Target Group1 :AWS - EC2 based

-------------------------------------------------------------------------------- ↖ [?Platform=Desktop] →Target Group2 :On-premises - Private IP routing

<br>

* * *

## Application Load Balancer(v2)Good to Know

- Fixed hostname()

- 应用程序无法直接看到客户端的 IP 地址

- 客户端的真实 IP 被插入到标题 **X-Forwarded-For**

- 还可以得到端口(X-Forwarded-Port)和 Proto(X-Forwarded-Proto)

<br>

Client IP ←→ Connection termination ← Load Balancer IP(Private IP) → EC2 Instance

<br>

* * *

* * *

## Network Load Balancer(v2)

- 网络负载均衡器(第四层)允许:

- 转发 TCP & UDP 流量到实例

- 每秒处理百万个请求

- 更少的延迟 ~100ms(ALB为400ms)

- NLB 在每个 AZ 都有一个静态 IP,且支持分配弹性 IP(有助于将特定 IP 列入白名单)

- NLB用于极端性能,TCP 或 UDP 的流量

- 未包含在 AWS 的免费层

* * *

## Network Load Balancer(v2) TCP(Layer 4) Based Traffic

<br>

WWW ←[TCP+Rules]→External Network Load Balancer(v2)← [TCP] → Target Group for Users application

WWW ←[TCP+Rules]→--------------------------------------------------- ← [HTTP] → Target Group for search application

<br>

* * *

## Network Load Balancer - Target Groups

- EC2 实例

- IP 地址 - 必须是私有 IPs

- ALB

- 运行状况检查(支持 TCP,HTTP 和 HTTPS 协议)

<br>

- NLB 连接目标组:

- EC2 ← NLB → EC2(Target Group:EC2 Instances)

- EC2 ← NLB → (Target Group:IP Addresses)

- NLB → ALB(Target Group:Application Load Balancer)

<br>

* * *

* * *

## Gateway Load Balancer

- 在 AWS 中部署,扩展和管理第三方网络虚拟设备

- Example:

- Firewalls(防火墙)

- Instrusion Detection(入侵检测和预防系统)

- Deep Packet Inspection Systems(深层数据包检查系统)

- Payload manipulation(有效载荷操作)

- 在 Layer 3(网络层) - 运行 IP 数据包

- 结合以下功能:

- Transparent Network Gateway(透明网关) - 所有流量的单次进出

- Load Balancer(负载均衡器) - 将流量分配到虚拟设备

- 在端口 6081 上使用 **GENEVE** 协议

<br>

Users(source) → Route Table → GWLB →Target Group - 3rd Party Security Virtual Appliances → GWLB → Application(destination)

<br>

* * *

## Gateway Load Balancer - Target Groups

- EC2 实例

- IP 地址 - 必须是私有 IPs

<br>

- GWLB 连接目标组:

- EC2 ← GWLB → EC2(Target Group:EC2 Instances)

- EC2 ← GWLB → (Target Group:IP Addresses)

<br>

* * *

* * *

## Sticky Sessions(粘性会话)(Session Affinity)

- 可以实现粘性,以便同一客户端始终重定向到负载均衡器后面的同一实例

- 适用于 CLB 和 ALB

- 用于粘性的 Cookie 有可控的过期时间

- 用例:确保用户不会丢失会话数据

- 启用粘性可能会给后端 EC2 实例得到负载带来不均衡

* * *

## Sticky Sessions - Cookie Names

- Application-based Cookies(基于应用程序的 cookies)

- 自定义 cookie

- 由 target 生成

- 包含应用程序所需的任何自定义属性

- 必须为每个目标组单独指定 Cookie 名称

- 不要使用 AWSALB, AWSALBAPP 或 AWSALBTG(保留给ELB使用)

- 应用程序 cookie

- 由负载均衡器生成

- Cookie 的名称为 AWSALBAPP

- Duration-based Cookies(基于持续时间的 cookies)

- 由负载均衡器生成

- Cookie 名称:

- ALB:AWSALB

- CLB:AWSCLB

* * *

* * *

## Cross-Zone Load Balancing

- **有**跨区域负载平衡:每个负载均衡器势力在所有 AZ 的所有实例中**均匀分布**

- AZ1:10+10

- AZ2:10+10+10+10+10+10+10+10

- **没有**跨区域负载平衡:先按 AZ 均分后,再进行均匀分布

- AZ1:25+25

- AZ2:+++++++

- ALB

- 默认启用(可以在 TargetGroup 级别禁用)

- AZ 间数据不收费

- NLB & GWLB

- 默认不启用

- AZ 间数据收费

- CLB

- 默认不启用

- 启用则 AZ 间数据不收费

* * *

* * *

## SSL/TLS - Basics

- SSL 证书允许在传输过程中对客户端和负载均衡器之间的流量进行加密(in- flight encryption)

- SSL 是指 Secure Sockets Layer,用于加密连接

- TLS 是指 Transport Layer Security,这是较新的版本

- 现阶段常用 TLS 但是同样被称为SSL

- Public SSL 证书由 Certificate Authorities(CA)颁发

- Comodo, Symantec, GoDaddy, GlobalSign, Digicert, Letsencrypt, ...

- SSL 证书由到期时间(可以设置),必须被续订更新

* * *

## Load Balancer - SSL Certificates

<br>

users ← HTTPS(encrypted) → Load Balancer ← HTTP Over private VPC → EC2 Instance

<br>

- 负载均衡器使用 证书(SSL/TLS 服务器证书)

- 可以使用 ACM(AWS Certificate Manager)管理证书

- 可以创建上传自己的证书

- HTTPS listener:

- 必须指定默认证书

- 可以添加可选的证书列表来支持多个域(multiple domains)

- 客户端可以使用 SNI(Server Name Indication)来指定他们到达的主机名

- 能够制定安全策略来支持旧版本的 SSL/TLS(legacy clients)

* * *

##  SSL - Server Name Indication(SNI)

- SNI解决了将多个SSL证书加载到一台Web服务器的问题(为多个网站提供服务)

- 这是一个更新协议,要求客户端在初始SSL握手时指示目标服务器的 hostname(主机名)

- 服务器将找到正确的证书,或返回默认证书

- Note:

- 仅适用于 ALB 和 NLB(新一代),Cloudfront

- 不适用于 CLB(旧一代)

<br>

Client → ALB → Use the correct SSL cert1() → ALB → Target group for

------------------ ↘ Use the correct SSL cert2() ----------↗ ----- ↘ Target group for

<br>

* * *

## ELB - SSL Certificaties

- CLB(v1)

- 仅支持一个 SSL 证书

- 必须为具有多个 SSL 证书的多个 Hostname 使用多个 CLB

- ALB(v2)

- 支持具有多个 SSL 证书的多个 Listeners(监听器)

- 使用服务器名称指示(SNI)

- NLB(v2)

- 支持具有多个 SSL 证书的多个 Listeners(监听器)

- 使用服务器名称指示(SNI)

* * *

## Connection Draining(连接耗尽)

- 功能名称:

- 连接耗尽 - 适用于 CLB

- 注销延迟 - 适用于 ALB & NLB

- 在实例注销或不健康的情况下给予完成 in-flighr requests(机上请求)的时间

- 停止向正在注销的 EC2 实例发送新请求

- 1 - 3600秒注销延迟时间(默认 300秒)

- 可以禁用(设置值为 0秒)

- 如果请求很短,应设置更小的值

* * *

* * *

## Auto Scaling Group

- 在现实生活中,网站和应用程序上的负载可能会发生变化

- 在云端,可以非常快速的创建删除服务器

- ASG(自动缩放组)的目标是:

- 扩展(添加 EC2 实例)以匹配增加的负载

- 缩放(删除 EC2 实例)以匹配减少的负载

- 确保我们有 minimum 和 maximum 的 EC2 实例正在运行

- 自动将新实例注册到负载均衡器

- 重新创建 EC2 实例,以防之前的实例被终止(例:不健康实例)

- ASG 是免费的(只需为基础 EC2 实例付费)

## Example

<br>

|Minimum Capacity|Desired Capacity|Maximum Capacity|

|---|---|---|

|EC2 EC2|EC2 EC2|EC2 EC2 EC2 EC2|

|不少于2个|需要4个|最多可扩展到8个|

<br>

* * *

## Auto Scaling Group in AWS with Load Balancer

<br>

Users → ELB (可以检查 EC2 的 Health Situation)→ ASG(N个 EC2)

<br>

* * *

## ASG Attributes(ASG 设定值)

- 启动模板(不建议使用旧的启动配置)

- AMI + Instance Type

- EC2 用户数据

- EBS卷

- Security Group

- SSH Key Pair

- EC2 实例的 IAM Roles

- Network + Subnet Information

- 负载均衡器信息

- Min Size / Max Size / Initil Capacity(初始容量)

- 缩放策略

* * *

## Auto Sacling - CloudWatch Alarms & Scaling(CloudWatch 警报与缩放)

- 可以根据 CloudWatch 警报扩展 ASG

- 警报监控指标(平均 CPU 或自定义指标)

- 为整体 ASG 实例计算平均 CPU 的那个指标

- 根据警报:

- 可以创建扩展策略(增加实例数量)

- 可以创建缩放策略(减少实例数量)

* * *

## ASG - Dynamic Scaling Policies(动态缩放策略)

- **Target Tracking Scaling**(目标跟踪缩放)

- 最简单,易于设置

- 例:保持平均 ASG CPU 在 40% 左右

- **Simple / Step Scaling**(简单 / 步进缩放)

- 当触发 CloudWatch 警报时(例:CPU>70%),添加两个 units

- 当触发 CloudWatch 警报时(例:CPU<30%),移除一个 unit

- **Scheduled Actions**(计划操作)

- 根据已知的使用模式预测缩放情况

- 例:在周五下午5点将最小容量增加到10个

* * *

## ASG - Predictive Scaling(预测缩放)

- 预测缩放:持续预测负载并提前计划缩放

* * *

## Good metrics to scale on(可以扩展的良好指标)

- CPUUtilization(CPU 利用率):所有实例的平均 CPU 利用率

- RequestCountPerTarget(每个目标请求计数):确保每个 EC2 实例的请求数量稳定

- Average Network In / Out(平均网络进出)(如果应用程序是绑定网络的)

- Any custom metric(任何自定义指标)(使用 CloudWatch 推送)

* * *

## ASG - Scaling Cooldowns(冷却期)

- 缩放活动发生后,处于 cooldown period(冷却期,默认 300秒)

- 在冷却期间,ASG 不会启动或终止其他实例(以允许指标稳定)

- 建议:使用现成的 AMI 来减少配置时间,以便更快地提供请求并减少冷却时间

* * *

* * *

* * *

标签: