負載均衡(Load Balancing)學習筆記(一)

概述

在分佈式系統中,負載均衡(Load Balancing)是一種將任務分派到多個服務端進程的方法。例如,將一個HTTP請求派發到實際的Web服務器中執行的過程就涉及負載均衡的實現。一個HTTP請求到達Web服務器,這中間涉及多個過程,也存在多種不同負載均衡的方法。本文講述負載均衡的基本原理與派發策略,下圖1是負載均衡的基本原理圖,圖1中客戶端的請求請求經過達負載均衡器(Load Balancer)的分派,被指定的服務器進程進行處理。

圖1:負載均衡基本原理

實現負載均衡主要有兩個目的。第一個目的是將任務的處理負載均攤到不同的進程,以減少單一進程的負載,以達到處理能力水平擴容的目的。第二個目的則是提高容錯能力。我們知道,在線上正式環境中,機器宕機或者進程異常導致服務不可用是常有的現象。在實現負載均衡的系統中,多個服務器進程提供同樣的服務,一個進程不可用的情況下,任務會被負載均衡器派發到其他可用的進程,以達到高可用的目的。在多臺不同的服務器中部署相同的服務進程,通過負載均衡對外提供服務,這組進程也稱爲“集羣”(cluster)。

負載均衡實現策略

常見的負載均衡實現策略有以下幾種:

  • 均勻派發(Even Task Distribution Scheme)
  • 加權派發(Weighted Task Distribution Scheme)
  • 粘滯會話(Sticky Session Scheme)
  • 均勻任務隊列派發(Even Size Task Queue Distribution Scheme)
  • 單一隊列(Autonomous Queue Scheme)

均勻派發(Even Task Distribution Scheme)

均勻派發是實現負載均衡最簡單的策略,均衡派發的意思是指任務將均勻地派發到所有的服務器進程。在實現時,可以使用隨機派發或者輪流派發(Round Robin)。


圖2:均勻派發策略

均勻派發策略假設集羣內所有進程具有相同的處理能力,且任務處理用時相同。但實際上,由於進程部署環境的不同,其處理能力一般不同,任務處理時間也不盡相同。因此均勻派發的策略並不能很好地將任務負載均灘到各個進程中。

DNS負載均衡

我們知道,DNS提供域名解析服務,當我們訪問某個站點時,實際上首先需要通過該站點域名的DNS服務器來獲取指向該域名的IP地址,在這過程中,DNS服務器完成了域名到IP地址的映射。由於這一映射可以是一對多的關係,因此DNS服務器可以充當負載均衡器的作用,DNS服務器在派發IP地址時,正是使用輪流派發的方式來實現的。

加權派發(Weighted Task Distribution Scheme)

加權派發策略在派發任務時,會賦予服務器進程一個權值,即不同的進程會接受不同數量的任務,具體數量爲權值確定。


圖3:加權派發策略

例如,三個進程的處理任務的能力比率爲3:3:2,那麼可以賦予這三個進程3:3:2的權值,即每8個任務中,3個發派給第一個進程,3個發派給第二個進程,2個分派給第三個進程。
加權派發策略考慮了進程處理能力的不同,因此更接近實際的應用。可是,加權派發策略也沒有考慮任務處理的要求。

粘滯會話(Sticky Session Scheme)

前面兩種負載均衡策略並沒有考慮任務之間的依賴關係,在實際中,後面的任務處理常常會依賴於前面的任務。例如,對於同一個登錄的用戶的請求,用戶購買的請求依賴於用戶登錄的請求,如果用戶的登錄信息保存在進程1中,那麼,如果購買請求被分派到進程2或者進程3,那麼購買請求將不能正確處理。這種請求間的依賴關係也稱爲粘滯會話(Sticky Session),負載均衡策略需要考慮粘滯會話的情況。


圖4:粘滯會話策略

粘滯會話的派發策略要求屬於同一個會話的任務將會被分派到同一個進程中。雖然這可以正確處理任務,但是卻帶來任務派發不均勻的問題,因爲一些會話可能包含更多的任務,一些會話包含更少的任務。
粘滯會話的另一種處理策略是使用數據庫或者緩存,將所有會話數據存儲到數據庫或者緩存中。集羣內所有進程都可以通過訪問數據庫或者緩存來獲取會話數據,進程內存都不保存會話數據,這樣,負載均衡器便可以使用前面介紹的策略來派發任務。

均勻任務隊列派發(Even Size Task Queue Distribution Scheme)

均勻任務隊列派發策略跟加權派發策略類似,都考慮了進程的處理能力,不過其實現方式不同。在均勻隊列派發策略下,負載均衡器爲每個進程都創建一個大小相等的任務隊列,這些任務隊列包含了對應進程需要處理的任務。任務處理快的進程,其隊列也會減少得快,這樣負載均衡器會派發更多的任務給這個進程;相應地,任務處理慢的進程,其隊列也會減少得慢,這樣負載均衡器會派發更少的任務給這個進程。因此,通過這些任務隊列,負載均衡器在派發任務時將進程處理任務的能力因素考慮了進去。


圖5:均勻任務隊列派發策略

單一隊列(Autonomous Queue Scheme)

與上面的均勻隊列策略一樣,單一隊列策略也使用了隊列來實現負載均衡。不同的是,單一隊列策略只使用了一個隊列。圖6是單一隊列策略的原理圖。


圖6:單一隊列策略

單一隊列策略中,實際上並沒有負載均衡器的存在。所有的服務器進程從隊列中取出任務執行,如果某個進程出現宕機的情況,那麼其他進程仍然可以繼續執行任務。這樣一來,任務隊列並不需要知道服務進程的情況,只需要服務進程知道自己的任務隊列,並不斷執行任務即可。
單一隊列策略實際上也考慮到進程的處理能力,進程處理任務得越快,其從隊列取出任務的速度也越快。

總結

由於負載均衡爲系統提供了水平擴展的能力以及提高了系統的高可用性,因此,負載均衡在分佈式系統中的作用可謂十分重要。在實際使用中,我們可以充分利用一些已有的負載均衡硬件或者軟件爲我們實現負載均衡。硬件方面有F5,A10,軟件方面有Nginx,HAProxy,LVS等。即使是自己實現,也可以考慮現有的開源軟件,比如任務隊列可以使用RabbitMQ,等。與其重複造輪子,不如先站在巨人的肩膀上:)

參考資料

    1. http://tutorials.jenkov.com/software-architecture/load-balancing.html
    2. http://www.oschina.net/news/77156/load-balance
    3. http://nginx.org/en/docs/http/load_balancing.html
    4. 構建高性能Web站點,第十二章,郭欣著,2012年6月,第二版

 

注:轉載自https://leehao.me

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章