什麼是負載均衡?
生活案列
技術領域
負載均衡的種類
-
配置簡單,無成本費用 -
將負載均衡的工作交給了DNS服務器,省去了管理的麻煩。
-
記錄的添加與修改是需要一定時間才能夠生效的(因爲DNS緩存了A記錄)。一旦有一臺服務器壞了需要下線,即使修改了A記錄,要使其生效也需要較長的時間,這段時間,DNS仍然會將域名解析到已下線的服務器上,最終導致用戶訪問失敗。 -
不能按需分配負載,DNS並不知道各服務器的真實負載情況,所以負載效果不是很好
硬件負載均衡
-
功能強大:全面支持各層級的負載均衡,支持各種負載均衡算法,支持全局負載均衡。 -
性能好:一般軟件負載均衡能支撐10w+併發已經很不錯了,但是硬件的負載均衡卻可以支持100w+以上的併發。 -
高穩定性:因爲是商業品,所以經過了良好嚴格的測試,經過大規模的使用,所以穩定非常高。 -
安全性高:硬件負載均衡設備除了能處理負載均衡以外,還具有防火牆、防DDOS攻擊等效果。
-
價格昂貴:我記得之前銀行購買F5花了上百萬,據說還有更貴的,所以價格可想而知。 -
擴展性不好:硬件設備可以根據業務進行配置,但無法進行擴展和定製化。
軟件負載均衡
-
nginx由C編寫,同樣的web服務器,佔用的資源和內存低性能高。 -
當啓動nginx服務器,會生成一個master進程,master進程會fork出多個worker進程,由worker線程處理客戶端的請求。 -
nginx支持高併發,每個worker子進程是獨立平等的,當有客戶端請求時,worker進程公平競爭,搶到的worker進程會把請求提交給後端服務器,當後端服務器沒有及時響應時,此worker進程會繼續接收下一個request,當上一個請求有響應後會觸發事件,此worker進程繼續之前的執行,知道響應結束。一個request不會被兩個worker進程執行。 -
nginx支持反向代理(用戶有感知的訪問叫正向代理如使用vpn訪問youtube,用戶無感知訪問叫反向代理如負載均衡),支持7層負載均衡(拓展負載均衡的好處)。 -
nginx是異步非阻塞型處理請求(第三點印證),採用的epollandqueue模式,apache是阻塞型處理請求。 -
nginx處理靜態文件速度快(原因: -
nginx高度模塊化,配置簡單。 -
nginx是單進程多線程)。
-
對比apache不穩定,由於是單進程多線程,進程死掉會影響很多用戶。
負載均衡有什麼用?
-
**「流量分發」**負載均衡能對多臺主機流量進行分發,提高用戶系統的業務處理能力,提升服務可用性 -
**「會話保持」**在會話週期內,會話保持可使來自同一IP或網段的請求被分發到同一臺後端服務器上。 -
**「健康檢查」**支持自定義健康檢查方式和頻率,可定時檢查後端主機運行狀態,提供故障轉移,實現高可用; -
**「負載均衡」**解決併發壓力,提高應用處理性能(增加吞吐量,加強網絡處理能力); -
提高擴展性通過添加或減少服務器數量,提供網站伸縮性(擴展性); -
提高安全性安全防護,在負載均衡器上做一些過濾,黑白名單、防盜鏈等處理;
常用負載均衡算法
輪訓
加權輪訓
負載最低優先
-
LVS這種4層網絡負載均衡設備,可以以連接數來判斷服務器的狀態,服務器連接數量越大,表明服務器壓力就越大。 -
Nginx這種7層網絡負載均衡系統,可以以HTTP請求數量判斷服務器的狀態(Nginx內置的負載均衡算法不支持這種方式,需要自行進行擴展)。 -
如果我們是自己研發負載均衡系統,可以根據業務特點來選擇衡量系統壓力的指標。如果CPU是密集型,可以以CPU負載來衡量系統的壓力;如果是IO密集型,則可以以IO負載來衡量系統壓力。
-
最少鏈接數優先的算法要求負載系統統計每個服務器當前簡歷的鏈接,其應用場景僅限於負載均衡接收的任何請求都會轉發給服務器進行處理,否則如果負載均衡系統和服務之間是固定的連接池方式,就不適合採取這種算法。LVS可以採取這種算法進行負載均衡,而一個通過連接池的方式鏈接數據庫Mysql集羣的負載均衡系統就不適合採取這種算法進行負載均衡了。 -
CPU負載均衡最低優先的算法要求負載均衡系統以某種方式收集每個服務器的CPU的具體負載情況,同時要確定是以一分鐘的負載標準,還是以10分鐘、15分鐘的負載標準,不存在1分鐘肯定比15分鐘的好或差。不同業務最優的時間間隔也是不一樣的,時間間隔太短容易造成頻繁波動,時間太長可能造成峯值來臨時響應緩慢。
性能最優
-
負載均衡系統需要收集每次請求的響應時間,如果在大量請求處理的場景下,這種收集再加上響應時間的統計本身也會消耗系統的性能。 -
爲了減少這種統計上的消耗,可以採取採樣的方式進行統計,即就是不用很完全的去統計所有服務器的所有請求時間,而是抽樣統計部分任務的響應時間來估算整體請求所花的響應時間。採樣統計雖然能減輕性能的消耗,但使得實現的複雜度增加了很多,因爲要確定合適的採樣率,採樣率太低會導致數據的正確性,採樣率高同樣會造成性能的消耗,要找到一個合適的採樣率的複雜度也是可想而知的。 -
無論全部統計,還是採樣統計,都需要選擇合適的週期,是30秒性能最優還是1分鐘最優?目前是沒有標準的週期,都是需要具體業務場景進行決策,是不是感覺到了其複雜性,尤其是線上系統需要不斷的調試,然後找出相對合適的標準。
Hash類
-
源地址Hash:將來源於同一個IP地址的請求分配給同一個服務器進行處理,適合於存在事務、會話的業務。例如:當我們通過瀏覽器登錄網上銀行時,會生成一個會話信息,這個會話是臨時的,關閉瀏覽器後就會失效。網上銀行後臺無須持久會話信息,只需要在某臺服務器臨時保留這個會話就可以了,但需要保證用戶在會話存在期間,每次請求都能訪問在同一個服務器,這種業務場景就是通過源地址hash來實現的。 -
ID hash :將某個ID表示的業務分配到同一臺服務器上進行處理,比如:userId session id。上述的網上銀行登錄的例子,用session id hash可以實現同一個會話期間,用戶每次都是訪問同一臺服務器上的目的。
負載均衡算法應用
-
Random LoadBalance(隨機算法,默認) -
RoundRobin LoadBalance(權重輪訓算法) -
LeastAction LoadBalance(最少活躍調用數算法) -
ConsistentHash LoadBalance(一致性Hash法)
upstream bakend {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}
upstream bakend {
server 192.168.0.14:88;
server 192.168.0.15:80;
upstream backend {
server server1;
server server2;
總結
都收藏了,就點個「在看」支持一下吧!
點下在看,你最好看
本文分享自微信公衆號 - 俠夢的開發筆記(xmdevnote)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。