EC2 + ELB + AutoScaling:一台 server 無回應自動切換到備援 server

Veck
6 min readOct 2, 2017

--

需求的架構

有兩個 server,一台當 InService 的 server 主機,另一台當 Standby 的主機,並設定當 InService 的主機無法正確服務,自動切換到 Standby 的主機做 InService 服務

建立架構

這裡假設你已經用 EC2 建立過一個 web service 的 AMI,因為之後我們將使用這個 image 來建立多個 service instances

Step 1

建立一個 Application Load Balancer (HTTP/HTTPS) 和 Target Groups,此時毋須將任何 EC2 instance 加入 Target Groups 中,這個動作我們稍後才能做

Application Load Balancer
Target Groups

Step 2

建立一個 Auto Scaling Configuration 和 Auto Scaling Group,這裡請記得使用 AMI 來建立 Configuration,如此一來在 Auto Scaling 中每加入一個新的 Standby server instance 才會與 InService 的 instance 設定是一樣的

為了讓 HTTP/HTTPS 的連線可以連入,別忘了要正確設定 Security Group 允許 80/443 port 通過

Security Group configuration

在建立 Auto Scaling Group 的地方稍微說明一下,要點開 Advanced Details 來選用 Load Balancing 和 Target Groups,這樣才能綁定前面建立的 load balancer instance

Auto Scaling Configuration
Auto Scaling Groups

在 AutoScaling Groups 中切換到 Instances 的 tab,可以看到已經自動起了一個 instance,這是因為 AutoScaling 要求最少要有一個 Instance 才能 work (在建立 Auto Scaling Group 的地方 group size = 1),雖然你也可以設定不要啟動 (group size = 0),但這樣就沒意義了

我們可以先連線到這個 instance 確認一下 server works

接著我們需要另起一個 instance 來做備援 server,有兩步驟:

  1. 先調整 Auto Scaling Groups 中的 Max 為 2

2. 然後到 AMI 中建立一個 instance,測試連線(HTTP/HTTPS/SSH) 都沒問題後,再到 EC2 instances console 那邊 Attach to Auto Scaling Group

Step 3

回到 Auto Scaling Group 中,我們可以看到 instances 那邊多了一個項目,目前兩個都是 InService,選擇要作為 Standby server 的 instance,點選 Action > Set to Standby,這個動作會關閉所選的 instance 並啟動另一個 instance 作為 Standby server

注意,Standby Server 還是可以透過 IPv4 連入,並不會因為 Lifecycle 處於 Standby 就 halting service (這也很正常,不然等到 InService 那台掛了才要 warm-up 會太久)

In progess
Done

另外,在這個架構下,你應該提供給使用者連入的 Domain Name 是 Load Balancer 的那一組 DNS name

Step 4

到 Load Balancer 的 Target Group 那邊將 Standby 的 instance 加入 Target Group

然後就完成了!

我們可以在 Load Balancer Target Groups 那邊的 Monitor 查看 Healthy Hosts,因為我們讓一個 instance 進入 standby,所以 count 會少一

測試方式

我們可以連入 InService 那台 Server,關閉 httpd

確認此 instance 已經 failed

並確認 Standby 主機正常

Load Balancer 的 Domain Name 也無法服務了

此時 Load Balancer Target Group 的 Healthy Host 應該變成 0,再過一下,回復成 1

再連線到 Load Balancer 的 Domain Name,Service 就回來了!

--

--