Study Notes - Elastic Load Balancer


整理 Elastic Load Balancer 的學習筆記,包含了:

  • Classic Load Balancer (L4 + L7), 上一代的 LB ,已經不建議使用。
  • Application Load Balancer (L7)
  • Network Load Balancer (L4)

內容整理以下:

  • 基本概念
  • 功能
  • 常見問答

基本概念

規劃 ELB 要注意的功能

  • 依照用途,分成 L7、L4
  • 當 Ingress 給外部使用,要放在 Public Subnet
  • 可以跨 AZ, 也建議要有跨 AZ. 但是無法跨 Region.
  • 有 internet-facing 和 internal 兩種
  • 可以開啟 Access Log, Debug 用途
  • CLB, ALB 支援 IPv4 and IPv6
    • ALB 在建立時就要指定 IP Address Type

Cross-zone Load Balancing

官方文件 開始的描述如下:

By default, your load balancer distributes incoming requests evenly across its enabled Availability Zones. To ensure that your load balancer distributes incoming requests evenly across all back-end instances, regardless of the Availability Zone that they are in, enable cross-zone load balancing.

意思大概是:

LB 預設值會平均的、且跨越 AZ 來處理 Request。如果打算確保 LB 平均的分散 Request 到所有的 Backend instances,不管那些 instances 是在哪一個 AZ,那麼打開 *Cross-zone Load Balancing*

邏輯上理解 Cross-Zone Enabled/Disabled 的差異:

  • Enabled:平均流量的單位是 instance (不管機器在哪個 AZ)
  • Disabled:平均流量的單位是 AZ (不管 AZ 裡有多少機器)

Best Practice and 官方建議:

  • Enable Cross-Zone Load Balancing
  • 保持兩邊的機器數一樣

另外,ELB 的 CloudWatch - Health count,如果 Cross-Zone 是 Disabled,health count 數值只有實際的一半,Enabled 才是 Instance Count。

官方文件 (Elastic Load Balancing Metrics) 說明如下:

The number of healthy instances in each Availability Zone. An instance is considered healthy if it meets the healthy threshold configured for the health checks. If cross-zone load balancing is enabled, the number of healthy instances is calculated across all Availability Zones.

大概意思:每個 AZ 的 healthy instances 數。如果 cross-zone enabled,就會計算所有 AZ 裡的 instance 數

Connection Draining

Drain 翻譯是 “排水” 的意思。如果 ELB 開啟 Connection Draining,那麼以下狀況就會停止送 Request 到 instance:

  • 當 instance 剛剛被 de-register 的時候,正在處理中 (in progress) 的 request 都完成了
  • instance 變成 unhealthy 狀態, 沒有新的 request 進來. 但是持續中的 request 會繼續完成, 也就是可能會出現 HTTP 4XX or 5XX.

使用情境:

  • 通常用在部署的時候,需要暫時把線上的 instance 移除,但可能還有連線存在。通常線上的服務都會打開,建議可以開 180s 左右。
  • 用在 auto scale 的時候,也需要此功能,正在處理中的 Request 能夠陸續完成。

Sticky Sessions

同一個 Session 固定使用同一個 instance。通常是 stateful 的設計,或者後端資源無法 share 的狀況。

IPv6 Support

2017 年之後 AWS 的基礎架構服務都支援 IPv6,針對 CLB CNAME 的規則如下:

  • name-123456789.region.elb.amazonaws.com
  • ipv6.name-123456789.region.elb.amazonaws.com
  • dualstack.name-123456789.region.elb.amazonaws.com

在原本 CNAME 前面加入 ipv6. 或者 dualstack 即可。

底下是實際測試 CLB 的紀錄:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## CLB: ipv6.
## Query IPv6 using ipv6 prefix
~$ dig aaaa ipv6.your-clb-name-123456789.region-code.elb.amazonaws.com
... 略 ...
ipv6.your-clb-name-123456789.region-code.elb.amazonaws.com. 60 IN AAAA 2400:6700:ff00::36c7:98d6
ipv6.your-clb-name-123456789.region-code.elb.amazonaws.com. 60 IN AAAA 2400:6700:ff00::12b3:55b3

## query IPv4 using dualstack prefix
~$ dig dualstack.your-clb-name-123456789.region-code.elb.amazonaws.com
... 略 ...
dualstack.your-clb-name-123456789.region-code.elb.amazonaws.com. 60 IN A 18.179.85.182
dualstack.your-clb-name-123456789.region-code.elb.amazonaws.com. 60 IN A 54.199.152.211

## dualstack
~$ dig aaaa dualstack.your-clb-name-123456789.region-code.elb.amazonaws.com
... 略 ...
dualstack.your-clb-name-123456789.region-code.elb.amazonaws.com. 59 IN AAAA 2400:6700:ff00::36c7:98d6
dualstack.your-clb-name-123456789.region-code.elb.amazonaws.com. 59 IN AAAA 2400:6700:ff00::12b3:55b3

ALB 則需要再建立時,IP address type 選擇 dualstack 才可以支援 IPv6。


常見問答

以下是整理自 FAQ.

  • 一個 ELB 可以同時處理多個 Port, 像是 80/443, 同時可以 port mapping 不同 instance 的 port. 像是 443 (ELB) to 80 (EC2).
  • ELB 沒有限制連線的上限.

補充一點,如果有瞬間大量的需求,而且時間是可以預期的,那麼可以開 AWS Support ,請 ELB Team 幫忙 Pre-warming ELB. 最好一週前準備。

CLB 重要的 Metrics: SpilloverCount, SurgeQueueLength

  • SurgeQueueLength: 指的是 CLB 發現背後的機器已經進入 pending 狀態,這時候收到的 Request 暫時存起來的 Queue 大小,最大為 1024。通常表示機器很忙。
  • SpilloverCount: 當 Surge Queue 滿了之後,被丟棄的 Request 數量。

ELB 可否 Cross Region?

不行,但可以透過 Route53 Routing Policy 指定不同的 region 的 ELB, policy 有 Geolocation, Weight, Latency, … 等方式。


延伸閱讀

站內延伸

參考資料




Comments