1. 程式人生 > >如何處理負載、高併發?

如何處理負載、高併發?

  從低成本、高效能和高擴張性的角度來說有如下處理方案:

1、HTML靜態化

其實大家都知道,效率最高、消耗最小的就是純靜態化的html頁面,所以我們儘可能使我們的  網站上的頁面採用靜態頁面來實現,這個最簡單的方法其實也是最有效的方法。

2、圖片伺服器分離

        把圖片單獨儲存,儘量減少圖片等大流量的開銷,可以放在一些相關的平臺上,如騎牛等

3、資料庫叢集和庫表雜湊及快取

       資料庫的併發連線為100,一臺資料庫遠遠不夠,可以從讀寫分離、主從複製,資料庫叢集方面來著手。另外儘量減少資料庫的訪問,可以使用快取資料庫如memcache、redis。

4、映象:

       儘量減少下載,可以把不同的請求分發到多個映象端。

5、負載均衡:

   Apache的最大併發連線為1500,只能增加伺服器,可以從硬體上著手,如F5伺服器。當然硬體的成本比較高,我們往往從軟體方面著手。

   負載均衡 (Load Balancing) 建立在現有網路結構之上,它提供了一種廉價有效透明的方法擴充套件網路裝置和伺服器的頻寬、增加吞吐量、加強網路資料處理能力,同時能夠提高網路的靈活性和可用性。目前使用最為廣泛的負載均衡軟體是Nginx、LVS、HAProxy。我分別來說下三種的優缺點:

 Nginx的優點是:

1. 工作在網路的7層之上,可以針對http應用做一些分流的策略,比如針對域名、目錄結構,它的正則規則比HAProxy更為強大和靈活,這也是它目前廣泛流行的主要原因之一,Nginx單憑這點可利用的場合就遠多於LVS了。 

2. Nginx對網路穩定性的依賴非常小,理論上能ping通就就能進行負載功能,這個也是它的優勢之一;相反LVS對網路穩定性依賴比較大,這點本人深有體會; 

3. Nginx安裝和配置比較簡單,測試起來比較方便,它基本能把錯誤用日誌打印出來。LVS的配置、測試就要花比較長的時間了,LVS對網路依賴比較大。 

4. 可以承擔高負載壓力且穩定,在硬體不差的情況下一般能支撐幾萬次的併發量,負載度比LVS相對小些。 

5. Nginx可以通過埠檢測到伺服器內部的故障,比如根據伺服器處理網頁返回的狀態碼、超時等等,並且會把返回錯誤的請求重新提交到另一個節點,不過其中缺點就是不支援url來檢測。比如使用者正在上傳一個檔案,而處理該上傳的節點剛好在上傳過程中出現故障,Nginx會把上傳切到另一臺伺服器重新處理,而LVS就直接斷掉了,如果是上傳一個很大的檔案或者很重要的檔案的話,使用者可能會因此而不滿。 

6. Nginx不僅僅是一款優秀的負載均衡器/反向代理軟體,它同時也是功能強大的Web應用伺服器。LNMP也是近幾年非常流行的web架構,在高流量的環境中穩定性也很好。 

7. Nginx現在作為Web反向加速快取越來越成熟了,速度比傳統的Squid伺服器更快,可以考慮用其作為反向代理加速器。 

8. Nginx可作為中層反向代理使用,這一層面Nginx基本上無對手,唯一可以對比Nginx的就只有 lighttpd了,不過 lighttpd目前還沒有做到Nginx完全的功能,配置也不那麼清晰易讀,社群資料也遠遠沒Nginx活躍。 

9. Nginx也可作為靜態網頁和圖片伺服器,這方面的效能也無對手。還有Nginx社群非常活躍,第三方模組也很多。

Nginx的缺點是:

1. Nginx僅能支援http、https和Email協議,這樣就在適用範圍上面小些,這個是它的缺點。
2. 對後端伺服器的健康檢查,只支援通過埠來檢測,不支援通過url來檢測。不支援Session的直接保持,但能通過ip_hash來解決。

LVS:使用Linux核心叢集實現一個高效能、高可用的負載均衡伺服器,它具有很好的可伸縮性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。

LVS的優點是:

1. 抗負載能力強、是工作在網路4層之上僅作分發之用,沒有流量的產生,這個特點也決定了它在負載均衡軟體裡的效能最強的,對記憶體和cpu資源消耗比較低。
2. 配置性比較低,這是一個缺點也是一個優點,因為沒有可太多配置的東西,所以並不需要太多接觸,大大減少了人為出錯的機率。
3. 工作穩定,因為其本身抗負載能力很強,自身有完整的雙機熱備方案,如LVS+Keepalived,不過我們在專案實施中用得最多的還是LVS/DR+Keepalived。
4. 無流量,LVS只分發請求,而流量並不從它本身出去,這點保證了均衡器IO的效能不會受到大流量的影響。
5. 應用範圍比較廣,因為LVS工作在4層,所以它幾乎可以對所有應用做負載均衡,包括http、資料庫、線上聊天室等等。

LVS的缺點是:   

1. 軟體本身不支援正則表示式處理,不能做動靜分離;而現在許多網站在這方面都有較強的需求,這個是Nginx/HAProxy+Keepalived的優勢所在。
2. 如果是網站應用比較龐大的話,LVS/DR+Keepalived實施起來就比較複雜了,特別後面有 Windows Server的機器的話,如果實施及配置還有維護過程就比較複雜了,相對而言,Nginx/HAProxy+Keepalived就簡單多了。

HAProxy的特點是:   

