Day 26 邁向 High Availability
到目前為止我們都只開一個 container instance 跟兩個 task,這樣雖然有兩個 task 可以分擔工作,但都只在一台 EC2 instance 上,如果這台 EC2 instance 掛掉,整個 application 就掛掉了QQ
為了有更好的 availability,在有機器甚至機房出問題時我們的 application 能維持運作,今天我們要把架構改成經典的 High Availability(HA)架構!(本日程式碼)
首先,在另一個 AZ ap-northeast-1c 建立一個 private subnet:
1 | resource "aws_subnet" "private_1c" { |
讓 auto scaling group 把 EC2 instance 開到兩個 private subnet 上,修改 aws_autoscaling_group.asg
的 vpc_zone_identifier
:
1 | vpc_zone_identifier = [aws_subnet.private_1a.id, aws_subnet.private_1c.id] |
接下來把 auto scaling group 的 desired capacity 調成 2、ECS service task 的 desired count 調成 4:
1 | resource "aws_autoscaling_group" "asg" { |
觀察 EC2 instance 跟 task:
兩個 EC2 instance 分別開在兩個 AZ 的 private subnet:
ECS cluster 的 infrastructure 可以看到兩個 container instance 各有 2 個 running task:
這樣,我們完成 High Availability 了。
(迷之音:就這樣??)
對,就這樣。
前面把 container、auto scaling group 跟 ALB 設置好(拜~託~前面鋪梗鋪了那麼久!),要達到 HA 只要在多個 AZ 啟動 EC2 instance、讓 container 執行在上面就可以了。在兩個 AZ 的情況下,即使有一個 AZ 掛掉,我們的 application 依然能夠提供服務,只是一小段時間內能夠處理的流量會降低。
如果兩個 AZ 不夠,可以把 ap-northeast-1d 也加進來,一樣新增 public 跟 private subnet、讓 ALB 連上 public subnet、把 EC2 instance 開進 private subnet 就可以了。
這樣的 high availability 是限制在單一 region 中的。如果整個 region 掛掉,那當然我們的 application 還是會掛掉。要處理這種狀況就要把 HA 層級往上提升到跨 region,可能是讓另一個 region 有備援的 infrastructure,也可能是直接有個也在運作中的 application,要做到什麼程度端看需求跟 $$ 而定。(本系列文不會講到那裡去XD)
架構圖
現在的架構就是個經典 HA 架構啦~多了一個 AZ 會開 EC2 instance 跟跑 container: