1. 故事
按「下一步」一步一步看。每一步都有一位角色出場,解釋自己正在做什麼。
序幕:溫習一下
第 1 步/共 12 步
一個名字,一部伺服器
讓我查一查……example.com 的 IP Address(網絡位址)是 192.0.2.80。到目前為止,這個位址背後只有一部伺服器。
動畫文字版(全部步驟)
- 序幕:溫習一下
- 一個名字,一部伺服器 查查博士:讓我查一查……
example.com的 IP Address(網絡位址)是192.0.2.80。到目前為止,這個位址背後只有一部伺服器。 - 第一幕:大減價
- 全世界一起湧來 小比:
example.com大減價!成千上萬個小比同時湧向同一部伺服器。它每秒只可以處理有限的請求,大家都在排隊,網頁慢得像蝸牛。 - 伺服器倒下了 小比:更糟的是,伺服器終於頂不住,停止運作了。只有一部伺服器,它一停,整個網站就停。這就是 Single Point of Failure(單點故障)。
- 第二幕:帶位員出場
- 路路的遠房親戚 路路:我來介紹我的遠房親戚:Load Balancer(負載平衡器)!它站在一組伺服器前面,對外用網站的位址
192.0.2.80;後面有三部伺服器,用 Private IP(私人位址)10.0.0.x。- 對外的位址叫 VIP(虛擬 IP 位址):
192.0.2.80 - 查查博士的答案不用改,用戶完全不知道後面有多少部伺服器
- 對外的位址叫 VIP(虛擬 IP 位址):
- 輪流分配:Round Robin 小比:我們一個接一個到達 Load Balancer。它輪流把我們交給伺服器 1、2、3、1、2、3……這叫 Round Robin(輪流)。每部伺服器只要處理三分之一的工作!
- 其他方法:Least Connections(最少連線):交給目前最空閒的
- Hash(雜湊):同一位用戶通常交給同一部,方便記住購物車
- Health Check:你還好嗎? 路路:Load Balancer 每隔幾秒就向每部伺服器發出 Health Check(健康檢查):「你還好嗎?」伺服器 1 和 3 都回覆「我很好!」,但伺服器 2 沒有回應……
- 暫停分配給伺服器 2 小比:Load Balancer 把伺服器 2 標記為「不健康」,暫時不再把我們交給它。伺服器 1 和 3 繼續工作,大部分用戶只覺得網站慢了一點點,不會察覺有伺服器壞了!
- 伺服器 2 修好後,Health Check 成功,就會自動加回來
- 第三幕:帶位員也有後備
- Load Balancer 也會倒下? 路路:等等!如果 Load Balancer 本身壞了,全部伺服器都幫不上忙,它就成了新的單點故障。所以我們再加一部後備 Load Balancer,兩部一主一備,這叫 High Availability(高可用性)。(伺服器 2 已經修好,Health Check 成功,自動加回來了。)
- 這種做法叫 Active-Standby(主備模式)
- Heartbeat:互相確認 小比:兩部 Load Balancer 之間不停發送 Heartbeat(心跳訊號):「我還在!」「我也在!」平時由主機負責 VIP
192.0.2.80,後備機只在旁邊留意。 - Failover:後備機接手 路路:主機突然停止運作,後備機收不到心跳!它在幾秒內接手 VIP
192.0.2.80,繼續分配工作。這叫 Failover(故障轉移)。用戶完全不用改任何設定。 - 查查博士也可以分流 查查博士:我也可以幫忙:同一個名字回覆幾個 IP Address,或者按用戶所在地區,回覆最近的數據中心。不過我的答案會被 Cache(快取)3600 秒,出事時未必能立即改過來,所以要和 Load Balancer 一起用。
- 總結:人多也不怕 路路:Load Balancer 把工作分給多部伺服器;Health Check 自動避開壞掉的伺服器;兩部 Load Balancer 用 Heartbeat 和 Failover 互相後備。每個重要部分都有後備,網站就可以一直運作。這邊走,每部伺服器都有人照顧!
- Load Balancer:對外 VIP,分配請求(Round Robin、Least Connections、Hash)
- Health Check:自動移除不健康的伺服器
- High Availability:Active-Standby + Heartbeat + Failover
2. 問題在哪裡
查查博士,即 DNS(網域名稱系統),告訴大家 example.com 的 IP Address(網絡位址)是 192.0.2.80。(留意:192 開頭不一定是 Private,只有 192.168 開頭才是。192.0.2.80 是互聯網上的公共位址。)
平時,這個位址背後只有一部伺服器,一切正常。到了大減價那天,問題來了:
- 太多人。 一部伺服器每秒只可以處理有限的請求。成千上萬個小比同時湧來,大家都要排隊,網頁慢得像蝸牛。
- 一停就全停。 伺服器終於頂不住,停止運作了。只有一部伺服器,它一停,整個網站就停。
第二個問題叫 Single Point of Failure(單點故障):只要一個地方出問題,整個系統就停頓。
3. 網絡怎樣解決
好像一間很受歡迎的餐廳:門口有一位帶位員,把客人輪流帶到不同的枱;哪位侍應病倒了,就不再把客人帶給他。帶位員自己也有一位後備同事。
Load Balancer(負載平衡器)就是這位帶位員:它站在一組伺服器前面,把每個請求分配給其中一部。再加一部後備 Load Balancer,任何一部壞了都有人頂上,這就是 High Availability(高可用性):令系統在部分設備故障時仍然可以繼續運作的設計。
4. 看深一點
VIP(虛擬 IP 位址):對外只有一個地址
| 設備 | 位址 | 誰會看到 |
|---|---|---|
| Load Balancer | VIP 192.0.2.80 |
所有用戶 |
| 伺服器 1 | 10.0.0.11 |
只有 Load Balancer |
| 伺服器 2 | 10.0.0.12 |
只有 Load Balancer |
| 伺服器 3 | 10.0.0.13 |
只有 Load Balancer |
VIP 是 Load Balancer 對外使用的位址,它不固定屬於某一部機器。查查博士的答案不用改,仍然是 192.0.2.80。後面的伺服器用 Private IP(私人位址)10.0.0.x,用戶完全不知道後面有多少部伺服器。
小比到達 VIP 後,Load Balancer 把收件人改成其中一部伺服器的位址,有點像 NAT(網絡位址轉換)。伺服器的回覆也會經 Load Balancer 送回用戶。
怎樣分配?三種常見方法
| 方法 | 做法 | 適合 |
|---|---|---|
| Round Robin(輪流) | 1、2、3、1、2、3……輪流分配 | 每個請求的工作量差不多 |
| Least Connections(最少連線) | 交給目前連線最少、最空閒的一部 | 有些請求處理得特別久 |
| Hash(雜湊) | 按用戶的 IP Address 等資料計算,同一位用戶通常交給同一部 | 伺服器要記住購物車等資料 |
故事中用 Round Robin:三部伺服器輪流工作,每部只要處理約三分之一。
Health Check(健康檢查):你還好嗎?
Load Balancer 每隔幾秒,就向每部伺服器發出 Health Check。它可以只是試試連接 Port(連接埠),也可以真的要一頁網頁,看回覆是否正確。
伺服器 1 10.0.0.11 你還好嗎? → 我很好! 健康
伺服器 2 10.0.0.12 你還好嗎? → (沒有回應)不健康,暫停分配
伺服器 3 10.0.0.13 你還好嗎? → 我很好! 健康
連續幾次失敗,伺服器就會被標記為「不健康」,暫時移出名單。修好後 Health Check 再次成功,它就會自動加回來。大部分用戶只覺得網站慢了一點,不會察覺有伺服器壞了。
High Availability:帶位員也有後備
只有一部 Load Balancer,它就成了新的 Single Point of Failure。所以要再加一部後備機,兩部一主一備,這叫 Active-Standby(主備模式):
- Heartbeat(心跳訊號):兩部 Load Balancer 之間不停互相發送「我還在!」的訊息。
- 平時由主機(Active)負責 VIP
192.0.2.80,後備機(Standby)只在旁邊留意。 - Failover(故障轉移):後備機一段時間收不到心跳,就在幾秒內接手 VIP,繼續分配工作。
接手時,後備機會在 LAN(區域網絡)內發出 ARP(位址解析協定)廣播,通知 Switch(交換器)和 Router(路由器):「192.0.2.80 現在由我負責。」用戶完全不用改任何設定。
查查博士也可以分流
DNS 也可以幫忙分流:同一個名字回覆幾個 IP Address,或者按用戶所在地區,回覆最近的 Data Center(數據中心)位址。
不過 DNS 答案會被 Cache(快取),例如 TTL(存活時間)3600 秒。某個數據中心出事時,已記住舊答案的用戶未必能立即轉走。所以大型網站會兩樣一起用:DNS 先把用戶分到不同地區,每個地區再由 Load Balancer 分配到伺服器。
5. 動手試試
任務:多查幾次電話簿
- 在電腦打開「命令提示字元」(Windows)或「終端機」(Mac)。
- 輸入
nslookup加一個大型網站的名字,例如你常用的影片網站。 - 看看答案是不是有幾個 IP Address;隔幾分鐘再查一次,次序或位址有沒有改變?
- 想一想:這些位址背後,可能各有一部 Load Balancer 和一大群伺服器。
小互動
誰負責?
以下每一件工作,是由 Load Balancer 分配、Health Check、Failover 還是 DNS 分流負責?
-
1把每個請求交給後面其中一部伺服器
-
2定時檢查伺服器有沒有正確回應
-
3主 Load Balancer 停止運作後,後備機接手 VIP
-
4按用戶所在地區,回覆最近數據中心的 IP Address
-
5用 Round Robin 或 Least Connections 分配工作
-
6定時檢查時發現伺服器 2 沒有回應,把它標記為不健康
全部分對了!Load Balancer 分配工作,Health Check 避開壞掉的伺服器,Failover 讓後備機接手,DNS 分流則在查名字時已經分開用戶。
6. 比喻的極限
- Load Balancer 不只是一個人在帶位。 它每秒可以處理數以萬計的連線,而且很多時是軟件或雲端服務,不一定是一部獨立的機器。
- 不是每個小比都分開處理。 同一條 TCP(傳輸控制協定)連線的封包,會一直交給同一部伺服器,否則連線會斷掉;動畫中一個小比代表一個請求。
- Health Check 不是萬能。 伺服器「回覆了」不代表它一切正常,例如它可能回覆得很慢,或者資料有錯;所以檢查要設計得好。
- 兩部 Load Balancer 也可以一起工作。 除了一主一備,還有 Active-Active(雙主模式),兩部同時分擔工作。
- 後備不止一層。 真實的大型網站連網線、電源、Switch 甚至整個數據中心都有後備;動畫只畫出了伺服器和 Load Balancer。
7. 小測驗
8. 重點筆記
- Load Balancer(負載平衡器)對外用一個 VIP(虛擬 IP 位址),把請求分配給後面多部伺服器。
- 分配方法有 Round Robin(輪流)、Least Connections(最少連線)和 Hash(雜湊)等。
- Health Check(健康檢查)自動避開沒有回應的伺服器,修好後再加回來。
- High Availability(高可用性):兩部 Load Balancer 以 Active-Standby 運作,用 Heartbeat 互相監察,主機壞了就 Failover,由後備機接手 VIP。
- DNS 可以按地區分流,但因為有 Cache,要和 Load Balancer 一起用。
延伸閱讀
恭喜你!你已經看完全部 20 個網絡小故事。由八爪上班第一天送出第一個 Frame(訊框),到盾盾守門、路路和帶位員一起撐起大減價,你已經走完一個封包從 LAN 到互聯網的整段旅程。想重溫某個角色的故事,可以按下面的「返回小故事目錄」;忘記了某個名詞,就去網站頂部的「詞彙表」查一查。背包執好,出發囉!