一:為什么要實(shí)現(xiàn)負(fù)載均衡
當(dāng)一臺服務(wù)器的單位時(shí)間內(nèi)訪問量越大的時(shí)候矮瘟,服務(wù)器壓力會越大,當(dāng)一臺服務(wù)器壓力大得超過自身的承受壓力的時(shí)候灭返,服務(wù)器會崩潰景用。為了避免服務(wù)器崩潰涵叮,讓用戶更好的體驗(yàn),我們通常通過負(fù)載均衡的方式來分擔(dān)服務(wù)器的壓力伞插。那么什么是負(fù)載均衡呢割粮?我們可以建立很多個(gè)服務(wù)器,這些服務(wù)器組成一個(gè)服務(wù)器集群蜂怎,然后當(dāng)用戶訪問我們的網(wǎng)站的時(shí)候穆刻,先訪問一個(gè)中間服務(wù)器,再讓這個(gè)中間服務(wù)器在服務(wù)器群中選擇一個(gè)壓力較小的服務(wù)器杠步,然后將該訪問請求引入選擇的服務(wù)器氢伟。這樣,用戶每次的訪問幽歼,都會保證服務(wù)器集群中的每個(gè)服務(wù)器的壓力區(qū)域平衡朵锣,分擔(dān)了服務(wù)器的壓力,避免了服務(wù)器崩潰的情況甸私。
二:Nginx的優(yōu)勢
nginx是一款可以通過反向代理實(shí)現(xiàn)負(fù)載均衡的服務(wù)器诚些,使用nginx服務(wù)器實(shí)現(xiàn)負(fù)載均衡的時(shí)候,用戶首先會訪問到nginx服務(wù)器,然后nginx服務(wù)器再從服務(wù)器群中選擇壓力較小的服務(wù)器诬烹,把該訪問請求引入到該服務(wù)器砸烦。若服務(wù)器群中的某個(gè)服務(wù)器崩潰,那么從待選的服務(wù)器列表中刪除绞吁,也就是說如果一個(gè)服務(wù)器崩潰了幢痘,那么nginx肯定不會把訪問引入該服務(wù)器了。
三:負(fù)載均衡
當(dāng)使用了代理服務(wù)器時(shí)家破,一般代理服務(wù)器后面不僅僅只有一臺原始服務(wù)器颜说,而是有很多臺服務(wù)器一起在處理用戶發(fā)過來的請求,這時(shí)就要協(xié)調(diào)好多臺服務(wù)器怎樣合作共同處理用戶的請求
若所有的原始服務(wù)器配置相差不大的情況下汰聋,負(fù)載均衡的手段一般為輪詢门粪,即每臺服務(wù)器平等地處理用戶的請求,當(dāng)請求到來時(shí)會自動(dòng)交給當(dāng)前所負(fù)責(zé)事務(wù)最少的服務(wù)器去處理烹困;
若原始服務(wù)器的配置有一定差異時(shí)玄妈,則采用加權(quán)輪詢的方式,配置較好的服務(wù)器將負(fù)責(zé)更多的請求處理髓梅,反之亦然措近;
而一旦采取輪詢方式,而要考慮session共享的問題女淑,因?yàn)橐怯脩舻恼埱蟊环峙浣o不同的服務(wù)器處理而未實(shí)現(xiàn)session共享的話則需要用戶重復(fù)登陸操作瞭郑,當(dāng)前實(shí)現(xiàn)session共享的方式有寫入數(shù)據(jù)庫或者寫入memcached;
若不想處理session共享鸭你,則采用ip哈希的方式將某一用戶的請求指定分配給某一臺服務(wù)器屈张,在配置中加上 ip_hash 這句即可;
幾種常用的負(fù)載均衡方式
最少連接:系統(tǒng)把新連接分配給當(dāng)前連接數(shù)目最少的服務(wù)器袱巨。該算法在各個(gè)服務(wù)器運(yùn)算能力基本相似的環(huán)境中非常有效阁谆。
最快算法:最快算法基于所有服務(wù)器中的最快響應(yīng)時(shí)間分配連接。該算法在服務(wù)器跨不同網(wǎng)絡(luò)的環(huán)境中特別有用愉老。
輪詢:輪詢算法按順序把每個(gè)新的連接請求分配給下一個(gè)服務(wù)器场绿,最終把所有請求平分給所有的服務(wù)器。輪詢算法在大多數(shù)情況下都工作的不錯(cuò)嫉入,但是如果負(fù)載均衡的設(shè)備在處理速度焰盗、連接速度和內(nèi)存等方面不是完全均等,那么效果會更好咒林。
加權(quán)輪詢:該算法中熬拒,每個(gè)機(jī)器接受的連接數(shù)量是按權(quán)重比例分配的。這是對普通輪詢算法的改進(jìn)垫竞,比如你可以設(shè)定:第三臺機(jī)器的處理能力是第一臺機(jī)器的兩倍澎粟,那么負(fù)載均衡器會把兩倍的連接數(shù)量分配給第3臺機(jī)器。
Nginx負(fù)載均衡部署
測試環(huán)境:
由于沒有服務(wù)器,所以本次測試直接host指定域名活烙,然后在VMware里安裝了三臺CentOS徐裸。
測試域名 :a.com
A服務(wù)器IP :172.16.253.89 (主)
B服務(wù)器IP :172.16.253.88
C服務(wù)器IP :172.16.251.82
部署思路:
A服務(wù)器做為主服務(wù)器,域名直接解析到A服務(wù)器(172.16.253.89)上啸盏,由A服務(wù)器負(fù)載均衡到B服務(wù)器(172.16.253.88)與C服務(wù)器(172.16.251.82)上倦逐。
1: 域名解析
由于不是真實(shí)環(huán)境,域名就隨便使用一個(gè)a.com用作測試宫补,所以a.com的解析只能在hosts文件設(shè)置。
打開:C:\Windows\System32\drivers\etc\hosts
在末尾添加:
172.16.253.89 a.com
保存退出曾我,然后啟動(dòng)命令模式ping下看看是否已設(shè)置成功
從截圖上看已成功將a.com解析到172.16.253.89
2: A服務(wù)器nginx.conf設(shè)置
打開nginx.conf粉怕,文件位置在nginx安裝目錄的conf目錄下。(yum安裝的話在/etc/nginx/nginx.conf下)
在http段加入以下代碼:
upstream a.com {
server 172.16.253.88:80;
server 172.16.251.82: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;
}
}
3:B抒巢、C服務(wù)器nginx.conf設(shè)置:
打開nginx.conf贫贝,在http段加入以下代碼
server{
listen 80;
server_name a.com;
index index.html;
root /var/www/html/;
}
保存重啟nginx
我在重啟的過程中遇到了如下錯(cuò)誤提示,原來是80端口被占用蛉谜。使用下面命令就可以解決問題了稚晚。
4:測試
當(dāng)訪問a.com的時(shí)候,為了區(qū)分是轉(zhuǎn)向哪臺服務(wù)器處理我分別在B型诚、C服務(wù)器下寫一個(gè)不同內(nèi)容的index.html文件客燕,以作區(qū)分。
編輯各自的index.html文件
vim /var/www/html/index.html
打開瀏覽器訪問a.com結(jié)果狰贯,刷新會發(fā)現(xiàn)所有的請求均分別被主服務(wù)器(172.16.253.89)分配到B服務(wù)器(172.16.253.88)與C服務(wù)器(172.16.251.82)上也搓,實(shí)現(xiàn)了負(fù)載均衡效果。
B服務(wù)器處理頁面
C服務(wù)器處理頁面(要是出不來此結(jié)果可以換個(gè)瀏覽器試試涵紊,因?yàn)樵L問過之后可能會有緩存)
5:假如其中一臺服務(wù)器宕機(jī)會怎樣傍妒?
當(dāng)某臺服務(wù)器宕機(jī)了,是否會影響訪問呢摸柄?
我們先來看看實(shí)例颤练,根據(jù)以上例子,假設(shè)C服務(wù)器172.16.251.82 這臺機(jī)子宕機(jī)了(由于無法模擬宕機(jī)驱负,所以我就把C服務(wù)器關(guān)機(jī))然后再來訪問看看嗦玖。
訪問結(jié)果:
我們發(fā)現(xiàn),雖然C服務(wù)器(172.16.251.82)宕機(jī)了跃脊,但不影響網(wǎng)站訪問踏揣。這樣,就不會擔(dān)心在負(fù)載均衡模式下因?yàn)槟撑_機(jī)子宕機(jī)而拖累整個(gè)站點(diǎn)了匾乓。
6: 主服務(wù)器不能提供服務(wù)嗎捞稿?
以上例子中,我們都是應(yīng)用到了主服務(wù)器負(fù)載均衡到其它服務(wù)器上,那么主服務(wù)器本身能不能也加在服務(wù)器列表中娱局,這樣就不會白白浪費(fèi)拿一臺服務(wù)器純當(dāng)做轉(zhuǎn)發(fā)功能彰亥,而是也參與到提供服務(wù)中來。
如以上案例三臺服務(wù)器:
A服務(wù)器IP :172.16.253.89(主)
B服務(wù)器IP :172.16.253.88
C服務(wù)器IP :172.16.251.82
我們把域名解析到A服務(wù)器衰齐,然后由A服務(wù)器轉(zhuǎn)發(fā)到B服務(wù)器與C服務(wù)器任斋,那么A服務(wù)器只做一個(gè)轉(zhuǎn)發(fā)功能,現(xiàn)在我們讓A服務(wù)器也提供站點(diǎn)服務(wù)耻涛。
我們先來分析一下废酷,如果添加主服務(wù)器到upstream中,那么可能會有以下兩種情況發(fā)生:
1抹缕、主服務(wù)器轉(zhuǎn)發(fā)到了其它IP上澈蟆,其它IP服務(wù)器正常處理;
2卓研、主服務(wù)器轉(zhuǎn)發(fā)到了自己IP上趴俘,然后又進(jìn)到主服務(wù)器分配IP那里,假如一直分配到本機(jī)奏赘,則會造成一個(gè)死循環(huán)寥闪。
怎么解決這個(gè)問題呢?因?yàn)?0端口已經(jīng)用來監(jiān)聽負(fù)載均衡的處理磨淌,那么本服務(wù)器上就不能再使用80端口來處理a.com的訪問請求疲憋,得用一個(gè)新的。于是我們把主服務(wù)器的/etc/nginx/nginx.conf加入以下一段代碼:
server{
listen 8080;
server_name a.com;
index index.html;
root /var/www/html/;
}
重啟nginx梁只,在瀏覽器輸入a.com:8080試試看能不能訪問柜某。結(jié)果可以正常訪問
既然能正常訪問,那么我們就可以把主服務(wù)器添加到upstream中敛纲,但是端口要改一下喂击,如下代碼(編輯主服務(wù)器的此文件vim /etc/nginx/nginx.html):
upstream a.com {
server 172.16.253.88:80;
server 172.16.251.82:80;
server 172.16.253.89:8080;
}
由于這里可以添加主服務(wù)器IP172.16.253.89 或者127.0.0.1均可以,都表示訪問自己淤翔。
重啟Nginx翰绊,然后再來訪問a.com看看會不會分配到主服務(wù)器上。
主服務(wù)器也能正常加入服務(wù)了旁壮。
總結(jié):
一监嗜、負(fù)載均衡不是nginx獨(dú)有,著名鼎鼎的apache也有抡谐,但性能可能不如nginx裁奇。
二、多臺服務(wù)器提供服務(wù)麦撵,但域名只解析到主服務(wù)器刽肠,而真正的服務(wù)器IP不會被ping下即可獲得溃肪,增加一定安全性。
三音五、upstream里的IP不一定是內(nèi)網(wǎng)惫撰,外網(wǎng)IP也可以。不過經(jīng)典的案例是躺涝,局域網(wǎng)中某臺IP暴露在外網(wǎng)下厨钻,域名直接解析到此IP。然后又這臺主服務(wù)器轉(zhuǎn)發(fā)到內(nèi)網(wǎng)服務(wù)器IP中坚嗜。
四夯膀、某臺服務(wù)器宕機(jī)、不會影響網(wǎng)站正常運(yùn)行苍蔬,Nginx不會把請求轉(zhuǎn)發(fā)到已宕機(jī)的IP上