一牧牢、負(fù)載均衡
??負(fù)載均衡是高可用網(wǎng)絡(luò)基礎(chǔ)架構(gòu)的的一個(gè)關(guān)鍵組成部分艾帐,有了負(fù)載均衡丑蛤,我們通常可以將我們的應(yīng)用服務(wù)器部署多臺(tái)麻车,然后通過(guò)負(fù)載均衡將用戶的請(qǐng)求分發(fā)到不同的服務(wù)器用來(lái)提高網(wǎng)站缀皱、應(yīng)用、數(shù)據(jù)庫(kù)或其他服務(wù)的性能以及可靠性动猬。
??首先啤斗,用戶是通過(guò)網(wǎng)絡(luò)直接和web服務(wù)器相連,想象一下枣察,如果這個(gè)服務(wù)器掛了(這種情況隨時(shí)都可能發(fā)生的)争占,那么用戶的請(qǐng)求就會(huì)得不到響應(yīng),將無(wú)法訪問(wèn)該網(wǎng)站序目,這就是著名的單點(diǎn)故障問(wèn)題臂痕,這肯定是不行的,一般而言猿涨,商業(yè)上的網(wǎng)站其可靠性需要達(dá)到至少4個(gè)9握童,也就是99.99&以上。
??其次叛赚,即使服務(wù)器是正常工作的情況澡绩,但是如果很多用戶在同一時(shí)間內(nèi)訪問(wèn)服務(wù)器,超過(guò)了服務(wù)器的處理能力俺附,那么會(huì)出現(xiàn)響應(yīng)速度慢甚至無(wú)法連接的情況肥卡,這也是用戶無(wú)法接受的。
??負(fù)載均衡的出現(xiàn)可以很好的解決上面兩個(gè)問(wèn)題事镣,通過(guò)引入一個(gè)負(fù)載均衡器和至少兩個(gè)web 服務(wù)器步鉴,可以有效的解決上面兩個(gè)問(wèn)題。注:通常情況下璃哟,所有的后端服務(wù)器會(huì)保證提供相同的內(nèi)容氛琢,以便用戶無(wú)論哪個(gè)服務(wù)器響應(yīng),都能收到一致的內(nèi)容随闪。
按照網(wǎng)絡(luò)模型OSI
四層(傳輸層)負(fù)載均衡:對(duì)客戶端TCP/IP協(xié)議的包轉(zhuǎn)發(fā)
七層(應(yīng)用層)負(fù)載均衡:Http的應(yīng)用層負(fù)載均衡,Nginx
就是一個(gè)典型的7層負(fù)載均衡SLB阳似。
負(fù)載均衡常用算法:
- 輪詢:為第一個(gè)請(qǐng)求選擇健康池中的第一個(gè)后端服務(wù)器,然后按順序往后依次選擇铐伴,直到最后一個(gè)撮奏,然后循環(huán)俏讹。
- 最小連接:優(yōu)先選擇連接數(shù)最少,也就是壓力最小的后端服務(wù)器挽荡,在會(huì)話較長(zhǎng)的情況下可以考慮采取這種方式藐石。
- 散列:根據(jù)請(qǐng)求源的 IP 的散列(hash)來(lái)選擇要轉(zhuǎn)發(fā)的服務(wù)器。這種方式可以一定程度上保證特定用戶能連接到相同的服務(wù)器定拟。如果你的應(yīng)用需要處理狀態(tài)而要求用戶能連接到和之前相同的服務(wù)器,可以考慮采取這種方式逗嫡。
二青自、負(fù)載均衡
- 配置
upstream mysvr {
server 192.168.1.9:8888;
server 192.168.1.9:9999;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#代理地址 及映射的服務(wù)端的地址
# 最重要的配置
location /api {
proxy_pass http://mysvr; #服務(wù)器名稱
}
}
- 后端代碼
9999服務(wù)器:
@RestController
@RequestMapping("/api/user")
@Slf4j
public class UserController {
@GetMapping
public String getServer(){
return "9999服務(wù)器";
}
}
8888服務(wù)器:
@RestController
@RequestMapping("/api/user")
@Slf4j
public class UserController {
@GetMapping
public String getServer(){
return "8888服務(wù)器";
}
}
- 訪問(wèn)測(cè)試
重啟Nginx:
[root@localhost nginx]# ./sbin/nginx -s reload
刷新:
三、配置詳解
- upstream配置
這個(gè)配置是寫一組被代理的服務(wù)器地址驱证,然后配置負(fù)載均衡的算法延窜。這里的被代理服務(wù)器地址有2種寫法。
第一種:
upstream mysvr {
server 192.168.1.9:8888
server 192.168.1.9:9999;
}
server {
....
location ~*^.+$ {
proxy_pass http://mysvr; #請(qǐng)求轉(zhuǎn)向mysvr 定義的服務(wù)器列表
}
第二種:
upstream mysvr {
server http://192.168.1.9:8888;
server http://192.168.1.9:9999;
}
server {
....
location ~*^.+$ {
proxy_pass mysvr; #請(qǐng)求轉(zhuǎn)向mysvr 定義的服務(wù)器列表
}
- 熱備
如果你有2臺(tái)服務(wù)器抹锄,當(dāng)一臺(tái)服務(wù)器發(fā)生事故時(shí)逆瑞,才啟用第二臺(tái)服務(wù)器給提供服務(wù)。服務(wù)器處理請(qǐng)求的順序:AAAAAA突然A掛啦伙单,BBBBBBBBBBBBBB.....
upstream mysvr {
server 192.168.1.9:8888;
server 192.168.1.9:9999 backup; #熱備
}
- 輪詢
nginx默認(rèn)就是輪詢其權(quán)重都默認(rèn)為1获高,服務(wù)器處理請(qǐng)求的順序:ABABABABAB....
upstream mysvr {
server 192.168.1.9:8888;
server 192.168.1.9:9999;
}
- 加權(quán)輪詢
跟據(jù)配置的權(quán)重的大小而分發(fā)給不同服務(wù)器不同數(shù)量的請(qǐng)求。如果不設(shè)置吻育,則默認(rèn)為1念秧。下面服務(wù)器的請(qǐng)求順序?yàn)椋篈BBABBABBABBABB....
upstream mysvr {
server 192.168.1.9:8888 weight=1;
server 192.168.1.9:9999 weight=2;
}
- ip_hash
nginx會(huì)讓相同的客戶端ip請(qǐng)求相同的服務(wù)器。
upstream mysvr {
server 192.168.1.9:8888;
server 192.168.1.9:9999;
ip_hash;
}
- nginx負(fù)載均衡配置狀態(tài)參數(shù)
down布疼,表示當(dāng)前的server暫時(shí)不參與負(fù)載均衡摊趾。
backup,預(yù)留的備份機(jī)器游两。當(dāng)其他所有的非backup機(jī)器出現(xiàn)故障或者忙的時(shí)候砾层,才會(huì)請(qǐng)求backup機(jī)器,因此這臺(tái)機(jī)器的壓力最輕贱案。
max_fails肛炮,允許請(qǐng)求失敗的次數(shù),默認(rèn)為1轰坊。當(dāng)超過(guò)最大次數(shù)時(shí)铸董,返回proxy_next_upstream 模塊定義的錯(cuò)誤。
fail_timeout肴沫,在經(jīng)歷了max_fails次失敗后粟害,暫停服務(wù)的時(shí)間。max_fails可以和fail_timeout一起使用颤芬。
upstream mysvr {
server 192.168.1.9:8888 weight=2 max_fails=2 fail_timeout=2;
server 192.168.1.9:9999 weight=1 max_fails=2 fail_timeout=1;
}