大部分的個人網站在一開始或許只是跟幾十人上百人共享的一個虛擬主機空間,然後隨著內容的增加和訪問量的增長,虛擬主機的帶寬、空間已經不能滿足需求,站長就得開始考慮為網站購置一部獨立的服務器,使用100M共享甚至是10M獨享帶寬;而當網站繼續發展,訪問的用戶也已經遍布大江南北,站長又得考慮電信網通的互通問題,在南方和北方各放置一台服務器作為鏡像站點,或是采用雙線接入;當這個網站訪問量更大時,一味的增加帶寬和設置鏡像站點無疑會使網站運營成本劇增,加上單個服務器本身也有性能和線程的瓶頸,在並發訪問量較大並且集中在一台服務器的時候,“Server too busy”就出現了,而這時站長應該采用什麼方式使得網站在高訪問量的時候仍然擁有較好的訪問效果呢?
這就牽涉到負載均衡的話題。
我們之前討論過CDN,其實CDN除了加速之外,也具有分流的效果,因此在負載均衡領域也有不少應用,其實基本上緩存(Cache)+鏡像技術都有分流作用,但是如何分流還是需要一個負載均衡設備進行引導,所以,我們今天專門討論負載均衡技術。
關於負載均衡服務:
負載均衡服務能夠平衡服務器群中的所有的服務器和應用之間的通信負載,根據實時響應時間進行判斷,將任務交由負載最輕的服務器來處理,以實現真正的智能通信管理和最佳的服務器群性能。負載均衡技術控制第四層到第七層的應用/內容,從而對不同類型的客戶和應用實現了優先級劃分和差別服務,使用第七層智能會話恢復技術,同時可以檢測出HTTP 400,500和600系列的錯誤。它透明地將交易重新定向到另一台服務器,從而使系統能夠完成該交易。服務器故障切換和多重冗余特性可以讓通信繞過故障點,從而使網站始終保持運行和可訪問性。
實現負載均衡的方法:
關於實現負載均衡的方法,網上也有不少相關討論,以下做一些引用:
基於特定服務器軟件的負載均衡
很多網絡協議都支持“重定向”功能,例如在HTTP協議中支持Location指令,接收到這個指令的浏覽器將自動重定向到Location指明的另一個URL上。由於發送Location指令比起執行服務請求,對Web服
任何時候Web服務器認為自己負載較大的時候,它就不再直接發送回浏覽器請求的網頁,而是送回一個Location指令,讓浏覽器去服務器集群中的其他服務器上獲得所需要的網頁。
在這種方式下,服務器本身必須支持這種功能,然而具體實現起來卻有很多困難,例如一台服務器如何能保證它重定向過的服務器是比較空閒的,並且不會再次發送Location指令,Location指令和浏覽器都沒有這方面的支持能力,這樣很容易在浏覽器上形成一種死循環。
因此這種方式實際應用當中並不多見,使用這種方式實現的服務器集群軟件也較少。有些特定情況下可以使用CGI(包括使用FastCGI或mod_perl擴展來改善性能)來模擬這種方式去分擔負載,而Web服務器仍然保持簡潔、高效的特性,此時避免Location循環的任務將由用戶的CGI程序來承擔。
基於DNS的負載均衡
由於基於服務器軟件的負載均衡需要改動軟件,因此常常是得不償失,負載均衡最好是在服務器軟件之外來完成,這樣才能利用現有服務器軟件的種種優勢。最早的負載均衡技術是通過DNS服務中的隨機名字解析來實現的,在DNS服務器中,可以為多個不同的地址配置同一個名字,而最終查詢這個名字的客戶機將在解析這個名字時得到其中的一個地址。因此,對於同一個名字,不同的客戶機會得到不同的地址,他們也就訪問不同地址上的Web服務器,從而達到負載均衡的目的。
例如如果希望使用三個Web服務器來回應對www.ghq.net的HTTP請求,就可以設置該域的DNS服務器中關於該域的數據包括有與下面例子類似的結果:
www1 IN A 192.168.1.1
www2 IN A 192.168.1.2
www3 IN A 192.168.1.3
www IN CNAME www1
www IN CNAME www2
www IN CNAME www3
此後外部的客戶機就可能隨機的得到對應www的不同地址,那麼隨後的HTTP請求也就發送給不同地址了。
DNS負載均衡的優點是簡單、易行,並且服務器可以位於互聯網的任意位置上,當前使用在包括Yahoo在內的Web站點上。然而它也存在不少缺點,一個缺點是為了保證DNS數據及時更新,一般都要將 DNS的刷新時間設置的較小,但太小就會造成太大的額外網絡流量,並且更改了DNS數據之後也不能立即生效;第二點是DNS負載均衡無法得知服務器之間的差異,它不能做到為性能較好的服務器多分配請求,也不能了解到服務器的當前狀態,甚至會出現客戶請求集中在某一台服務器上的偶然情況。
反向代理負載均衡
使用代理服務器可以將請求轉發給內部的Web服務器,使用這種加速模式顯然可以提升靜態網頁的訪問速度。因此也可以考慮使用這種技術,讓代理服務器將請求均勻轉發給多台內部Web服務器之一上,從而達到負載均衡的目的。這種代理方式與普通的代理方式有所不同,標准代理方式是客戶使用代理訪問多個外部Web服務器,而這種代理方式是多個客戶使用它訪問內部Web服務器,因此也被稱為反向代理模式。
實現這個反向代理能力並不能算是一個特別復雜的任務,但是在負載均衡中要求特別高的效率,這樣實現起來就不是十分簡單的了。每針對一次代理,代理服務器就必須打開兩個連接,一個為對外的連接,一個為對內的連接,因此對於連接請求數量非常大的時候,代理服務器的負載也就非常之大了,在最後反向代理服務器會成為服務的瓶頸。
例如,使用Apache的mod_rproxy模塊來實現負載均衡功能時,提供的並發連接數量受Apache本身的並發連接數量的限制。一般來講,可以使用它來對連接數量不是特別大,但每次連接都需要消耗大量處理資源的站點進行負載均衡,例如搜尋。
使用反向代理的好處是,可以將負載均衡和代理服務器的高速緩存技術結合在一起,提供有益的性能,具備額外的安全性,外部客戶不能直接訪問真實的服務器。並且實現起來可以實現較好的負載均衡策略,將負載可以非常均衡的分給內部服務器,不會出現負載集中到某個服務器的偶然現象。
基於NAT的負載均衡技術
網絡地址轉換為在內部地址和外部地址之間進行轉換,以便具備內部地址的計算機能訪問外部網絡,而當外部網絡中的計算機訪問地址轉換網關擁有的某一外部地址時,地址轉換網關能將其轉發到一個映射的內部地址上。因此如果地址轉換網關能將每個連接均勻轉換為不同的內部服務器地址,此後外部網絡中的計算機就各自與自己轉換得到的地址上服務器進行通信,從而達到負載分擔的目的。
地址轉換可以通過軟件方式來實現,也可以通過硬件方式來實現。使用硬件方式進行操作一般稱為交換,而當交換必須保存TCP連接信息的時候,這種針對OSI網絡層的操作就被稱為第四層交換。支持負載均衡的網絡地址轉換為第四層交換機的一種重要功能,由於它基於定制的硬件芯片,因此其性能非常優秀,很多交換機聲稱具備400MB-800MB的第四層交換能力。
使用軟件方式來實現基於網絡地址轉換的負載均衡則要實際的多,除了一些廠商提供的解決方法之外,更有效的方法是使用免費的自由軟件來完成這項任務。其中包括Linux Virtual Server Project中的NAT實現方式,或者本文作者在FreeBSD下對natd的修訂版本。一般來講,使用這種軟件方式來實現地址轉換,中心負載均衡器存在帶寬限制,在100MB的快速以太網條件下,能得到最快達80MB的帶寬,然而在實際應用中,可能只有40MB-60MB的可用帶寬。
IDC提供的負載均衡服務
IDC提供的負載均衡服務有: