網絡小故事 20 · 進階

人多也不怕Load Balancer(負載平衡器)與 High Availability(高可用性)

幾百萬人同時打開同一個網站,伺服器為什麼不會塌?

主角:路路、查查博士、小比閱讀時間約 10 分鐘

建議先讀:小故事 19「Firewall 與 ACL」、第 7 課

1. 故事

按「下一步」一步一步看。每一步都有一位角色出場,解釋自己正在做什麼。

序幕:溫習一下

第 1 步/共 12 步

一個名字,一部伺服器

讓我查一查……example.com 的 IP Address(網絡位址)是 192.0.2.80。到目前為止,這個位址背後只有一部伺服器。

動畫文字版(全部步驟)
  1. 序幕:溫習一下
  2. 一個名字,一部伺服器 查查博士:讓我查一查……example.com 的 IP Address(網絡位址)是 192.0.2.80。到目前為止,這個位址背後只有一部伺服器。
  3. 第一幕:大減價
  4. 全世界一起湧來 小比:example.com 大減價!成千上萬個小比同時湧向同一部伺服器。它每秒只可以處理有限的請求,大家都在排隊,網頁慢得像蝸牛。
  5. 伺服器倒下了 小比:更糟的是,伺服器終於頂不住,停止運作了。只有一部伺服器,它一停,整個網站就停。這就是 Single Point of Failure(單點故障)。
  6. 第二幕:帶位員出場
  7. 路路的遠房親戚 路路:我來介紹我的遠房親戚:Load Balancer(負載平衡器)!它站在一組伺服器前面,對外用網站的位址 192.0.2.80;後面有三部伺服器,用 Private IP(私人位址)10.0.0.x。
    • 對外的位址叫 VIP(虛擬 IP 位址):192.0.2.80
    • 查查博士的答案不用改,用戶完全不知道後面有多少部伺服器
  8. 輪流分配:Round Robin 小比:我們一個接一個到達 Load Balancer。它輪流把我們交給伺服器 1、2、3、1、2、3……這叫 Round Robin(輪流)。每部伺服器只要處理三分之一的工作!
    • 其他方法:Least Connections(最少連線):交給目前最空閒的
    • Hash(雜湊):同一位用戶通常交給同一部,方便記住購物車
  9. Health Check:你還好嗎? 路路:Load Balancer 每隔幾秒就向每部伺服器發出 Health Check(健康檢查):「你還好嗎?」伺服器 1 和 3 都回覆「我很好!」,但伺服器 2 沒有回應……
  10. 暫停分配給伺服器 2 小比:Load Balancer 把伺服器 2 標記為「不健康」,暫時不再把我們交給它。伺服器 1 和 3 繼續工作,大部分用戶只覺得網站慢了一點點,不會察覺有伺服器壞了!
    • 伺服器 2 修好後,Health Check 成功,就會自動加回來
  11. 第三幕:帶位員也有後備
  12. Load Balancer 也會倒下? 路路:等等!如果 Load Balancer 本身壞了,全部伺服器都幫不上忙,它就成了新的單點故障。所以我們再加一部後備 Load Balancer,兩部一主一備,這叫 High Availability(高可用性)。(伺服器 2 已經修好,Health Check 成功,自動加回來了。)
    • 這種做法叫 Active-Standby(主備模式)
  13. Heartbeat:互相確認 小比:兩部 Load Balancer 之間不停發送 Heartbeat(心跳訊號):「我還在!」「我也在!」平時由主機負責 VIP 192.0.2.80,後備機只在旁邊留意。
  14. Failover:後備機接手 路路:主機突然停止運作,後備機收不到心跳!它在幾秒內接手 VIP 192.0.2.80,繼續分配工作。這叫 Failover(故障轉移)。用戶完全不用改任何設定。
  15. 查查博士也可以分流 查查博士:我也可以幫忙:同一個名字回覆幾個 IP Address,或者按用戶所在地區,回覆最近的數據中心。不過我的答案會被 Cache(快取)3600 秒,出事時未必能立即改過來,所以要和 Load Balancer 一起用。
  16. 總結:人多也不怕 路路: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 是互聯網上的公共位址。)

