天天看點

負載均衡實作方式(dns ,反向代理,nat)

 Internet的快速增長使多媒體網絡 伺服器,特别是Web伺服器,面對的通路者數量快速增加,網絡伺服器需要具備提供大量并發通路服務的能力。

  例如Yahoo每天會收到數百萬次的通路請求,是以對于提供大負載Web服務的伺服器來講,CPU、I/O處理能力很快會成為瓶頸。簡單的提高硬體性能并不能真正解決這個問題,因為單台伺服器的性能總是有限的,一般來講,一台PC伺服器所能提供的并發通路處理能力大約為1000個,更為高檔的專用伺服器能夠支援3000-5000個并發通路,這樣的能力還是無法滿足負載較大的網站的要求。

  尤其是網絡請求具有突發性,當某些重大事件發生時,網絡通路就會急劇上升,進而造成網絡瓶頸,例如在網上釋出的克林頓彈劾書就是很明顯的例子。必須采用多台伺服器提供網絡服務,并将網絡請求配置設定給這些伺服器分擔,才能提供處理大量并發服務的能力。當使用多台伺服器來分擔負載的時候,最簡單的辦法是将不同的伺服器用在不同的方面。按提供的内容進行分割時,可以将一台伺服器用于提供新聞頁面,而另一台用于提供遊戲頁面;或者可以按伺服器的功能進行分割,将一台伺服器用于提供靜态頁面通路,而另一些用于提供CGI等需要大量消耗資源的動态頁面通路。

  然而由于網絡通路的突發性,使得很難确定那些頁面造成的負載太大,如果将服務的頁面分割的過細就會造成很大浪費。事實上造成負載過大的頁面常常是在變化中的,如果要經常按照負載變化來調整頁面所在的伺服器,那麼勢必對管理和維護造成極大的問題。是以這種分割方法隻能是大方向的調整,對于大負載的網站,根本的解決辦法還需要應用負載均衡技術。

  負載均衡的思路下多台伺服器為對稱方式,每台伺服器都具備等價的地位,都可以單獨對外提供服務而無須其他伺服器的輔助。然後通過某種負載分擔技術,将外部發送來的請求均勻配置設定到對稱結構中的某一台伺服器上,而接收到請求的伺服器都獨立回應客戶機的請求。由于建立内容完全一緻的Web伺服器并不複雜,可以使用伺服器同步更新或者共享存儲空間等方法來完成,是以負載均衡技術就成為建立一個高負載Web站點的關鍵性技術。

  基于特定伺服器軟體的負載均衡 很多網絡協定都支援“重定向”功能,例如在HTTP協定中支援Location指令,接收到這個指令的浏覽器将自動重定向到Location指明的另一個URL上。由于發送Location指令比起執行服務請求,對Web伺服器的負載要小的多,是以可以根據這個功能來設計一種負載均衡的伺服器。任何時候Web伺服器認為自己負載較大的時候,它就不再直接發送回浏覽器請求的網頁,而是送回一個Locaction指令,讓浏覽器去伺服器叢集中的其他伺服器上獲得所需要的網頁。

  在這種方式下,伺服器本身必須支援這種功能,然而具體實作起來卻有很多困難,例如一台伺服器如何能保證它重定向過的伺服器是比較空閑的,并且不會再次發送Location指令?Location指令和浏覽器都沒有這方面的支援能力,這樣很容易在浏覽器上形成一種死循環。是以這種方式實際應用當中并不多見,使用這種方式實作的伺服器叢集軟體也較少。有些特定情況下可以使用CGI(包括使用FastCGI或mod_perl擴充來改善性能)來模拟這種方式去分擔負載,而Web伺服器仍然保持簡潔、高效的特性,此時避免Location循環的任務将由使用者的CGI程式來承擔。

  基于DNS的負載均衡 由于基于伺服器軟體的負載均衡需要改動軟體,是以常常是得不償失,負載均衡最好是在伺服器軟體之外來完成,這樣才能利用現有伺服器軟體的種種優勢。最早的負載均衡技術是通過DNS服務中的随機名字解析來實作的,在DNS伺服器中,可以為多個不同的位址配置同一個名字,而最終查詢這個名字的客戶機将在解析這個名字時得到其中的一個位址。是以,對于同一個名字,不同的客戶機會得到不同的位址,他們也就通路不同位址上的Web伺服器,進而達到負載均衡的目的。 例如如果希望使用三個Web伺服器來回應對www.exampleorg.org.cn的HTTP請求,就可以設定該域的DNS伺服器中關于該域的資料包括有與下面例子類似的結果:www1 IN A 192.168.1.1www2 IN A 192.168.1.2www3 IN A 192.168.1.3www IN CNAME www1www IN CNAME www2www 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的第四層交換能力,然而也有一些資料表明,在如此快的速度下,大部分交換機就不再具備第四層交換能力了,而僅僅支援第三層甚至第二層交換。然而對于大部分站點來講,目前負載均衡主要是解決Web伺服器處理能力瓶頸的,而非網絡傳輸能力,很多站點的網際網路連接配接帶寬總共也不過10MB,隻有極少的站點能夠擁有較高速的網絡連接配接,是以一般沒有必要使用這些負載均衡器這樣的昂貴裝置。

  使用軟體方式來實作基于網絡位址轉換的負載均衡則要實際的多,除了一些廠商提供的解決方法之外,更有效的方法是使用免費的自由軟體來完成這項任務。其中包括Linux Virtual Server Project中的NAT實作方式,或者本文作者在FreeBSD下對natd的修訂版本。一般來講,使用這種軟體方式來實作位址轉換,中心負載均衡器存在帶寬限制,在100MB的快速以太網條件下,能得到最快達80MB的帶寬,然而在實際應用中,可能隻有40MB-60MB的可用帶寬。

  擴充的負載均衡技術 上面使用網絡位址轉換來實作負載分擔,毫無疑問所有的網絡連接配接都必須通過中心負載均衡器,那麼如果負載特别大,以至于背景的伺服器數量不再在是幾台、十幾台,而是上百台甚至更多,即便是使用性能優秀的硬體交換機也回遇到瓶頸。此時問題将轉變為,如何将那麼多台伺服器分布到各個網際網路的多個位置,分散網絡負擔。當然這可以通過綜合使用DNS和NAT兩種方法來實作,然而更好的方式是使用一種半中心的負載均衡方式。在這種半中心的負載均衡方式下,即當客戶請求發送給負載均衡器的時候,中心負載均衡器将請求打包并發送給某個伺服器,而伺服器的回應請求不再傳回給中心負載均衡器,而是直接傳回給客戶,是以中心負載均衡器隻負責接受并轉發請求,其網絡負擔就較小了。

  來自Linux Virtual Server Project,為他們使用IP隧道實作的這種負載分擔能力的請求/回應過程,此時每個背景伺服器都需要進行特别的位址轉換,以欺騙浏覽器客戶,認為它的回應為正确的回應。同樣,這種方式的硬體實作方式也非常昂貴,但是會根據廠商的不同,具備不同的特殊功能,例如對SSL的支援等。由于這種方式比較複雜,是以實作起來比較困難,它的起點也很高,目前情況下網站并不需要這麼大的處理能力。 比較上面的負載均衡方式,DNS最容易,也最常用,能夠滿足一般的需求。但如果需要進一步的管理和控制,可以選用反向代理方式或NAT方式,這兩種之間進行選擇主要依賴緩沖是不是很重要,最大的并發通路數量是多少等條件。而如果網站上對負載影響很厲害的CGI程式是由網站自己開發的,也可以考慮在程式中自己使用Locaction來支援負載均衡。半中心化的負載分擔方式至少在國内目前的情況下還不需要。