當web服務器的垂直擴展變得話費很高或困難的時候,我們需要考慮服務器的水平擴展,即負載均衡技術。負載均衡有很多技術,這里我們來一一介紹。
1.HTTP重定向
我們可以在代碼層面實現,通過設定訪問特定頁面如index.php,在php代碼中設置header的location值,返回重定向指令。這實際上是web應用程序自己來實現。
2.DNS負載均衡
DNS負責域名和IP地址之間的映射。DNS服務器可以作為調度器(DNS的常見策略是RR Round Robin方式)。
盡管基於HTTP重定向的負載均衡系統受到主站點性能的制約,但是不可否認這種方案中的調度策略具有很好的靈活性,你完全可以通過Web應用程序實現任何你能想到的調度策略。
相比之下,為DNS服務器開發自定義的調度策略就不那么容易了,但是,類似bind這樣的DNS服務器軟件提供了豐富的調度策略供你選擇。DNS服務器充當了一個粗放型的請求調度器。
3.反向代理負載均衡
它工作在HTTP層面,也就是TCP七層結構中的應用層,所以基於反向代理的負載均衡也稱為七層負載均衡。
這種方案負載均衡服務器是有瓶頸效應的,這種效應隨着后端服務器內容處理時間的減少而逐漸明顯,這不難解釋,反向代理服務器進行轉發操作本身是需要一定開銷的,比如創建線程,與后端服務器建立TCP連接,接受后端服務器返回的處理結果,分析http頭信息,用戶空間和內核空間的頻繁切換等,通常這部分時間並不長,但是當后端服務器處理請求的時間非常短時,轉發的開銷就顯得尤為突出。
4.IP層負載均衡LVS-NAT
我們需要在HTTP層面以下實現負載均衡,這些負載均衡調度器的工作必須由linux內核來完成,因為我們希望網絡數據包在從內核緩沖區進入進程用戶地址空間之前,盡早地被轉發到其他實際服務器上。而且正因為可以將調度器工作在應用層之下,這些負載均衡系統可以支持更多的網絡服務協議,比如ftp,smtp,dns,以及流媒體和VoIP等應用。
DNAT: 反向NAT,將實際服務器放置在內部網絡,而作為網關的NAT服務器將來自用戶端的數據包轉發給內部網絡的實際服務器(需要修改的是數據包的目標地址和端口)。比較著名的例子是LVS。NAT調度器的吞吐率很高是因為其在內核中進行請求轉發的較低開銷。
但是NAT服務器的帶寬卻成為了瓶頸。幸運的是,LVS提供了另一種負載均衡的方式,那就是直接路由。
5.直接路由LVS-DR
不同於NAT機制,直接路由的負載均衡調度器工作在數據鏈路層上,簡單地說,它通過修改數據包的目標mac地址,將數據包轉發到實際服務器上,並且重要的是,實際服務器的響應數據包將直接發送給客戶端,不經過調度器。適用於視頻網站(響應的數據包遠遠超過請求的數據包)。對於LVS-DR,一旦調度器失效,你可以馬上將LVS-DR切換到DNS-RR模式
6. IP隧道
LVS-TUN與LVS-DR不同的是,實際服務器可以和調度器不在同一個wan網段。