平時,這個位址背後只有一部伺服器,一切正常。到了大減價那天,問題來了:

  1. 太多人。 一部伺服器每秒只可以處理有限的請求。成千上萬個小比同時湧來,大家都要排隊,網頁慢得像蝸牛。
  2. 一停就全停。 伺服器終於頂不住,停止運作了。只有一部伺服器,它一停,整個網站就停。

第二個問題叫 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(主備模式):

  1. Heartbeat(心跳訊號):兩部 Load Balancer 之間不停互相發送「我還在!」的訊息。
  2. 平時由主機(Active)負責 VIP 192.0.2.80,後備機(Standby)只在旁邊留意。
  3. Failover(故障轉移):後備機一段時間收不到心跳,就在幾秒內接手 VIP,繼續分配工作。

接手時,後備機會在 LAN(區域網絡)內發出 ARP(位址解析協定)廣播,通知 Switch(交換器)和 Router(路由器):「192.0.2.80 現在由我負責。」用戶完全不用改任何設定。

查查博士也可以分流

DNS 也可以幫忙分流:同一個名字回覆幾個 IP Address,或者按用戶所在地區,回覆最近的 Data Center(數據中心)位址。

不過 DNS 答案會被 Cache(快取),例如 TTL(存活時間)3600 秒。某個數據中心出事時,已記住舊答案的用戶未必能立即轉走。所以大型網站會兩樣一起用:DNS 先把用戶分到不同地區,每個地區再由 Load Balancer 分配到伺服器。

5. 動手試試

任務:多查幾次電話簿

  1. 在電腦打開「命令提示字元」(Windows)或「終端機」(Mac)。
  2. 輸入 nslookup 加一個大型網站的名字,例如你常用的影片網站。
  3. 看看答案是不是有幾個 IP Address;隔幾分鐘再查一次,次序或位址有沒有改變?
  4. 想一想:這些位址背後,可能各有一部 Load Balancer 和一大群伺服器。

小互動

誰負責?

以下每一件工作,是由 Load Balancer 分配、Health Check、Failover 還是 DNS 分流負責?

  1. 1把每個請求交給後面其中一部伺服器

  2. 2定時檢查伺服器有沒有正確回應

  3. 3主 Load Balancer 停止運作後,後備機接手 VIP

  4. 4按用戶所在地區,回覆最近數據中心的 IP Address

  5. 5用 Round Robin 或 Least Connections 分配工作

  6. 6定時檢查時發現伺服器 2 沒有回應,把它標記為不健康

6. 比喻的極限

  • Load Balancer 不只是一個人在帶位。 它每秒可以處理數以萬計的連線,而且很多時是軟件或雲端服務,不一定是一部獨立的機器。
  • 不是每個小比都分開處理。 同一條 TCP(傳輸控制協定)連線的封包,會一直交給同一部伺服器,否則連線會斷掉;動畫中一個小比代表一個請求。
  • Health Check 不是萬能。 伺服器「回覆了」不代表它一切正常,例如它可能回覆得很慢,或者資料有錯;所以檢查要設計得好。
  • 兩部 Load Balancer 也可以一起工作。 除了一主一備,還有 Active-Active(雙主模式),兩部同時分擔工作。
  • 後備不止一層。 真實的大型網站連網線、電源、Switch 甚至整個數據中心都有後備;動畫只畫出了伺服器和 Load Balancer。

7. 小測驗

第 1 題,共 3 題Load Balancer 對外使用哪一個位址?
第 2 題,共 3 題Health Check 發現伺服器 2 沒有回應,Load Balancer 會怎樣做?
第 3 題,共 3 題為什麼 Load Balancer 本身也要有後備?

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 到互聯網的整段旅程。想重溫某個角色的故事,可以按下面的「返回小故事目錄」;忘記了某個名詞,就去網站頂部的「詞彙表」查一查。背包執好,出發囉!