昨天提過,雲端背後仍然是實體機器,需要地方放,也需要供電和網路。放這些機器、替它們供電和接上網路的建築,通常叫做資料中心。
一個 Region 並不是只有一棟資料中心。AWS 會把每個 Region 分成好幾個彼此隔開的位置,每個位置由一座或多座資料中心組成,電力和網路都有多準備一套,而且和其他位置分開,蓋在不同的建築裡。
這種 Region 裡彼此隔開的位置,叫做 Availability Zone,簡稱 AZ,就是我們今天的主角。
因為 AZ 之間在實體上是分開的,萬一發生火災、淹水這類少見的事件,AWS 的說明是只會影響其中一個 AZ。可以參考 AWS 官方的 Region 與 AZ 說明。這是 AWS 把 AZ 分開蓋想達到的效果。
那「分開」是分多遠?AWS 全球基礎設施介紹寫到,AZ 之間彼此相隔好幾公里,但都在 100 公里以內,並用低延遲的網路連在一起。

圖上的東京 Region 畫了 4 個 AZ,是照 AWS 官方的 AZ 清單畫的;AWS 也說明每個 Region 至少有 3 個 AZ。
Region 是地理區域,AZ 是 Region 裡彼此隔開的位置,資料中心則是 AZ 裡實際放機器的地方。
我們開的主機,就放在某個 AZ 的資料中心裡 🙌
講到這裡,你可能會想:「那 Day 02 說的 EC2,跟 AZ 又是什麼關係?」
EC2 是 AWS 提供的主機服務,我們在 AWS 上開的一台主機,就是一台 EC2。上面那張圖裡,放在 AZ 1 資料中心裡的那台主機,就是一台 EC2。
EC2 和 AZ 的關係是:
EC2 的 Region 與 AZ 說明也是這樣寫:把 EC2 分散建立在多個 AZ,才能在 Region 裡某一個位置出事時保護你的網站;如果所有主機都放在同一個位置,那個位置一出事,所有主機就都用不了。
舉個例子來說,如果發生戰爭,剛好炸彈炸到 AZ1 的區域時,假使你 EC2 跟資料庫都放在那,這樣整組資料就通通不見了 .. 冏
最好服務還是要跨 AZ 會比較安全 XD
實際建立 EC2 的時候,位置是在哪裡選的呢?畫面大概像這樣:

先在畫面右上角選 Region,這台 EC2 就會建在東京 Region。接著在「網路設定」裡,決定它放在哪個 AZ。
這裡有個小地方要說清楚:畫面上的欄位不叫 AZ,而是叫子網路。每個子網路都屬於一個 AZ,選了哪個子網路,EC2 就放在那個 AZ;實際畫面上的 AZ 會顯示成 ap-northeast-1a 後面我會都提,AZ 1、AZ 2 這種比較好懂得名稱~
延續 Day 02 的活動報名網站,這篇假設主機放在東京 Region。
只有一台主機時,它一出問題,整個網站就跟著停。這種「一個地方壞掉,整個服務就停擺」的情況,常被叫做單點故障。所以網站準備了兩台 EC2:原本那台叫做 Web 1,多準備的那台叫做 Web 2,Web 代表上面跑的是網站的程式。兩台各自裝了一份一樣的後端程式,做的是同一件事:接收報名、處理請求等等。

只是主機會壞,放主機的地方也可能出事。這兩台要放在哪裡,假設有兩份方案:

方案甲的 Web 1、Web 2 都在 AZ 1,AZ 2 沒有主機
方案乙則是 Web 1 在 AZ 1、Web 2 在 AZ 2。
同事問你兩台主機放在哪裡,有兩種回法:
回覆 A:「兩台都放在東京 Region。」
回覆 B:「兩台都在東京 Region,Web 1 在 AZ 1,Web 2 在 AZ 2。」
回覆 A 沒有說錯,但聽的人還是不知道,這兩台是擠在同一個位置,還是分開放。
回覆 B 多講了 AZ,對方才能判斷某個位置出事時,兩台會不會一起受影響。
第一次看到建立 EC2 的畫面,很容易擔心:「選不同的 AZ,會不會比較貴?」
用前面的兩份方案來看:方案甲、方案乙都是兩台主機,主機的費用一樣;差別在方案乙的兩台分在不同 AZ,如果兩台之間要互相傳資料,同一個 AZ 裡的兩台,走 AWS 內部的位址互相連,傳資料不收費
不過如果繞到對外的公開網址,就算在同一個 AZ,價格表一樣列每 GB US$0.01。內部位址和對外網址差在哪,後面講到 VPC 時會再分享到~
要回答這個問題,得先知道這次出了什麼事。
同樣是網站出狀況,範圍可能差很多:可能只是主機上的後端程式當機,主機本身還在運作;可能是整台主機故障;也可能是整個 AZ 都不能用。

判斷之前,先說清楚這篇說的正常的主機:主機本身有在運作,上面的後端程式也在執行。主機還在運作、程式卻當掉了,就不算。
判斷的時候,我會建議照兩個步驟來:
那麼,我們拿兩個事件來試試看。
這次的條件是:AZ 1 整個不可用
AZ 2 正常,AZ 2 裡的主機和程式本身也都正常。
那就先圈範圍:整個 AZ 1~

再看圈外。方案甲的 Web 1、Web 2 都在 AZ 1,兩台都在圈內,這次沒有留下正常的主機
方案乙的 Web 1 在 AZ 1 受影響,但 Web 2 在 AZ 2,還有一台正常的主機。

現在的狀況是:只有 Web 1 上的後端程式當機,Web 1 主機本身還在運作;AZ 1、AZ 2 都正常,兩份方案的 Web 2,主機和程式也都正常。
一樣先圈範圍:這次只圈「Web 1 上的後端程式」,範圍比事件一小很多。Web 1 的程式當掉了,照前面的定義,Web 1 這次不算正常的主機。
再看圈外:兩份方案的 Web 2 都不在這個範圍裡,本身也正常。所以這次兩份方案都還有一台正常的 Web 2。
我們沒辦法事先挑哪個 AZ 出事。一個 AZ 放兩台,只要剛好是那個 AZ 出事,兩台就一起停;兩個 AZ 各放一台,不管是哪一個 AZ 出事,都還留得下一台。
所以兩個 AZ 各放一台的好處,是多擋住了「一個 AZ 不能用」這種事件,而且主機一樣是兩台、不用多開;要多付的,是兩台之間跨 AZ 傳資料的費用。
那實務上比較推薦哪一種?如果這個網站是要真的給使用者用的,我會建議先用兩個 AZ 各放一台。AWS 官方的 Region 與 AZ 說明把「把應用程式部署在多個 AZ」寫成最佳實務,這樣就算一個 AZ 出事,網站還有機會繼續服務
AWS 講架構的官方文件 Well-Architected 說得更直接:正式上線的服務,至少要部署在同一個 Region 的兩個 AZ
那什麼時候才輪到一個 AZ 放兩台?除了剛才說的傳輸費用,AWS 在 EC2 裡其實有一種設定,是刻意把幾台主機集中在同一個 AZ、擺得很近,官方文件建議用在很在意網路延遲或傳輸量、而且流量大多發生在這幾台主機之間的服務。
如果只是自己練習、測試,停下來也沒有真正的使用者受影響,那不用急著為「AZ 出事」多做準備哩~
最後來總結下:
| 重點 | 記住這句 |
|---|---|
| Region、AZ、資料中心 | Region 是地理區域,AZ 是 Region 裡彼此隔開的位置,資料中心是 AZ 裡實際放機器的地方 |
| EC2 和 AZ | 一台 EC2 只放在一個 AZ,建立時就決定,畫面上選的是子網路;想分在兩個 AZ,就要建立兩台 |
| 一個 AZ 放兩台 | 擋得住一台壞掉;但那個 AZ 一出事,兩台一起停。走內部位址傳資料不收費 |
| 兩個 AZ 各放一台 | 一台壞掉、一個 AZ 出事都擋得住;主機一樣是兩台,多付跨 AZ 傳資料的費用。正式上線的服務,實務上比較推薦這種 |
| 判斷的方法 | 先把事件的範圍圈出來,再看圈外還有沒有正常的主機 |
下次聽到「我們準備了兩台主機,所以很安全」
相信你直覺就會想問:
希望這個 AZ 篇對你有幫助,我們下篇見 :D