1. HAProxy也是支援虛擬主機的。
2. HAProxy的優點能夠補充Nginx的一些缺點,比如支援Session的保持,Cookie的引導;同時支援通過獲取指定的url來檢測後端伺服器的狀態。
3. HAProxy跟LVS類似,本身就只是一款負載均衡軟體;單純從效率上來講HAProxy會比Nginx有更出色的負載均衡速度,在併發處理上也是優於Nginx的。
4. HAProxy支援TCP協議的負載均衡轉發,可以對MySQL讀進行負載均衡,對後端的MySQL節點進行檢測和負載均衡,大家可以用LVS+Keepalived對MySQL主從做負載均衡。
5. HAProxy負載均衡策略非常多,HAProxy的負載均衡演算法現在具體有如下8種:

① roundrobin,表示簡單的輪詢,這個不多說,這個是負載均衡基本都具備的;
② static-rr,表示根據權重,建議關注;
③ leastconn,表示最少連線者先處理,建議關注;
④ source,表示根據請求源IP,這個跟Nginx的IP_hash機制類似,我們用其作為解決session問題的一種方法,建議關注;
⑤ ri,表示根據請求的URI;
⑥ rl_param,表示根據請求的URl引數’balance url_param’ requires an URL parametername;
⑦ hdr(name),表示根據HTTP請求頭來鎖定每一次HTTP請求;
⑧ rdp-cookie(name),表示根據據cookie(name)來鎖定並雜湊每一次TCP請求。

Nginx和LVS對比的總結:   

1. Nginx工作在網路的7層,所以它可以針對http應用本身來做分流策略,比如針對域名、目錄結構等,相比之下LVS並不具備這樣的功能,所以Nginx單憑這點可利用的場合就遠多於LVS了;但Nginx有用的這些功能使其可調整度要高於LVS,所以經常要去觸碰觸碰,觸碰多了,人為出問題的機率也就會大。   

2. Nginx對網路穩定性的依賴較小,理論上只要ping得通,網頁訪問正常,Nginx就能連得通,這是Nginx的一大優勢!Nginx同時還能區分內外網,如果是同時擁有內外網的節點,就相當於單機擁有了備份線路;LVS就比較依賴於網路環境,目前來看伺服器在同一網段內並且LVS使用direct方式分流,效果較能得到保證。另外注意,LVS需要向託管商至少申請多一個ip來做Visual IP,貌似是不能用本身的IP來做VIP的。要做好LVS管理員,確實得跟進學習很多有關網路通訊方面的知識,就不再是一個HTTP那麼簡單了。

3. Nginx安裝和配置比較簡單,測試起來也很方便,因為它基本能把錯誤用日誌打印出來。LVS的安裝和配置、測試就要花比較長的時間了;LVS對網路依賴比較大,很多時候不能配置成功都是因為網路問題而不是配置問題,出了問題要解決也相應的會麻煩得多。 

4. Nginx也同樣能承受很高負載且穩定,但負載度和穩定度差LVS還有幾個等級:Nginx處理所有流量所以受限於機器IO和配置;本身的bug也還是難以避免的。 

5. Nginx可以檢測到伺服器內部的故障,比如根據伺服器處理網頁返回的狀態碼、超時等等,並且會把返回錯誤的請求重新提交到另一個節點。目前LVS中 ldirectd也能支援針對伺服器內部的情況來監控,但LVS的原理使其不能重發請求。比如使用者正在上傳一個檔案,而處理該上傳的節點剛好在上傳過程中出現故障,Nginx會把上傳切到另一臺伺服器重新處理,而LVS就直接斷掉了,如果是上傳一個很大的檔案或者很重要的檔案的話,使用者可能會因此而惱火。 

6. Nginx對請求的非同步處理可以幫助節點伺服器減輕負載,假如使用 apache直接對外服務,那麼出現很多的窄帶連結時apache伺服器將會佔用大量記憶體而不能釋放,使用多一個Nginx做apache代理的話,這些窄帶連結會被Nginx擋住,apache上就不會堆積過多的請求,這樣就減少了相當多的資源佔用。這點使用squid也有相同的作用,即使squid本身配置為不快取,對apache還是有很大幫助的。 

7. Nginx能支援http、https和email(email的功能比較少用),LVS所支援的應用在這點上會比Nginx更多。在使用上,一般最前端所採取的策略應是LVS,也就是DNS的指向應為LVS均衡器,LVS的優點令它非常適合做這個任務。重要的ip地址,最好交由LVS託管,比如資料庫的 ip、webservice伺服器的ip等等,這些ip地址隨著時間推移,使用面會越來越大,如果更換ip則故障會接踵而至。所以將這些重要ip交給 LVS託管是最為穩妥的,這樣做的唯一缺點是需要的VIP數量會比較多。Nginx可作為LVS節點機器使用,一是可以利用Nginx的功能,二是可以利用Nginx的效能。當然這一層面也可以直接使用squid,squid的功能方面就比Nginx弱不少了,效能上也有所遜色於Nginx。Nginx也可作為中層代理使用,這一層面Nginx基本上無對手,唯一可以撼動Nginx的就只有lighttpd了,不過lighttpd目前還沒有能做到 Nginx完全的功能,配置也不那麼清晰易讀。另外,中層代理的IP也是重要的,所以中層代理也擁有一個VIP和LVS是最完美的方案了。具體的應用還得具體分析,如果是比較小的網站(日PV小於1000萬),用Nginx就完全可以了,如果機器也不少,可以用DNS輪詢,LVS所耗費的機器還是比較多的;大型網站或者重要的服務,機器不發愁的時候,要多多考慮利用LVS。