1
2
3
4
5
6
7
8
9
10
11
<code> </code><code>具體的應用需求還得具體分析,如果是中小型的Web應用,比如日PV小于1000萬,用Nginx就完全可以了;如果機器不少,可以用DNS輪詢,LVS所</code>
<code>耗費的機器還是比較多的;大型網站或重要的服務,且伺服器比較多時,可以考慮用LVS。一種是通過硬體來進行進行,常見的硬體有比較昂貴的F5</code>
<code>和Array等商用的負載均衡器,它的優點就是有專業的維護團隊來對這些服務進行維護、缺點就是花銷太大,是以對于規模較小的網絡服務來說暫時</code>
<code>還沒有需要使用;另外一種就是類似于Nginx</code><code>/LVS/HAProxy</code><code>的基于Linux的開源免費的負載均衡軟體,這些都是通過軟體級别來實作,是以費用非常低</code>
<code>廉。目前關于網站架構一般比較合理流行的架構方案:Web前端采用Nginx</code><code>/HAProxy</code><code>+Keepalived作負載均衡器;後端采用MySQL資料庫一主多從和讀寫</code>
<code>分離,采用LVS+Keepalived的架構。當然要根據項目具體需求制定方案。</code>
#############################################################《Nginx篇》##########################################################
Nginx的優點是:
12
13
14
15
16
17
18
19
20
21
22
23
<code>工作在網絡的7層之上,可以針對http應用做一些分流的政策,比如針對域名、目錄結構,它的正則規則比HAProxy更為強大和靈活,這也是它目前廣泛流行的主要原因之一,Nginx單憑這點可利用的場合就遠多于LVS了。</code>
<code> </code><code>①Nginx對網絡穩定性的依賴非常小,理論上能</code><code>ping</code><code>通就就能進行負載功能,這個也是它的優勢之一;相反LVS對網絡穩定性依賴比較大,這點本人深有體會;</code>
<code> </code><code>②Nginx安裝和配置比較簡單,測試起來比較友善,它基本能把錯誤用日志列印出來。LVS的配置、測試就要花比較長的時間了,LVS對網絡依賴比較大。</code>
<code> </code><code>③可以承擔高負載壓力且穩定,在硬體不差的情況下一般能支撐幾萬次的并發量,負載度比LVS相對小些。</code>
<code> </code><code>④Nginx可以通過端口檢測到伺服器内部的故障,比如根據伺服器處理網頁傳回的狀态碼、逾時等等,并且會把傳回錯誤的請求重新送出到另一個節點,不過其中缺點就是不支援url來檢測。比如使用者正在上傳一個檔案,而處理該上傳的節點剛好在上傳過程中出現故障,Nginx會把上傳切到另一台伺服器重新處理,而LVS就直接斷掉了,如果是上傳一個很大的檔案或者很重要的檔案的話,使用者可能會是以而不滿。</code>
<code> </code><code>⑤Nginx不僅僅是一款優秀的負載均衡器/反向代理軟體,它同時也是功能強大的Web應用伺服器。LNMP也是近幾年非常流行的web架構,在高流量的環境中穩定性也很好。</code>
<code> </code><code>⑥Nginx現在作為Web反向加速緩存越來越成熟了,速度比傳統的Squid伺服器更快,可以考慮用其作為反向代理加速器。</code>
<code> </code><code>⑦Nginx可作為中層反向代理使用,這一層面Nginx基本上無對手,唯一可以對比Nginx的就隻有lighttpd了,不過lighttpd目前還沒有做到Nginx完全的功能,配置也不那麼清晰易讀,社群資料也遠遠沒Nginx活躍。</code>
<code> </code><code>⑧Nginx也可作為靜态網頁和圖檔伺服器,這方面的性能也無對手。還有Nginx社群非常活躍,第三方子產品也很多。</code>
<code>Nginx的缺點是:</code>
<code> </code><code>Nginx僅能支援http、https和Email協定,這樣就在适用範圍上面小些,這個是它的缺點。</code>
<code> </code><code>對後端伺服器的健康檢查,隻支援通過端口來檢測,不支援通過url來檢測。不支援Session的直接保持,但能通過ip_hash來解決</code>
#########################################################《LVS篇》###############################################################
LVS 是使用Linux核心叢集實作的一個高性能、高可用的負載均衡伺服器,它具有很好的可伸縮性(Scalability)、可靠性(Reliability)和可
管理性(Manageability)。
<code> </code><code>LVS 是使用Linux核心叢集實作的一個高性能、高可用的負載均衡伺服器,它具有很好的可伸縮性(Scalability)、可靠性(Reliability)和可</code>
<code>管理性(Manageability)。</code>
<code>LVS的優點是:</code>
<code> </code><code>①抗負載能力強、是工作在網絡4層之上僅作分發之用,沒有流量的産生,這個特點也決定了它在負載均衡軟體裡的性能最強的,對記憶體和cpu資源消耗比較低。</code>
<code> </code><code>②配置性比較低,這是一個缺點也是一個優點,因為沒有可太多配置的東西,是以并不需要太多接觸,大大減少了人為出錯的幾率。</code>
<code> </code><code>工作穩定,因為其本身抗負載能力很強,自身有完整的雙機熱備方案,如LVS+Keepalived,不過我們在項目實施中用得最多的還是LVS</code><code>/DR</code><code>+Keepalived。</code>
<code> </code><code>③無流量,LVS隻分發請求,而流量并不從它本身出去,這點保證了均衡器IO的性能不會收到大流量的影響。</code>
<code> </code><code>④應用範圍比較廣,因為LVS工作在4層,是以它幾乎可以對所有應用做負載均衡,包括http、資料庫、線上聊天室等等。</code>
<code>LVS的缺點是:</code>
<code> </code><code>軟體本身不支援正規表達式處理,不能做動靜分離;而現在許多網站在這方面都有較強的需求,這個是Nginx</code><code>/HAProxy</code><code>+Keepalived的優勢所在。</code>
<code> </code><code>如果是網站應用比較龐大的話,LVS</code><code>/DR</code><code>+Keepalived實施起來就比較複雜了,特别後面有Windows Server的機器的話,如果實施及配置還有維護過程就比較複雜了,相對而言,Nginx</code><code>/HAProxy</code><code>+Keepalived就簡單多了。</code>
####################################################《HAPpronxy篇》##############################################################
24
25
26
27
<code>HAProxy的特點是:</code>
<code> </code><code>①HAProxy也是支援虛拟主機的。</code>
<code> </code><code>②HAProxy的優點能夠補充Nginx的一些缺點,比如支援Session的保持,Cookie的引導;同時支援通過擷取指定的url來檢測後端伺服器的狀态。</code>
<code> </code><code>③HAProxy跟LVS類似,本身就隻是一款負載均衡軟體;單純從效率上來講HAProxy會比Nginx有更出色的負載均衡速度,在并發處理上也是優于Nginx的。</code>
<code> </code><code>④HAProxy支援TCP協定的負載均衡轉發,可以對MySQL讀進行負載均衡,對後端的MySQL節點進行檢測和負載均衡,大家可以用LVS+Keepalived對MySQL主從做負載均衡。</code>
<code> </code><code>⑤HAProxy負載均衡政策非常多,HAProxy的負載均衡算法現在具體有如下8種:</code>
<code> </code><code>roundrobin,表示簡單的輪詢,這個不多說,這個是負載均衡基本都具備的;</code>
<code> </code><code>static-rr,表示根據權重,建議關注;</code>
<code> </code><code>leastconn,表示最少連接配接者先處理,建議關注;</code>
<code> </code><code>source</code><code>,表示根據請求源IP,這個跟Nginx的IP_hash機制類似,我們用其作為解決session問題的一種方法,建議關注;</code>
<code> </code><code>ri,表示根據請求的URI;</code>
<code> </code><code>rl_param,表示根據請求的URl參數’balance url_param’ requires an URL parameter name;</code>
<code> </code><code>hdr(name),表示根據HTTP請求頭來鎖定每一次HTTP請求;</code>
<code> </code><code>rdp-cookie(name),表示根據據cookie(name)來鎖定并哈希每一次TCP請求。</code>
########################################################《Nginx對比LVS》#########################################################
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<code> </code><code>Nginx工作在網絡的7層,是以它可以針對http應用本身來做分流政策,比如針對域名、目錄結構等,相比之下LVS并不具備這樣的功能,是以</code>
<code>Nginx單憑這點可利用的場合就遠多于LVS了;但Nginx有用的這些功能使其可調整度要高于LVS,是以經常要去觸碰觸碰,觸碰多了,人為出問題的幾</code>
<code>率也就會大。</code>
<code> </code><code>Nginx對網絡穩定性的依賴較小,理論上隻要</code><code>ping</code><code>得通,網頁通路正常,Nginx就能連得通,這是Nginx的一大優勢!Nginx同時還能區分内外網,</code>
<code>如果是同時擁有内外網的節點,就相當于單機擁有了備份線路;LVS就比較依賴于網絡環境,目前來看伺服器在同一網段内并且LVS使用direct方式分</code>
<code>流,效果較能得到保證。另外注意,LVS需要向托管商至少申請多一個ip來做Visual IP,貌似是不能用本身的IP來做VIP的。要做好LVS管理者,确實</code>
<code>得跟進學習很多有關網絡通信方面的知識,就不再是一個HTTP那麼簡單了。</code>
<code> </code><code>Nginx安裝和配置比較簡單,測試起來也很友善,因為它基本能把錯誤用日志列印出來。LVS的安裝和配置、測試就要花比較長的時間了;LVS對</code>
<code>網絡依賴比較大,很多時候不能配置成功都是因為網絡問題而不是配置問題,出了問題要解決也相應的會麻煩得多。</code>
<code> </code><code>Nginx也同樣能承受很高負載且穩定,但負載度和穩定度差LVS還有幾個等級:Nginx處理所有流量是以受限于機器IO和配置;本身的bug也還是難</code>
<code>以避免的。</code>
<code> </code><code>Nginx可以檢測到伺服器内部的故障,比如根據伺服器處理網頁傳回的狀态碼、逾時等等,并且會把傳回錯誤的請求重新送出到另一個節點。目</code>
<code>前LVS中 ldirectd也能支援針對伺服器内部的情況來監控,但LVS的原理使其不能重發請求。比如使用者正在上傳一個檔案,而處理該上傳的節點剛好</code>
<code>在上傳過程中出現故障,Nginx會把上傳切到另一台伺服器重新處理,而LVS就直接斷掉了,如果是上傳一個很大的檔案或者很重要的檔案的話,使用者</code>
<code>可能會是以而惱火。</code>
<code> </code><code>Nginx對請求的異步處理可以幫助節點伺服器減輕負載,假如使用apache直接對外服務,那麼出現很多的窄帶連結時apache伺服器将會占用大 量</code>
<code>記憶體而不能釋放,使用多一個Nginx做apache代理的話,這些窄帶連結會被Nginx擋住,apache上就不會堆積過多的請求,這樣就減少了相當多的資源</code>
<code>占用。這點使用squid也有相同的作用,即使squid本身配置為不緩存,對apache還是有很大幫助的。</code>
<code> </code><code>Nginx能支援http、https和email(email的功能比較少用),LVS所支援的應用在這點上會比Nginx更多。在使用上,一般最前端所采取的政策應</code>
<code>是LVS,也就是DNS的指向應為LVS均衡器,LVS的優點令它非常适合做這個任務。重要的ip位址,最好交由LVS托管,比如資料庫的 ip、webservice服</code>
<code>務器的ip等等,這些ip位址随着時間推移,使用面會越來越大,如果更換ip則故障會接踵而至。是以将這些重要ip交給 LVS托管是最為穩妥的,這樣</code>
<code>做的唯一缺點是需要的VIP數量會比較多。</code>
<code> </code><code>Nginx可作為LVS節點機器使用,一是可以利用Nginx的功能,二是可以利用Nginx的性能。當然這一層面也可以直接使用squid,squid的功能方面</code>
<code>就比Nginx弱不少了,性能上也有所遜色于Nginx。Nginx也可作為中層代理使用,這一層面Nginx基本上無對手,唯一可以撼動Nginx的就隻有</code>
<code> </code><code>lighttpd了,不過lighttpd目前還沒有能做到 Nginx完全的功能,配置也不那麼清晰易讀。另外,中層代理的IP也是重要的,是以中層代理也擁</code>
<code>有一個VIP和LVS是最完美的方案了。具體的應用還得具體分析,如果是比較小的網站(日PV小于1000萬),用Nginx就完全可以了,如果機器也不少</code>
<code>,可以用DNS輪詢,LVS所耗費的機器還是比較多的;大型網站或者重要的服務,機器不發愁的時候,要多多考慮利用LVS。</code>
本文轉自 小小三郎1 51CTO部落格,原文連結:http://blog.51cto.com/wsxxsl/1893144,如需轉載請自行聯系原作者