負載平衡(load balancing)
想像一家超市,用一條排隊隊伍供應多個結帳通道。隊伍最前端的協調員把每位顧客分派到空著的收銀台,這樣就不會有某個收銀員被淹沒、其他人卻閒著。負載平衡就是網路流量的那位協調員:一個裝置或服務,把進來的請求分散到一群伺服器上,讓工作被分擔、沒有任何單一伺服器被壓垮,整個系統也能處理遠超過任何單機所能負荷的量。
負載平衡器坐在一群相同伺服器的前方,對每個到來的連線或請求,用一種伺服器選擇策略挑一台來處理。簡單的策略包括輪詢(round robin,依序輪流分派)與隨機;較聰明的用最少連線(least connections,送給目前活躍連線最少的伺服器)或加權選擇(給較大的伺服器較多流量)。關鍵是,負載平衡器也做健康檢查(health checks)——它停止把流量送給回應失敗的伺服器——於是當機或過載的機器會被悄悄移出輪替。平衡可發生在第四層(傳輸層),它按 IP 與連接埠轉送 TCP/UDP 連線而不看內部;也可發生在第七層(應用層),它讀取實際的 HTTP 請求,能依 URL、Cookie 或主機名稱路由。
為什麼重要:負載平衡把「一台伺服器的容量」變成「一支隊伍的容量」,它是可擴展性(在平衡器後方加更多伺服器即可成長)與可用性(一台伺服器死掉也不會讓網站垮)的基礎。它是反向代理、CDN 邊緣與雲端負載平衡器內部的引擎。誠實的提醒:平衡器本身不能變成單點故障(所以通常會被複製多份),而且只有當伺服器可互換時平衡才容易——若某使用者的工作階段住在某台特定伺服器上,你就需要工作階段親和性(session affinity,黏性工作階段)或共用狀態,這會讓單純的圖像變複雜。
一個網站跑在一台負載平衡器後方的八台網頁伺服器上。發布當天流量翻倍;營運者只要再加四台伺服器到池中。平衡器的健康檢查也會自動把一台凍結的伺服器移出輪替,沒有可見的中斷。
多台可互換的伺服器、一個前端:分擔工作、撐過故障。
負載平衡假設伺服器可以互換。若狀態住在某一台伺服器上,你就需要黏性工作階段或共用儲存——否則使用者可能被彈到一台從沒見過他工作階段的伺服器。