什么是負(fù)載均衡
負(fù)載均衡主要通過專門的硬件設(shè)備或者通過軟件算法實(shí)現(xiàn)。通過硬件設(shè)備實(shí)現(xiàn)的負(fù)載均衡效果好、效率高、性能穩(wěn)定,但是成本比較高。通過軟件實(shí)現(xiàn)的負(fù)載均衡主要依賴于均衡算法的選擇和程序的健壯性。均衡算法也是多種多樣的,常見的有兩大類:即靜態(tài)負(fù)載均衡算法和動(dòng)態(tài)負(fù)載均衡算法。靜態(tài)算法實(shí)現(xiàn)比較簡單,在一般網(wǎng)絡(luò)環(huán)境下也能達(dá)到比較好的效果,主要有一般輪詢算法、基于比率的加權(quán)輪詢算法以及基于優(yōu)先級(jí)的加權(quán)輪詢算法等。動(dòng)態(tài)負(fù)載均衡算法在較為復(fù)雜的網(wǎng)絡(luò)環(huán)境中適應(yīng)性更強(qiáng),效果更好,主要有基于任務(wù)量的最少連接優(yōu)先算法、基于性能的最快響應(yīng)優(yōu)先算法、預(yù)測算法及動(dòng)態(tài)性能分配算法等。
網(wǎng)絡(luò)負(fù)載均衡技術(shù)的大致原理是利用一定的分配策略將網(wǎng)絡(luò)負(fù)載平衡地分?jǐn)偟骄W(wǎng)絡(luò)集群的各個(gè)操作單元上,使得單個(gè)重負(fù)載任務(wù)能夠分擔(dān)到多個(gè)單元上并行處理,或者使得大量并發(fā)訪問或數(shù)據(jù) 流量分擔(dān)到多個(gè)單元上分別處理,從而減少用戶的等待響應(yīng)時(shí)間。
Nginx服務(wù)器負(fù)載均衡配置
Nginx服務(wù)器實(shí)現(xiàn)了靜態(tài)的基于優(yōu)先級(jí)的加權(quán)輪詢算法,主要使用的配置是proxy_pass指令和upstream指令,這些內(nèi)容實(shí)際上很容易理解,關(guān)鍵點(diǎn)在于Nginx服務(wù)器的配置靈活多樣,如何在配置負(fù)載均衡的同時(shí)合理地整合其他功能,形成一套可以滿足實(shí)際需求的配置方案。
下面的有一些基礎(chǔ)示例片段,當(dāng)然不可能將所有的配置情況包括在內(nèi),希望能夠起到拋磚引玉的效果,同時(shí)也需要大家在實(shí)際應(yīng)用過程中多總結(jié)多積累。在配置中需要注意的地方將以注釋的形式添加。
配置實(shí)例一:對(duì)所有請(qǐng)求實(shí)現(xiàn)一般輪詢規(guī)則的負(fù)載均衡
在以下實(shí)例片段中,backend服務(wù)器組中所有服務(wù)器的優(yōu)先級(jí)全部配置為默認(rèn)的weight=1,這樣它們會(huì)按照一般輪詢策略依次接收請(qǐng)求任務(wù)。該配置是一個(gè)最簡單的實(shí)現(xiàn)Nginx服務(wù)器負(fù)載均衡的配置。所有訪問www.myweb.name 的請(qǐng)求都會(huì)在backend服務(wù)器組中實(shí)現(xiàn)負(fù)載均衡。實(shí)例代碼如下:
配置實(shí)例二:對(duì)所有請(qǐng)求實(shí)現(xiàn)加權(quán)輪詢規(guī)則的負(fù)載均衡
與“配置實(shí)例一”相比,在該實(shí)例片段中,backend服務(wù)器組中的服務(wù)器被賦予了不同的優(yōu)先級(jí)別,weight變量的值就是輪詢策略中的“權(quán)值”。其中,192.168.1.2:80的級(jí)別最高,優(yōu)先接收和處理客戶端請(qǐng)求;192.168.1.4:80的級(jí)別最低,是接收和處理客戶端請(qǐng)求最少的服務(wù)器,192.168.1.3:80將介于以上兩者之間。所有訪問www.myweb.name的請(qǐng)求都會(huì)在backend服務(wù)器組中實(shí)現(xiàn)加權(quán)負(fù)載均衡。實(shí)例代碼如下:
配置實(shí)例三:對(duì)特定資源實(shí)現(xiàn)負(fù)載均衡
在該實(shí)例片段中,我們設(shè)置了兩組被代理的服務(wù)器組,名為“videobackend”的一組用于對(duì)請(qǐng)求video資源的客戶端請(qǐng)求進(jìn)行負(fù)載均衡,另一組用于對(duì)請(qǐng)求filed資源的客戶端請(qǐng)求進(jìn)行負(fù)載均衡。所有對(duì)“http://www.mywebname/video/* ”的請(qǐng)求都會(huì)在videobackend服務(wù)器組中獲得均衡效果,所有對(duì)“http://www.mywebname/file/* ”的請(qǐng)求都會(huì)在filebackend服務(wù)器組中獲得均衡效果。該實(shí)例中展示的是實(shí)現(xiàn)一般負(fù)載均衡的配置,對(duì)于加權(quán)負(fù)載均衡的配置可以參考“配置實(shí)例二”。
在location /file/ {……}塊中,我們將客戶端的真實(shí)信息分別填充到了請(qǐng)求頭中的“Host”、“X-Real-IP”和“X-Forwareded-For”頭域,這樣后端服務(wù)器組收到的請(qǐng)求中就保留了客戶端的真實(shí)信息,而不是Nginx服務(wù)器的信息。實(shí)例代碼如下:
配置實(shí)例四:對(duì)不同域名實(shí)現(xiàn)負(fù)載均衡
在該實(shí)例片段中,我們設(shè)置了兩個(gè)虛擬服務(wù)器和兩組后端代理的服務(wù)器組,分別用來接收不同的域名請(qǐng)求和對(duì)這些請(qǐng)求進(jìn)行負(fù)載均衡處理。如果客戶端請(qǐng)求域名為“home.myweb.name”,則服務(wù)器server1接收并轉(zhuǎn)向homebackend服務(wù)器組進(jìn)行負(fù)載均衡處理;如果客戶端請(qǐng)求域名為“bbs.myweb.name”,則由服務(wù)器server2接收bbsbackend服務(wù)器級(jí)進(jìn)行負(fù)載均衡處理。這樣就實(shí)現(xiàn)了對(duì)不同域名的負(fù)載均衡。
需要注意兩組后端服務(wù)器組中有一臺(tái)服務(wù)器server 192.168.1.4:80是公用的。在該服務(wù)器上需要部署兩個(gè)域名下的所有資源才能保證客戶端請(qǐng)求不會(huì)出現(xiàn)問題。實(shí)例代碼如下:
配置實(shí)例五:實(shí)現(xiàn)帶有URL重寫的負(fù)載均衡
首先,我們來看具體的源碼,這是在實(shí)例一的基礎(chǔ)上做的修改:
該實(shí)例片段與“配置一”相比,增加了對(duì)URI包含“/file/”的URL重寫功能。例如客戶端請(qǐng)求的URL為“http://www.myweb.name/file/downlaod/media/1.mp3 ”時(shí),該虛擬服務(wù)器首先使用location file/ {……}塊轉(zhuǎn)發(fā)到后端的backend服務(wù)器組中實(shí)現(xiàn)負(fù)載均衡。這樣,就車輕而易舉地實(shí)現(xiàn)了帶有URL重寫功能的負(fù)載均衡。在該配置方案中,一定要掌握清楚rewrite指令中l(wèi)ast標(biāo)記和break標(biāo)記的區(qū)別,才能達(dá)到預(yù)計(jì)的效果。
以上5個(gè)配置實(shí)例展示了Nginx服務(wù)器實(shí)現(xiàn)不同情況下負(fù)載均衡配置的基本方法。由于Nginx服務(wù)器的功能在結(jié)構(gòu)上是增量式的,因此 ,我們可以在這些配置的基礎(chǔ)上繼續(xù)添加更多功能,比如Web緩存等功能,以及Gzip壓縮技術(shù)、身份認(rèn)證、權(quán)限管理等。同時(shí)在使用upstream指令配置服務(wù)器組時(shí),可以充分發(fā)揮各個(gè)指令的功能,配置出滿足需求、高效穩(wěn)定、功能豐富的Nginx服務(wù)器。