在計(jì)算機(jī)的世界,這就是大家耳熟能詳?shù)呢?fù)載均衡(load balancing),所謂負(fù)載均衡,就是說如果一組計(jì)算機(jī)節(jié)點(diǎn)(或者一組進(jìn)程)提供相同的(同質(zhì)的)服務(wù),那么對(duì)服務(wù)的請(qǐng)求就應(yīng)該均勻的分?jǐn)偟竭@些節(jié)點(diǎn)上。
這里的服務(wù)是廣義的,可以是簡單的計(jì)算,也可能是數(shù)據(jù)的讀取或者存儲(chǔ)。負(fù)載均衡也不是新事物,這種思想在多核CPU時(shí)代就有了,只不過在分布式系統(tǒng)中,負(fù)載均衡更是無處不在,這是分布式系統(tǒng)的天然特性決定的,分布式就是利用大量計(jì)算機(jī)節(jié)點(diǎn)完成單個(gè)計(jì)算機(jī)無法完成的計(jì)算、存儲(chǔ)服務(wù),既然有大量計(jì)算機(jī)節(jié)點(diǎn),那么均衡的調(diào)度就非常重要。
負(fù)載均衡的意義在于,讓所有節(jié)點(diǎn)以最小的代價(jià)、最好的狀態(tài)對(duì)外提供服務(wù),這樣系統(tǒng)吞吐量最大,性能更高,對(duì)于用戶而言請(qǐng)求的時(shí)間也更小。而且,負(fù)載均衡增強(qiáng)了系統(tǒng)的可靠性,最大化降低了單個(gè)節(jié)點(diǎn)過載、甚至crash的概率。
不難想象,如果一個(gè)系統(tǒng)絕大部分請(qǐng)求都落在同一個(gè)節(jié)點(diǎn)上,那么這些請(qǐng)求響應(yīng)時(shí)間都很慢,而且萬一節(jié)點(diǎn)降級(jí)或者崩潰,那么所有請(qǐng)求又會(huì)轉(zhuǎn)移到下一個(gè)節(jié)點(diǎn),造成雪崩。
回答可以如下:
在nginx里面配置一個(gè)upstream,然后把相關(guān)的服務(wù)器ip都配置進(jìn)去。然后采用輪詢的方案,然后在nginx里面的配置項(xiàng)里,proxy-pass指向這個(gè)upstream,這樣就能實(shí)現(xiàn)負(fù)載均衡。
nginx的負(fù)載均衡有4種模式:
1)、輪詢(默認(rèn))
每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器down掉,能自動(dòng)剔除。
2)、weight
指定輪詢幾率,weight和訪問比率成正比,用于后端服務(wù)器性能不均的情況。
3)、ip_hash
每個(gè)請(qǐng)求按訪問ip的hash結(jié)果分配,這樣每個(gè)訪客固定訪問一個(gè)后端服務(wù)器,可以解決session的問題。
4)、fair , url_hash(第三方)
按后端服務(wù)器的響應(yīng)時(shí)間來分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配。
負(fù)載均衡配置方法
打開nginx.conf文件,在http節(jié)點(diǎn)下添加upstream節(jié)點(diǎn):
upstream webname { server 192.168.0.1:8080; server 192.168.0.2:8080; }
其中webname是自己取的名字,最后會(huì)通過這個(gè)名字在url里訪問的,像上面這個(gè)例子一樣什么都不加就是默認(rèn)的輪詢,第一個(gè)請(qǐng)求過來訪問第一個(gè)server,第二個(gè)請(qǐng)求來訪問第二個(gè)server。依次輪著來。
upstream webname { server 192.168.0.1:8080 weight 2; server 192.168.0.2:8080 weight 1; }
這個(gè)weight也很好理解,權(quán)重大的被訪問的概率就大,上面這個(gè)例子的話,訪問2次server1,訪問一次server2
upstream webname { ip_hash; server 192.168.0.1:8080; server 192.168.0.2:8080; }
ip_hash的配置也很簡單,直接加一行就可以了,這樣只要是同一個(gè)ip過來的都會(huì)到同一臺(tái)server上。然后在server節(jié)點(diǎn)下進(jìn)行配置:
location /name { proxy_pass http://webname/name/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }
proxy_pass里面用上面配的webname代替了原來的ip地址。
這樣就基本完成了負(fù)載均衡的配置。
下面是主備的配置:
還是在upstream里面
upstream webname { server 192.168.0.1:8080; server 192.168.0.2:8080 backup; }
設(shè)置某一個(gè)節(jié)點(diǎn)為backup,那么一般情況下所有請(qǐng)求都訪問server1,當(dāng)server1掛掉或者忙的的時(shí)候才會(huì)訪問server2
upstream webname { server 192.168.0.1:8080; server 192.168.0.2:8080 down; }
設(shè)置某個(gè)節(jié)點(diǎn)為down,那么這個(gè)server不參與負(fù)載。
實(shí)現(xiàn)實(shí)例
1 測(cè)試環(huán)境
由于沒有服務(wù)器,所以本次測(cè)試直接host指定域名,然后在VMware里安裝了三臺(tái)CentOS。
-
測(cè)試域名 :http://a.com
-
A服務(wù)器IP :192.168.5.149 (主)
-
B服務(wù)器IP :192.168.5.27
-
C服務(wù)器IP :192.168.5.126
2 部署思路
A服務(wù)器做為主服務(wù)器,域名直接解析到A服務(wù)器(192.168.5.149)上,由A服務(wù)器負(fù)載均衡到B服務(wù)器(192.168.5.27)與C服務(wù)器(192.168.5.126)上。
3 域名解析
由于不是真實(shí)環(huán)境,域名就隨便使用一個(gè)http://a.com用作測(cè)試,所以http://a.com的解析只能在hosts文件設(shè)置。
打開:C:Windows\System32\drivers\etc\hosts
在末尾添加
192.168.5.149 a.com
保存退出,然后啟動(dòng)命令模式ping下看看是否已設(shè)置成功
A、服務(wù)器nginx.conf設(shè)置
打開nginx.conf,文件位置在nginx安裝目錄的conf目錄下。
在http段加入以下代碼
upstream a.com { server 192.168.5.126:80; server 192.168.5.27:80; } server{ listen 80; server_name a.com; location / { proxy_pass http://a.com; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
保存重啟nginx
B、C服務(wù)器nginx.conf設(shè)置
打開nginx.conf,在http段加入以下代碼
server{ listen 80; server_name a.com; index index.html; root /data0/htdocs/www; }
保存重啟nginx
測(cè)試
當(dāng)訪問a.com的時(shí)候,為了區(qū)分是轉(zhuǎn)向哪臺(tái)服務(wù)器處理我分別在B、C服務(wù)器下寫一個(gè)不同內(nèi)容的index.html文件,以作區(qū)分。
打開瀏覽器訪問a.com結(jié)果,刷新會(huì)發(fā)現(xiàn)所有的請(qǐng)求,均分別被主服務(wù)器(192.168.5.149)分配到B服務(wù)器(192.168.5.27)與C服務(wù)器(192.168.5.126)上,實(shí)現(xiàn)了負(fù)載均衡效果。
掃碼二維碼 獲取免費(fèi)視頻學(xué)習(xí)資料
- 本文固定鏈接: http://www.wangchenghua.com/post/7213/
- 轉(zhuǎn)載請(qǐng)注明:轉(zhuǎn)載必須在正文中標(biāo)注并保留原文鏈接
- 掃碼: 掃上方二維碼獲取免費(fèi)視頻資料