負載均衡 (Load Balancing)

負載平衡(Load balancing)是一種計算機技術,用來在多個計算機(計算機集群)、網絡連接、CPU、磁盤驅動器或其他資源中分配負載,以達到最優化資源使用、最大化吞吐率、最小化響應時間、同時避免過載的目的。 使用帶有負載平衡的多個服務器組件,取代單一的組件,可以通過冗餘提高可靠性。負載平衡服務通常是由專用軟件和硬件來完成。 主要作用是將大量作業合理地分攤到多個操作單元上進行執行,用於解決互聯網架構中的高併發和高可用的問題。

簡而言之,我們不使用負載均衡的網絡服務,只有一個服務器,這個服務器承擔著所有的任務。如果突然訪問量很大,可能會達到服務器的處理能力上限,會變得卡頓;如果服務器突然碰上了內部錯誤,死機後則會導致所有的用戶都無法繼續訪問服務。

負載均衡 (Load Balancing)

如果說一臺網頁服務器 server_1.mcoder.cc 192.168.1.100 可以同時提供一百萬的用戶訪問,那麼當同時訪問的用戶量達到一百五十萬時,這個網頁服務器變會碰上性能瓶頸,可能所有用戶的體驗都不夠好。這時我們可以選擇簡單的增加一臺服務器 server_2.mcoder.cc 192.168.1.101 ,對用戶進行分流,如果兩臺機器均分用戶,則每臺只用服務七十五萬的用戶,在網頁服務器的能力範圍內,所有用戶都能獲得很好的體驗。而如何讓用戶選擇哪個服務器提供服務便是負載均衡服務器做的工作。負載均衡服務器對外僅是一臺服務器 server.mcoder.cc 192.168.1.99 ,他會選擇將用戶的請求轉發給 server_1 或者 server_2 。

負載均衡實現了數個服務器同時提供服務,減少了單一服務器的負載,使一組服務器處理能力得到提升。而且負載均衡提高了系統的容錯能力,帶來了服務可用性的提升,如果其中一臺服務器宕機後,還有服務器在正常工作,負載均衡服務器可以將後續的請求轉發給還在工作的服務器,將死機服務器剔除。

負載均衡 (Load Balancing)

目前幾乎所有的雲服務商都提供了負載均衡服務,如果使用諸如阿X雲、騰X雲的話,直接使用他們提供的負載均衡方案即可,簡單粗暴快捷。但我們可以瞭解下主流的負載均衡算法,對於配置服務以及後臺開發技術面試都有幫助的。

常見負載均衡算法

負載均衡算法決定了負載均衡服務器如何將一個請求分配給後面的諸多服務器。

  1. 輪詢算法(Round Robin)加權輪詢(Weight Round Robin)法 : 輪轉法意味著 LB 服務器會按順序將請求分發給服務器。比如負載均衡器會將第一個請求分配給第一個服務器,然後下一個請求分配給第二個服務器,這樣分配下去分配完一輪之後回到開頭分配給第一個服務器。

不同的服務器可能機器配置和當前系統的負載並不相同,因此它們的抗壓能力也不盡相同。給配置高、負載低的機器配置更高的權重,讓其處理更多的請求,而低配置、高負載的機器,則給其分配較低的權重,降低其系統負載。加權輪詢法可以很好地處理這一問題,並將請求順序按照權重分配到後端。

  1. 隨機法加權隨機(Weight Random)法 :很粗糙的方法,通過生成隨機數,將連接隨便轉發給後端的一個服務器,當訪問量加大,實際效果接近於平均分配流量到每一臺後端服務器,也就是輪詢的效果。

與加權輪詢法類似,加權隨機法也是根據後端服務器不同的配置和負載情況來配置不同的權重。不同的是,它是按照權重來隨機選擇服務器的,而不是順序。

  1. 最少連接(Least Connections) : 最少連接方法會選擇當前連接數量最少的服務器分發請求。

前面幾種方法費盡心思來實現服務消費者請求次數分配的均衡,當然這麼做是沒錯的,可以為後端的多臺服務器平均分配工作量,最大程度地提高服務器的利用率但是實際情況是否真的如此? 實際情況中,請求次數的均衡真的能代表負載的均衡嗎?這是一個值得思考的問題。上面的問題,再換一個角度來說就是:以後端服務器的視角來觀察系統的負載,而非請求發起方來觀察。最小連接數法便屬於此類。最小連接數算法比較靈活和智能,由於後端服務器的配置不盡相同,對於請求的處理有快有慢,它正是根據後端服務器當前的連接情況,動態地選取其中當前積壓連接數最少的一臺服務器來處理當前請求,儘可能地提高後端服務器的利用效率,將負載合理地分流到每一臺機器。

  1. Source 原地址法 : 源地址hash,新連接先按權重分配,後續連接按source分配請求。起到會話綁定的作用,但是調度粒度太粗,使用的少,相當於是ip_hash.

常見框架

NGINX

Nginx做為一個強大的Web服務器軟件,具有高性能、高併發性和低內存佔用的特點。此外,其也能夠提供強大的反向代理功能。Nginx工作在網絡的7層,可以針對http應用本身來做分流策略。支持七層HTTP、HTTPS協議的負載均衡。對四層協議的支持需要第三方插件-yaoweibin的ngx_tcp_proxy_module實現了tcp upstream。

NGINX 主要有五種負載均衡方法

<code># 不填參數時默認是 輪詢算法
least_conn; # 最少連接方法
ip_hash; # ip 方法
hash $request_uri consistent; # 哈希一致性方法
least_time header; # NGINX Plus 版本支持
random two least_time=last_byte; # 隨機算法/<code>

HaProxy

Haproxy是高可用代理軟件,它是一種比較流行的開源軟件,基於TCP(四層)/HTTP(七層)協議的負載均衡代理解決方案,可以在Linux、FreeBSD等平臺下運行,常見於跨多個服務器,比如:web、應用程序、數據庫、MQ消息隊列、MC數據庫等等。通過多個Haproxy服務來提高服務的性能和可靠性。他支持多種負載均衡方法,如下:

<code>1.balance roundrobin # 輪詢,軟負載均衡基本都具備這種算法
2.balance static-rr # 根據權重,建議使用
3.balance leastconn # 最少連接者先處理,建議使用
4.balance source # 根據請求源IP,建議使用
5.balance uri # 根據請求的URI
6.balance url_param,# 根據請求的URl參數'balance url_param' requires an URL parameter name
7.balance hdr(name) # 根據HTTP請求頭來鎖定每一次HTTP請求
8.balance rdp-cookie(name) # 根據據cookie(name)來鎖定並哈希每一次TCP請求/<code>


分享到:


相關文章: