The Art of Readable Code && High Performance Comments

今天參加 AWS Cloud Kata 與 Hin 稍微聊了下 ELB 服務,回家又發現 AWS User Group in Taiwan 裡又有人對該服務提問;趁機測試了下該服務,也給自己充實 external memory。

ELB 是 AWS 的 Managed Load Balancing 服務,可管理 Region 內跨 AZ 的 scalability & HA (在好的雲端架構中,這是一體兩面;並且不能存在 SPOF)。透過官方文件與黑箱測試,可推論其特性如下:

基本功能

  • ELB 可設定對外(請求端,Load Balancer protocol)與對內(服務端,Instance Protocol)兩邊的協定;依照選擇不同,常見有幾類作法:
    • TCP / TCP : L4 LB
    • HTTPS / HTTP: HTTPS termination proxy
    • HTTP / HTTP: Reverse proxy
    • HTTPS / HTTPS: HTTPS termination with encrypted local traffic

    當然也可以逆天亂選 TCP / HTTPS,或 HTTP / SSL;但就責任自負 XD

  • 協定相關注意事項如下:
    • 作為 SSL or HTTPS termination proxy 時,需要先透過 IAM 上傳 server certificate (註:CF 的 crt 只能透過 aws cli 由 root account 上傳,ELB 無此限制)
    • 服務端若使用 https,要注意 ELB (CF 也是) 不接受自簽憑證。花錢吧,寶貝
    • 若 ELB 能解析為 http 流量,則可以設定 session stickness;並且 ELB 會設定 X-Forwarded-For 標頭;對於 TCP / SSL / Non-terminated HTTPS 則可開啟 Proxy Protocol Support 以紀錄來源端 IP,詳見官方文件:Enable or Disable Proxy Protocol Support
  • Cross-Zone Load Balancing
    若未啟用,ELB 會將流量平均分散給每個 Subnet(每個 AZ 也至多選一個 subnet);啟用後則平均分散給每台活著的 instance。這功能有一陣子了,但以前預設不啟用,現在則預設啟動。
  • Connection Draining
    新功能,啟動後 ELB 對 instance 會多一種可能狀態(透過 health check 或 AutoScaling 指定)OutOfService: unregistering。在 Connection Draining 指定時間到期前,ELB 會將該機器保持在 unregistering 狀態,而非猛烈斷開連線;而新連線只會分配到 InService 的其他機器。這讓該 instance 上的工作有機會被完成。

運作特性

  • ELB 是由 AWS 透過 EC2 instance 實做;雖說 instance 不會出現在 EC2 Instances 列表中,但其 ENI 可以在 Network Interfaces 中看到
  • 建立 ELB 後,會產生至少兩個 ENI,並分配在所指定的每個 AZ (Subnet) 下;合理懷疑每張 ENI 後面隱藏一台 ELB vm。每張 ENI 帶有 public IP,而 ELB 給予的 DN 會指向這些 IP 且隨機排序,以平均分配往 LB instance 的流量。
  • 當流量增加時,ELB 會自動 scale out,從而增加 ENI 數量,也消耗該 subnet 可用 IP。
  • ELB autoscaling 的原則很謎團,似乎是積極 scale out,消極 scale in,以每個 AZ 各 2+ 張 ENI 為目標。

各種手賤、除錯與恢復

  • 常見外部錯誤(包含頁面無法顯示,與錯誤認知)
    • Security Group / NetACL
    • Routing Table (VPC)
  • Detached ELB ENI
    這或許算是 AWS 設計不良。Network Interfaces 頁面無法修改 SG 還算合理,畢竟可以強迫到 Load Balancer 那頁設定;但能夠 Detach ELB ENI 是那招… 拆下來就裝不回去了。
    手賤以後,該 Public IP 還是會出現在 DN 正解回覆中,但 ENI 已經不持有該 IP,因而瀏覽器隨機 timeout。

    • 判斷依據:在 Network Interfaces 發現狀態為 Available (藍球) 的 ELB ENI
    • 解決方案:修改 Load Balancer 設定,取消該 Subnet 後存檔,再重新啟用該 Subnet
  • ELB instance down
    以前 EC2 常常會有機器卡住但又通過 health check,如果 ENI 全亮,Security Group 與 NetACL 都正確,但裡面外面就是打不到那個 internal and public IP,有可能是 ELB instance down。
    比照前項,取消再加回該 Subnet 可能可以解決問題;要是不行,就新建 ELB,再透過調整 CName 將用戶導至新群組。

1 Comment

  1. 2014 年 06 月 26 日    

    把這篇重點整理到我的 Google Sites 上了:ELB

發表迴響

分類

%d 位部落客按了讚: