Learning Objectives
- 比較垂直擴展與水平擴展的做法、優點與限制
- 說明負載平衡器在水平擴展中的角色,以及伺服器為什麼最好不要自己保存使用者狀態
- 看懂自動擴展規則:最少與最多台數、CPU 門檻、連續觀察時間與冷卻時間
- 比較按時計費與按次計價(無伺服器),並養成關機、設定預算警示的習慣
選課當天,網站撐得住嗎?
平常一個網站可能只有零星幾個人在用;到了選課開放的那一刻、或作業截止前一小時,同時連線的人可能暴增好幾十倍。 上一課的網站只有一台主機,流量一大就會開始排隊:回應越來越慢,最後逾時。
要讓網站撐住尖峰,有兩個方向:
| 方向 | 做法 | 比喻 |
|---|---|---|
| 垂直擴展(scale up) | 把這台主機換成更大的規格:更多 vCPU、更多記憶體 | 把一個收銀員換成手腳更快的收銀員 |
| 水平擴展(scale out) | 多開幾台一樣的主機,用負載平衡器分攤請求 | 多開幾個收銀台 |
| 垂直擴展 | 水平擴展 | |
|---|---|---|
| 優點 | 簡單,程式幾乎不用改 | 理論上可以一直加;一台壞了其他台還在(順便解決單點故障) |
| 限制 | 單台機器有規格上限;換規格通常要重新開機 | 程式要設計成可以多台同時執行;架構比較複雜 |
| 適合 | 資料庫這類不容易拆開的服務、流量穩定的小網站 | 網頁伺服器、API 這類可以複製很多份的服務 |
雲端時代的網站,大多以水平擴展為主。
水平擴展的前提:伺服器不要記住使用者
水平擴展時,同一位使用者的第一個請求可能被負載平衡器送到伺服器 1,下一個請求送到伺服器 3。 如果登入狀態、購物車只存在伺服器 1 的記憶體或硬碟裡,換到伺服器 3 就「忘記你是誰」了。
所以可以水平擴展的伺服器,通常設計成無狀態(stateless):
| 狀態 | 放在哪裡 |
|---|---|
| 會員、成績、留言 | 共用的資料庫 |
| 登入狀態(session) | 共用的快取服務或資料庫,或存在加密的 Cookie 裡 |
| 使用者上傳的檔案 | 共用的物件儲存(object storage),不要存在某一台伺服器的硬碟 |
這樣每台伺服器都一模一樣,隨時可以加一台、關一台,不影響使用者。這也是下一個主題「自動擴展」能夠成立的前提。
自動擴展:讓系統自己加機器、減機器
人工盯著流量加減機器太累,也來不及。雲端服務商提供自動擴展(autoscaling):你寫好規則,系統依監控數據自動調整台數。 一組典型的規則長這樣:
| 設定 | 意思 | 本課模擬器的設定(示意) |
|---|---|---|
| 最少台數 | 再閒也要保留幾台 | 1 台 |
| 最多台數 | 再忙也不超過幾台,避免帳單失控 | 6 台 |
| 擴充門檻(scale out) | 什麼情況要加機器 | 平均 CPU 連續 2 個時間單位超過 70%,加一台 |
| 縮減門檻(scale in) | 什麼情況要減機器 | 平均 CPU 連續 3 個時間單位低於 30%,減一台 |
為什麼要「連續」好幾個時間單位?CPU 用量本來就會上下跳動,只看一瞬間就加減機器,台數會來回震盪。 很多服務還會設定冷卻時間(cooldown):加完一台之後先等一段時間,讓新機器開機、開始分擔流量,再判斷要不要繼續加。 注意加機器不是瞬間完成的,新機器要開機、啟動程式,這段期間使用者仍然會感受到變慢。
縮減比擴充更保守(觀察更久),是常見的設計:寧可多付一點錢,也不要剛減完機器流量又湧上來。
雲端怎麼收費
剛才的累計費用會隨台數增加,因為最常見的計價方式是按時計費:機器開著多久,就付多久的錢。整理常見的計價方式:
| 計價方式 | 怎麼算 | 適合 | 要注意 |
|---|---|---|---|
| 按時計費(虛擬機) | 規格越大、開越久越貴;閒著沒人用也照算 | 一直有人在用的服務 | 忘了關機最容易爆帳單 |
| 按次計價(無伺服器,serverless) | 依請求次數與實際執行時間計費;沒有請求時幾乎不收費 | 流量很少或忽高忽低的服務、偶爾才跑一次的工作 | 很久沒人用時,第一個請求要等平台準備執行環境(冷啟動);流量很大時反而可能比較貴 |
| 儲存 | 依存放的資料量與時間 | 硬碟、備份、物件儲存 | 虛擬機關機後,硬碟通常仍在計費 |
| 網路傳輸 | 資料從雲端傳出去的量 | 影片、大型檔案下載 | 常被忽略;CDN 可以降低部分成本 |
| 長期承諾 | 承諾使用一段時間換取比較低的單價 | 長期、穩定的正式服務 | 中途不用也要付;學生專題通常用不到 |
無伺服器(serverless)不是真的沒有伺服器,而是你只上傳一段函數或程式,伺服器由平台在有請求時才準備、用完收回, 你不必管理任何一台機器。延伸閱讀可看 /cs 的〈雲端運算(進階)〉文章。
不讓帳單嚇到你:五個習慣
雲端最常見的意外,不是被駭客攻擊,而是忘了關掉的資源在背景默默計費。做專題時養成這些習慣:
| 習慣 | 做法 |
|---|---|
| 不用就關機 | 只在展示或開發時開機。注意「關機」通常只停掉運算費用,硬碟與保留的公用 IP 可能仍在計費 |
| 用完就刪除 | 學期結束、專題完成後,刪掉虛擬機、硬碟、快照、負載平衡器這些資源;各家的計費細節不同,以官方說明為準 |
| 設定預算警示 | 在帳單頁面設定預算,花費到某個比例(例如 50%、80%、100%)時寄信通知你。警示只是通知,多半不會自動停機 |
| 從小規格開始 | 先用最小的規格,真的不夠再升級;搭配自動擴展時一定要設定最多台數 |
| 每週看一次帳單 | 找出不認得的項目;資源加上標籤(例如 project=final-demo),比較容易分辨 |
免費額度與學生方案能省下不少錢,但每家的規則不同、也常常調整。開始使用前先讀清楚,並設定預算警示,第 06 課會介紹怎麼找。
想一想:擴展
把網站從一台 2 vCPU 的主機換成一台 8 vCPU 的主機,這屬於哪一種擴展?
網站改成三台伺服器輪流處理請求後,使用者常常被登出。最可能的原因是?
自動擴展規則為什麼通常要求 CPU「連續一段時間」超過門檻才加機器,並設定冷卻時間?
想一想:成本
一個小組專題網站,只有每週上課時段會有人使用。下面哪一種做法最能控制費用?
專題結束後你把虛擬機「關機」了。下面哪一個說法比較正確?
重點精華回顧
- 垂直擴展換更大的機器,簡單但有上限;水平擴展多開幾台、用負載平衡器分攤,是雲端的主流,也順便避免單點故障。
- 水平擴展的伺服器要無狀態:登入狀態、上傳檔案、資料都放在共用的地方。
- 自動擴展規則:最少與最多台數、CPU 擴充與縮減門檻、連續觀察時間與冷卻時間;新機器開機需要時間。
- 按時計費閒著也照算;按次計價(無伺服器)沒有請求就幾乎不收費,但有冷啟動,流量大時不一定便宜。儲存與網路傳輸也要算。
- 不用就關機、用完就刪除、設定預算警示、從小規格開始、每週看帳單。本課所有金額都是示意值。