负载均衡(转)
?
概述
在分布式系統(tǒng)中,負載均衡(Load Balancing)是一種將任務分派到多個服務端進程的方法。例如,將一個HTTP請求派發(fā)到實際的Web服務器中執(zhí)行的過程就涉及負載均衡的實現(xiàn)。一個HTTP請求到達Web服務器,這中間涉及多個過程,也存在多種不同負載均衡的方法。本文講述負載均衡的基本原理與派發(fā)策略,下圖1是負載均衡的基本原理圖,圖1中客戶端的請求請求經過達負載均衡器(Load Balancer)的分派,被指定的服務器進程進行處理。
圖1:負載均衡基本原理
?
實現(xiàn)負載均衡主要有兩個目的。第一個目的是將任務的處理負載均攤到不同的進程,以減少單一進程的負載,以達到處理能力水平擴容的目的。第二個目的則是提高容錯能力。我們知道,在線上正式環(huán)境中,機器宕機或者進程異常導致服務不可用是常有的現(xiàn)象。在實現(xiàn)負載均衡的系統(tǒng)中,多個服務器進程提供同樣的服務,一個進程不可用的情況下,任務會被負載均衡器派發(fā)到其他可用的進程,以達到高可用的目的。在多臺不同的服務器中部署相同的服務進程,通過負載均衡對外提供服務,這組進程也稱為“集群”(cluster)。
?
?
負載均衡實現(xiàn)策略
常見的負載均衡實現(xiàn)策略有以下幾種:?
- 均勻派發(fā)(Even Task Distribution Scheme)?
- 加權派發(fā)(Weighted Task Distribution Scheme)?
- 粘滯會話(Sticky Session Scheme)?
- 均勻任務隊列派發(fā)(Even Size Task Queue Distribution Scheme)?
- 單一隊列(Autonomous Queue Scheme)
?
均勻派發(fā)(Even Task Distribution Scheme)
均勻派發(fā)是實現(xiàn)負載均衡最簡單的策略,均衡派發(fā)的意思是指任務將均勻地派發(fā)到所有的服務器進程。在實現(xiàn)時,可以使用隨機派發(fā)或者輪流派發(fā)(Round Robin)。
圖2:均勻派發(fā)策略
均勻派發(fā)策略假設集群內所有進程具有相同的處理能力,且任務處理用時相同。但實際上,由于進程部署環(huán)境的不同,其處理能力一般不同,任務處理時間也不盡相同。因此均勻派發(fā)的策略并不能很好地將任務負載均灘到各個進程中。
DNS負載均衡
我們知道,DNS提供域名解析服務,當我們訪問某個站點時,實際上首先需要通過該站點域名的DNS服務器來獲取指向該域名的IP地址,在這過程中,DNS服務器完成了域名到IP地址的映射。由于這一映射可以是一對多的關系,因此DNS服務器可以充當負載均衡器的作用,DNS服務器在派發(fā)IP地址時,正是使用輪流派發(fā)的方式來實現(xiàn)的。
?
?
加權派發(fā)(Weighted Task Distribution Scheme)
加權派發(fā)策略在派發(fā)任務時,會賦予服務器進程一個權值,即不同的進程會接受不同數量的任務,具體數量為權值確定。
?
圖3:加權派發(fā)策略?
?
例如,三個進程的處理任務的能力比率為3:3:2,那么可以賦予這三個進程3:3:2的權值,即每8個任務中,3個發(fā)派給第一個進程,3個發(fā)派給第二個進程,2個分派給第三個進程。?
加權派發(fā)策略考慮了進程處理能力的不同,因此更接近實際的應用。可是,加權派發(fā)策略也沒有考慮任務處理的要求。
?
粘滯會話(Sticky Session Scheme)
前面兩種負載均衡策略并沒有考慮任務之間的依賴關系,在實際中,后面的任務處理常常會依賴于前面的任務。例如,對于同一個登錄的用戶的請求,用戶購買的請求依賴于用戶登錄的請求,如果用戶的登錄信息保存在進程1中,那么,如果購買請求被分派到進程2或者進程3,那么購買請求將不能正確處理。這種請求間的依賴關系也稱為粘滯會話(Sticky Session),負載均衡策略需要考慮粘滯會話的情況。
圖4:粘滯會話策略
粘滯會話的派發(fā)策略要求屬于同一個會話的任務將會被分派到同一個進程中。雖然這可以正確處理任務,但是卻帶來任務派發(fā)不均勻的問題,因為一些會話可能包含更多的任務,一些會話包含更少的任務。?
粘滯會話的另一種處理策略是使用數據庫或者緩存,將所有會話數據存儲到數據庫或者緩存中。集群內所有進程都可以通過訪問數據庫或者緩存來獲取會話數據,進程內存都不保存會話數據,這樣,負載均衡器便可以使用前面介紹的策略來派發(fā)任務。
?
均勻任務隊列派發(fā)(Even Size Task Queue Distribution Scheme)
均勻任務隊列派發(fā)策略跟加權派發(fā)策略類似,都考慮了進程的處理能力,不過其實現(xiàn)方式不同。在均勻隊列派發(fā)策略下,負載均衡器為每個進程都創(chuàng)建一個大小相等的任務隊列,這些任務隊列包含了對應進程需要處理的任務。任務處理快的進程,其隊列也會減少得快,這樣負載均衡器會派發(fā)更多的任務給這個進程;相應地,任務處理慢的進程,其隊列也會減少得慢,這樣負載均衡器會派發(fā)更少的任務給這個進程。因此,通過這些任務隊列,負載均衡器在派發(fā)任務時將進程處理任務的能力因素考慮了進去。
?
圖5:均勻任務隊列派發(fā)策略
?
單一隊列(Autonomous Queue Scheme)
與上面的均勻隊列策略一樣,單一隊列策略也使用了隊列來實現(xiàn)負載均衡。不同的是,單一隊列策略只使用了一個隊列。圖6是單一隊列策略的原理圖。
圖6:單一隊列策略
?
單一隊列策略中,實際上并沒有負載均衡器的存在。所有的服務器進程從隊列中取出任務執(zhí)行,如果某個進程出現(xiàn)宕機的情況,那么其他進程仍然可以繼續(xù)執(zhí)行任務。這樣一來,任務隊列并不需要知道服務進程的情況,只需要服務進程知道自己的任務隊列,并不斷執(zhí)行任務即可。?
單一隊列策略實際上也考慮到進程的處理能力,進程處理任務得越快,其從隊列取出任務的速度也越快。
?
總結
由于負載均衡為系統(tǒng)提供了水平擴展的能力以及提高了系統(tǒng)的高可用性,因此,負載均衡在分布式系統(tǒng)中的作用可謂十分重要。在實際使用中,我們可以充分利用一些已有的負載均衡硬件或者軟件為我們實現(xiàn)負載均衡。硬件方面有F5,A10,軟件方面有Nginx,HAProxy,LVS等。即使是自己實現(xiàn),也可以考慮現(xiàn)有的開源軟件,比如任務隊列可以使用RabbitMQ,等。與其重復造輪子,不如先站在巨人的肩膀上:)
?
參考資料
總結
- 上一篇: Django模板语言
- 下一篇: 趁webpack5还没出,先升级成web