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