{eval=Array;=+count(Array);}
當(dāng)我們的程序只部署一套,不再能滿足訪問量(調(diào)用量)的時候,最簡單的橫向擴(kuò)容的方法就是部署多套應(yīng)用環(huán)境,負(fù)載均衡將用戶(客戶端)的訪問平均地分配到每臺服務(wù)器上,這樣就可以利用多臺機(jī)器的資源,增加系統(tǒng)的負(fù)載能力。
那么要做負(fù)載均衡,對我們的系統(tǒng)有什么要求么?或者說我們的代碼需要做什么改造么?
大部分時候我們的代碼是不需要改造的,但是也要注意這么幾點(diǎn)。
我們的服務(wù)最好是無狀態(tài)的,也就是每一次的調(diào)用,不依賴于前一次的調(diào)用結(jié)果,如果前后有依賴,則需要后面的請求攜帶著前一次請求的結(jié)果,作為參數(shù)進(jìn)行訪問。
除非負(fù)載均衡開啟了會話保持,或者通過一些負(fù)載均衡路由策略,讓同一個 IP 的請求始終路由到同一臺服務(wù)器上,但是這并不是一個好的解決方案。
通常我們需要保持服務(wù)的無狀態(tài)性,如果需要做權(quán)限認(rèn)證的話,建議采用 Token 或使用 Redis 做 Session 共享(推薦使用 Token)。
還有一點(diǎn),可能不一定必須的,不過我覺得也是個不錯的方案,供大家參考。
假如我們有兩臺應(yīng)用服務(wù)器 A 和 B,前面掛一臺負(fù)載均衡,當(dāng)我們需要做應(yīng)用升級的話,通常可以怎么做?
通常的辦法是停掉服務(wù)器 A,這時候負(fù)載均衡會監(jiān)控到這臺服務(wù)器 A 已經(jīng)無法使用了(比如監(jiān)控到端口消失),再來的請求會發(fā)送給服務(wù)器 B;
對服務(wù)器 A 升級并啟動,負(fù)載均衡監(jiān)控到 A 恢復(fù)了,會將請求發(fā)送給 A 和 B;
對服務(wù)器 B 做相同的操作。
這樣看似沒有問題,因?yàn)樵诜?wù)器升級的時候,負(fù)載均衡不在發(fā)送請求到這臺服務(wù)器上;但是大家仔細(xì)想一想這個過程,如果在停服務(wù)器的那一刻,已經(jīng)有請求進(jìn)來了并進(jìn)行處理,但是還沒有返回,這時候停掉服務(wù)器,會導(dǎo)致這部分請求發(fā)生異常,那么這個問題如何解決呢?這就需要對程序進(jìn)行一定的改造了。
應(yīng)用提供一個接口,返回一個靜態(tài)變量的值,只要 true 或 false 兩個狀態(tài);
負(fù)載均衡不再監(jiān)控端口是否消失,而是監(jiān)控剪口返回的狀態(tài),返回 true 表示應(yīng)用正常,false 或沒有返回表示不正常;
每次停服務(wù)之前,通過接口修改當(dāng)前應(yīng)用靜態(tài)變量的值為 false;
負(fù)載均衡認(rèn)為該服務(wù)器狀態(tài)不正常,將不再發(fā)送請求到這臺服務(wù)器上;
等待幾十秒,這段時間相當(dāng)于等待當(dāng)前請求都處理并返回,再停止服務(wù)。
“停止服務(wù)時,不再接受新的請求,等現(xiàn)有請求都處理完成后再真正停止服務(wù)”,這只是一個笨辦法,想要避免以上問題還有更好的辦法,并且對代碼沒有侵入性;有些中間件本身提供了類似的功能,我們只需執(zhí)行對應(yīng)的停止服務(wù)的命令即可;或者需要在代碼中添加監(jiān)聽類,當(dāng)收到 kill 信號的時候,拒絕新的請求,等待一段時間,再結(jié)束程序等等。
1.確保你的接口無狀態(tài),鑒權(quán)可以使用token,redis集中化session
2.確保你的接口冪等性,可以為接口生成請求id,過濾請求id,防重,或者可以使用一次性token。
3.確保你的接口集群對等,代碼,數(shù)據(jù),都需要對等,通常每臺機(jī)器數(shù)據(jù)源都是一樣的,代碼是相同的。同時機(jī)器的配置也是相同的。
代碼中不能把數(shù)據(jù)、上傳文件、日志等保存到本地。
大家好,我是IT屠工,很高興回答此問題,希望我的回答可以幫助到你!
什么是負(fù)載均衡
負(fù)載均衡主要通過專門的硬件設(shè)備或者通過軟件算法實(shí)現(xiàn)。通過硬件設(shè)備實(shí)現(xiàn)的負(fù)載均衡效果好、效率高、 性能穩(wěn)定,但是成本比較高。通過軟件實(shí)現(xiàn)的負(fù)載均衡主要依賴于均衡算法的選擇和程序的健壯性。均衡 算法也是多種多樣的,常見的有兩大類:即靜態(tài)負(fù)載均衡算法和動態(tài)負(fù)載均衡算法。靜態(tài)算法實(shí)現(xiàn)比較簡 單,在一般網(wǎng)絡(luò)環(huán)境下也能達(dá)到比較好的效果,主要有一般輪詢算法、基于比率的加權(quán)輪詢算法以及基于 優(yōu)先級的加權(quán)輪詢算法等。動態(tài)負(fù)載均衡算法在較為復(fù)雜的網(wǎng)絡(luò)環(huán)境中適應(yīng)性更強(qiáng),效果更好,主要有基 于任務(wù)量的最少連接優(yōu)先算法、基于性能的最快響應(yīng)優(yōu)先算法、預(yù)測算法及動態(tài)性能分配算法等。
網(wǎng)絡(luò)負(fù)載均衡技術(shù)的大致原理是利用一定的分配策略將網(wǎng)絡(luò)負(fù)載平衡地分?jǐn)偟骄W(wǎng)絡(luò)集群的各個操作單元 上,使得單個重負(fù)載任務(wù)能夠分擔(dān)到多個單元上并行處理,或者使得大量并發(fā)訪問或數(shù)據(jù) 流量分擔(dān)到多個 單元上分別處理,從而減少用戶的等待響應(yīng)時間。
Nginx 服務(wù)器負(fù)載均衡配置
Nginx 服務(wù)器實(shí)現(xiàn)了靜態(tài)的基于優(yōu)先級的加權(quán)輪詢算法,主要使用的配置是 proxy_pass 指令和 upstream 指令,這些內(nèi)容實(shí)際上很容易理解,關(guān)鍵點(diǎn)在于 Nginx 服務(wù)器的配置靈活多樣,如何在配置負(fù)載均衡的同 時合理地整合其他功能,形成一套可以滿足實(shí)際需求的配置方案。
下面的有一些基礎(chǔ)示例片段,當(dāng)然不可能將所有的配置情況包括在內(nèi),希望能夠起到拋磚引玉的效果,同 時也需要大家在實(shí)際應(yīng)用過程中多總結(jié)多積累。在配置中需要注意的地方將以注釋的形式添加。
配置實(shí)例:
在以下實(shí)例片段中,backend 服務(wù)器組中所有服務(wù)器的優(yōu)先級全部配置為默認(rèn)的 weight=1,這樣它 們會按照一般輪詢策略依次接收請求任務(wù)。該配置是一個最簡單的實(shí)現(xiàn) Nginx 服務(wù)器負(fù)載均衡的配置。所 有訪問 www.myweb.name 的請求都會在 backend 服務(wù)器組中實(shí)現(xiàn)負(fù)載均衡。實(shí)例代碼如下:
...
upstream backend #配置后端服務(wù)器組
{
server 192.168.1.2:80;
server 192.168.1.3:80;
server 192.168.1.4:80; #默認(rèn) weight=1
}
server
{
listen 80;
server_name www.myweb.name;
index index.html index.htm;
location / {
proxy_pass http://backend;
prox_set_header Host $host;
}
...
}
由于 Nginx 服務(wù)器的 功能在結(jié)構(gòu)上是增量式的,因此 ,我們可以在這些配置的基礎(chǔ)上繼續(xù)添加更多功能,比如 Web 緩存等功 能,以及 Gzip 壓縮技術(shù)、身份認(rèn)證、權(quán)限管理等。同時在使用 upstream 指令配置服務(wù)器組時,可以充 分發(fā)揮各個指令的功能,配置出滿足需求、高效穩(wěn)定、功能豐富的 Nginx 服務(wù)器。
歡迎大家關(guān)注并點(diǎn)贊,我是@IT屠工,專注IT網(wǎng)絡(luò)技術(shù)資源分享,普及IT網(wǎng)絡(luò)技術(shù)
一般涉及到負(fù)載均衡,以下幾種情況必須要注意:
這里所說的文件管理是指通過上傳至服務(wù)器的文件,這就不能再單純地存儲至代碼所在服務(wù)器上了,必須有專門的文件服務(wù)器。
單一服務(wù)器一般都是WEB服務(wù)器與數(shù)據(jù)庫在一起。在負(fù)載均衡中,數(shù)據(jù)庫最好做成讀寫分離。
代碼需要對SESSION以及緩存做處理,保證能夠正常訪問這些共享的數(shù)據(jù),建議引入R edis。
日志也應(yīng)與文件管理一樣,有專門的服務(wù)器進(jìn)行管理。
建議用戶授權(quán)不要用session。可以采用token方式。將用戶信息加密到token中,每次請求將token通過header post給服務(wù)器,然后再去解密。這樣負(fù)載均衡就沒任何問題了。
6
回答8
回答0
回答2
回答0
回答6
回答0
回答0
回答2
回答10
回答