
在這個例子裡面,我們可以看見由四台Real Web Server及三台Real DB Server所組成的Web及DB Cluster。而Virtual Server本身不具備任何的服務資料(如程式碼或圖片...等),只有一個能力就是將連線重新導向到Real Server,而導向的方式有相當多種,之後會討論。這樣子利用重新導向來將服務負載分散給Real Server的方式就稱做Load Balance。
此外可以注意到 Virtual Server 2,除了上述的功能之外,就是可以偵測Virtual Server 1當機或是無法服務的時候,自動將自己的IP位置取代Virtual Server 1。這樣子的方式就稱做Failover。
IP配置的方式IP是一個很大的問題,由現今商業服務的環境看來,沒有實體IP根本無法進行任何服務。傳統的作法有三種,NAT,Direct Routing,Tunneling。
| IP配置方式 | NAT | Direct Routing | Tunneling |
| 伺服器網路功能支援 | 有NAT功能即可 | 需支援arp ignore | 需支援ip tunneling(設定上較arp ignore複雜) |
| IP種類 | public/private皆可(private ip 就是常說的虛擬IP) | 一定要public | 一定要public |
| IP數量 | 適合少量(100以下) | 可以大量 | 可以大量 |
| Virtual Server負載 | 高 | 低 | 低 |
Director Server就是要用來做Load Balance的機器,目的也是為了剛剛所說進行連線重新導向。
1. Bind 9實做RRDNS
2. Linux Virtual Server(ldirectord+ipvsadm)
3. Apache mod_proxy
4. HAProxy
Bind是一套相當著名的DNS服務軟體,我想Internet上九成都是使用這個來當作DNS服務,他有一個功能就是可以利用輪替(Round Robin)的方式來讓查詢者找到不同的IP,藉此將連線導向不同的機器。你可以試著下nslookup www.google.com指令,會注意到每次回來的3個IP順序是不太一樣的,而OS會自動以第一個IP作為你這次連線的對象。其實在這裡拿RRDNS來比有點不太適合,因為他並不是針對封包來進行負載平衡,而只是單純切換IP而已。不過這個方式確實是早期進行負載平衡的方式,就連現在都還可以在各處看見。
Linux Virtual Server計畫實行已經相當久遠,目的就是利用ipvsadm這一個以IP為主的負載平衡程式來達到讓所有使用TCP/IP的通訊協定都可以進行負載平衡。由於他是由Linux Kernel所支援,效率相當好,佔用CPU資源相當的低。不過因為ipvsadm並無法針對任何layer 4以上的封包資料進行分析,並不像接下來談到的proxy一樣具有先分析HTTP再傳送的能力,如果將這個功能都寫進去,那要做在Kernel裡就不太可能了。再者ipvsadm要手動設定也是一件難事,所以靠著ldirectord可以進行較簡單的設定。
Apache也是眾所皆知的HTTP Server,自2.0版開始對Proxy的功能大幅度地支援,儘管沒有Squid功能強大,卻整合了Apache,讓他可以進行一些意想不到的作法如Reverse Proxy。以往Proxy都是單向地,從Server到Client,而Reverse Proxy是反過來,可以處理Client HTTP Post到Server的資料。也因此加上一些改善,雙向的Proxy可以完全變成HTTP負載平衡軟體。使用Apache執行其實是有一點浪費效能的,另一個HAProxy就是純粹做負載平衡的,而本身也有簡單的快取能力。
這四種方法其實區別只在於,萬一有任何Real Server掛掉的時候,正要連線的那個人是否會斷線,換句話說就是Director是否有辦法偵測到連線對向是否斷線。結論是mod_proxy與haproxy都可以偵測到,除非機器全部掛掉,或是director自己死掉,不然使用者完全不會感受到任何的中斷。而RRDNS就完全沒有辦法,ipvsadm也是至少會有一次連線會中斷。其實這個結論也是合理的,相對的代價就是使用Proxy方式消耗的CPU會較高。
| Director | CPU使用 | 封包轉送效率 | 是否會偵測連線 | 是否會遭遇斷線 |
| RRDNS | 低 | 最高(直接連線) | 否 | 是 |
| ipvsadm | 最低 | 高 | 是 | 是 |
| mod_proxy | 高 | 低 | 是 | 否 |
| haproxy | 中 | 中 | 是 | 否 |
| 歡迎光臨 ADJ網路實驗室 (http://dz.adj.idv.tw/) | Powered by Discuz! 6.0.0 |