當伺服器負載過大時,需要透過幾台伺服器分散效能~通常都採用 Cluster 的架構,由一台中心伺服器來負責監控與分散要求,Web Server 與 Database 等 Server 蠻常在遇到瓶頸後採用這種方式來解決。
如果是網頁伺服器,可以採用 Apache or nginx 的 proxy 做 reverse proxy 來做。 reverse proxy 是由一台伺服器接收 url request 再由該 proxy server 向背後的伺服器農場(server farm) 發出請求(http request),再將回傳的資料轉送至其他實際提供服務伺服器達成。所以所有要求都會經過該伺服器處理,所以雖然幫後端分散了一些負載,但是到最後負載可能會卡在 proxy server 上~
但如果是其他服務,例如 ftp , streaming , dns .. 等其他 tcp 的服務就沒辦法用以上的 reverse proxy server 處理,因為他算是 layer 7 的 load balance 不是單純再轉送封包而已,而是很 high level 的再轉送網頁內容而已,如果要處理 tcp 的 load balance 就要透過其他不單純再處理 Web Server 的 Load Blancing 軟體來處理囉。
有幾本書在討論這種軟體
平衡模式:
能夠達成負載平衡有幾種模式:
• NAT Mode + HA
一台主伺服器負責接受要求,該伺服器再透過區網,將要求轉送給 private lan 內的其他處理伺服器,再由主伺服器轉送給 client,容易造成主伺服器過載。
• Direct Routing Mode(DR)
主伺服器負責接受要求,再透過區網選擇出一台可以工作的伺服器,不修改也不封裝 IP 封包,而是將資料封包的 MAC 地址改為選出後端伺服器的 MAC 地址,再將修改後的資料封包在與後端伺服器組成的區域網路連結,因為資料封包的 MAC 地址是選出的後端伺服器,所以後端伺服器肯定可以收到該封包,該負責的伺服器在直接回應 client 不經過主伺服器。這樣效能比較不會卡在主伺服器上。
為什麼可以不用修改封包?因為 real server 的 ip 要設的跟 service server 一樣,並且關閉 arp,這樣 real server 再接收到封包的時候也不會覺得有奇怪,實際設定可以搜尋 lvs 的相關文章。
• IP Tunneling Mode
連接分配和管理與 VS/NAT 中的一樣,只是它的封包轉送方法不同。 LBS 主機根據各個後端伺服器的負載情況,動態地選擇一台伺服器,將請求封包封裝在另一個 IP 封包中,再將封裝後的 IP 封包轉送給選出的後端伺服器。
後端伺服器收到封包後,先將封包解開獲得原來目標地址為 VIP 的封包,後端伺服器發現 VIP 位址被配置在本地的 IP 隧道設備上,所以就處理這個請求,然後依據路由表將回應封包直接返回給用戶端。
演算法:
- 輪詢(Round Robin)
SLB 通過”輪詢”演算法將外部請求按順序輪流分配到集群中的真實伺服器上,它均等地對待每一台伺服器,而不管伺服器上實際的連接數和系統負載。 - 加權輪詢(Weighted Round Robin)
SLB 通過”加權輪詢”調度算法根據真實伺服器的不同處理能力來調度訪問請求。這樣可以保證處理能力強的伺服器處理更多的負載流量。SLB 可以自動詢問真實伺服器的負載情況,並動態地調整其加權值。由管理者來決定哪個機器要承受較重的負載,依此分配權重。 - 最少鏈接(Least Connections)
SLB 通過”最少連接”演算法動態地將網路請求調度到已建立的鏈接數最少的伺服器上。如果 Cluster 的伺服器性能相似,採用”最小連接”演算法可以較好地均衡負載。依照當時要求的連線數分配,不考慮伺服器的差異,應該跟輪詢差不多。 - 加權最少鏈接(Weighted Least Connections)
在 Cluster 中的伺服器性能差異較大的情況下,LBS 採用”加權最少鏈接”演算法負載均衡性能,具有較高權重的伺服器將承受較大比例的連接負載。LBS 可以自動詢問真實伺服器的負載情況,並動態地調整其權值。加權輪詢的輪詢改成看當時連接數最少的…應該是優先順序的差異吧! - 基於局部性的最少鏈接(Locality-Based Least Connections)
“基於局部性的最少鏈接” 演算法是針對目標 IP 地址的負載均衡,目前主要用於 Cache Cluster 。該演算法根據請求的目標 IP 地址找出該目標 IP 地址最近使用的伺服器,若該伺服器 是可用的且沒有超載,將請求發送到該伺服器;若伺服器不存在,或者該伺服器超載且有伺服器處於一半的工作負載,則用”最少鏈接”的原則選出一個可用的伺服 器,將請求發送到該伺服器。
這邊的情境是 Catch Server Cluster, 所以 Client 的要求都是告訴你他要查哪台伺服器的資料,所以才有目標 IP 這個變數,這演算法主要想控制每個伺服器分別處理特定的要求,例如Client 要求 Yahoo 的 IP 就固定給 a 處理,Google 的 IP 就給 b 處理,這樣就可以減少每台伺服器要處理的區域,可以節省一些 Catch 儲存空間。
- 帶複製的基於局部性最少鏈接(Locality-Based Least Connections with Replication)
“帶複製的基於局部性最少鏈接” 演算法也是針對目標IP地址的負載均衡,目前主要用於Cache集群系統。它與LBLC算法的不同之處是它要維護從一個 目標IP地址到一組伺服器的對應,而LBLC 演算法維護從一個目標 IP 地址到一台伺服器的對應。該算法根據請求的目標IP地址找出該目標IP地址對應的伺服器組,按”最小連接”原則從伺服器組中選出一台伺服器,若伺服器沒有超載,將請求發送到該伺服器,若伺服器超載;則按”最小連接”原則從這個集群中選出一 台伺服器,將該伺服器加入到伺服器組中,將請求發送到該伺服器。同時,當該伺服器組有一段時間沒有被修改,將最忙的伺服器從伺服器組中刪除,以降低複製的 程度。
如同的局部性最少連接,只是這次處理的伺服器為一組為單位, a b c 一組都處理 client 對 yahoo 的要求,b c d 一組都處理 client 對 google 的要求,對於負載很大的情況一台機器處理不來,分組會在過載時的分配會有一些改善。 - 目地分佈(Destination Hashing)
“目地分佈” 演算法根據請求的目標 IP 地址,作為 Hash Key 從靜態分配的 Hash Table 找出對應的伺服器,若該伺服器是可用的且未超載,將請求發送到該伺服器,否則回應無可用伺服器。 - 來源分佈(Source Hashing)
“來源分佈” 演算法根據請求的來源 IP 地址,作為 Hash Key 從靜態分配的 Hash Table 找出對應的伺服器,若該伺服器是可用的且未超載,將請求發送到該伺服器,否則回應無可用伺服器。
另外介紹常用的幾款著名的 Open Source 軟體 SLB,
軟體:
- HAProxy
支援 Session keep alive,由於 http 伺服器很多台,如果遇到像 php 內建的 session 實作將 session 實體放在該機器上,
則沒辦法跨數台伺服器共用 session ,可能造成一個使用者在 a 機器 登入重新整理過後突然轉到 b 機器 ,
b 機器沒有 session 造成伺服器不認識使用者的情況,所以如果是 LBS 原生支援這種 session 的存活,可以省去自己要解決這種問題的麻煩。
- Red Hat Cluster Suite Product web page
- The High Availability Linux Project Project web site
- Linux Virtual Server (LVS) Project Web Site
效能佳,接近硬體LBS,特色是支援 Direct Routing,DR 前提是 real server 都能連結到實體網路。
沒什麼可以調整的參數,所以配置好就不用理他就可以跑得很好了~
分層:
Layer-2 Load Balancing
就是把好幾張網卡 bonding 起來上網分流…port aggregation
Layer-4 Load Balancing
可以針對 port 進行導向,例如 80 就導到某台 Web 伺服器,21 就導到 ftp Server~
Layer-7 Load Balancing
http 層的 load balance,可以判定虛擬伺服器~依照 http 內容去做決定要導到那個伺服器。
參考資料
- introduzione-a-lvs-linux-virtual-server
- Nginx負載均衡和LVS負載均衡的比較分析
- ha proxy nginx lvs 比較
- haproxy and stat 報表
- http://www.linuxvirtualserver.org/zh/lvs1.html
- http://eservice.seed.net.tw/class/class93.html
- http://loadbalancer.org/load_balancing_methods.php 用圖片解釋各種平衡模式