【Spring Cloud系統(tǒng)】- 輕量級(jí)高可用工具Keepalive詳解

一、概述
Keepalive是Linux下一個(gè)輕量級(jí)高可用解決方案。高可用(High Avaliability簡(jiǎn)稱HA)就是主機(jī)的冗余和接管。
基本功能:心跳檢測(cè)、資源接管、檢測(cè)集群中的服務(wù),在集群結(jié)點(diǎn)共享IP地址的所有者。
Keepalive主要是通過路由冗余來實(shí)現(xiàn)高可用功能,配置簡(jiǎn)單,只需要一個(gè)配置文件即可完成。
Keepalive起初是為 LVS(Liunx Virtual Server虛擬的服務(wù)器集群負(fù)載均衡系統(tǒng))設(shè)計(jì)的,專門用來監(jiān)控集群系統(tǒng)中各個(gè)服務(wù)節(jié)點(diǎn)的狀態(tài),它根據(jù)TCP/IP參考模型的第三、第四層、第五層交換機(jī)制檢測(cè)每個(gè)服務(wù)節(jié)點(diǎn)的狀態(tài),如果某個(gè)服務(wù)器節(jié)點(diǎn)出現(xiàn)異常,或者工作出現(xiàn)故障,Keepalived將檢測(cè)到,并將出現(xiàn)的故障的服務(wù)器節(jié)點(diǎn)從集群系統(tǒng)中剔除,這些工作全部是自動(dòng)完成的,不需要人工干涉,需要人工完成的只是修復(fù)出現(xiàn)故障的服務(wù)節(jié)點(diǎn)。
二、Keepalive分類
KeepAlive 分為TCP的 KeepAlive 和 HTTP的 Keep-Alive,兩者是完全不同的概念,不能混為一談。
2.1 TCP的keepalive
- 側(cè)重在保持客戶端和服務(wù)端的連接,一方會(huì)不定期發(fā)送心跳包給另一方,當(dāng)一方掛掉的時(shí)候,沒有掛掉的一方會(huì)定時(shí)發(fā)送幾次心跳包,如果間隔發(fā)送幾次,對(duì)方都返回的是RST,而不是ACK,那么就釋放當(dāng)前鏈接。
- TCP的keepalive 就是查看客戶端和服務(wù)端是否都在線,當(dāng)有一方不在線的時(shí)候就釋放連接。防止連接一直沒有釋放,造成服務(wù)器資源浪費(fèi)。
2.2 HTTP的keep-alive
普通的http連接是客戶端連接上服務(wù)端,然后結(jié)束請(qǐng)求后,由客戶端或者服務(wù)端進(jìn)行http連接的關(guān)閉。下次再發(fā)送請(qǐng)求的時(shí)候,客戶端再發(fā)起一個(gè)連接,傳送數(shù)據(jù),關(guān)閉連接。這個(gè)流程反復(fù),但是一旦客戶端發(fā)送connection:keep-alive頭給服務(wù)端,且服務(wù)端也接受這個(gè)keep-alive的話,兩邊對(duì)上暗號(hào),這個(gè)連接就可以復(fù)用了,一個(gè)http處理完之后,另外一個(gè)http數(shù)據(jù)直接從這個(gè)連接走了。
HTTP的Keep-alive的作用: 減少新建和斷開TCP連接的消耗。
2.3 TCP的 KeepAlive 和 HTTP的 Keep-Alive區(qū)別
HTTP的Keep-Alive意圖在于短時(shí)間內(nèi)連接復(fù)用,希望可以短時(shí)間內(nèi)在同一個(gè)連接上進(jìn)行多次請(qǐng)求/響應(yīng)。
TCP的KeepAlive機(jī)制意圖在于?;睢⑿奶?,檢測(cè)連接錯(cuò)誤。當(dāng)一個(gè)TCP連接兩端長(zhǎng)時(shí)間沒有數(shù)據(jù)傳輸時(shí)(通常默認(rèn)配置是2小時(shí)),發(fā)送keepalive探針,探測(cè)鏈接是否存活。
三、nginx的keepalive配置
3.1 nginx保持keepalive需做那些事情
- client到nginx的連接是長(zhǎng)連接
- nginx到server的連接是長(zhǎng)連接
3.2 nginx的文件配置
-
配置TCP層keepalive探活機(jī)制的三個(gè)參數(shù):
#情況1: http { server { listen 127.0.0.1:3306 so_keepalive=on;#開啟keepalive探活,探測(cè)策略走系統(tǒng)默認(rèn) } } #情況2: http { server { listen 127.0.0.1:3306 so_keepalive=7m:75s:9;#把空閑時(shí)長(zhǎng)從系統(tǒng)默認(rèn)的5分鐘改為了7分鐘 } }
其中so_keepalive有如下選擇配置:
so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt] * on: 開啟,探測(cè)參數(shù)更加系統(tǒng)默認(rèn)值 * off: 關(guān)閉 * keepidle: 連接空閑等待時(shí)間 * keepintvl: 發(fā)送探測(cè)報(bào)文間隔時(shí)間 * keepcent: 探測(cè)報(bào)文重試次數(shù)
如果nginx未設(shè)置so_keepalive配置,則走系統(tǒng)默認(rèn)的探活策略
-
nginx與客戶端(一般為瀏覽器、APP等)保持的長(zhǎng)連接進(jìn)行限制管理:
http { keepalive_timeout 120s 120s; keepalive_requests 100; }
keepalive_timeout timeout [header_timeout];
第一個(gè)參數(shù):客戶端連接在服務(wù)器端空閑狀態(tài)下保持的超時(shí)值(默認(rèn)75s);值為0會(huì)禁用keep-alive,也就是說默認(rèn)不啟用長(zhǎng)連接;第二個(gè)參數(shù):響應(yīng)的header域中設(shè)置“Keep-Alive: timeout=time”;告知瀏覽器對(duì)長(zhǎng)連接的維持時(shí)間;
keepalive_requests number;
keepalive_requests:默認(rèn)100,某個(gè)長(zhǎng)連接連續(xù)處理請(qǐng)求次數(shù)限制,超過次數(shù)則該長(zhǎng)連接被關(guān)閉;如果需要釋放某個(gè)連接占用的內(nèi)存,必須關(guān)閉該鏈接,內(nèi)存不大的情況下,不建議開大該配置;在QPS較高的場(chǎng)景,則有必要加大這個(gè)參數(shù);
-
nginx與上游server保持長(zhǎng)連接文章來源:http://www.zghlxwxcb.cn/news/detail-708057.html
http { upstream BACKEND { server 127.0.0.1:8000; server 127.0.0.1:8001; server 127.0.0.1:8002; keepalive 300; //空閑連接數(shù) keepalive_timeout 120s;//與上游空閑時(shí)間 keepalive_requests 100;//與上游請(qǐng)求處理最大次數(shù) } server{ listen 8080; location /{ proxy_pass http://BACKEND; proxy_http_version 1.1; proxu_set_header Connection ""; } } }
keepalive:限制nginx某個(gè)worker最多空閑連接數(shù),此處不會(huì)限制worker與上游服務(wù)長(zhǎng)連接的總數(shù);
keepalive_timeout:nginx與上游長(zhǎng)連接最大空閑時(shí)間,默認(rèn)值為60s;
keepalive_requests:nginx與上游長(zhǎng)連接最大交互請(qǐng)求的次數(shù),默認(rèn)值為100;文章來源地址http://www.zghlxwxcb.cn/news/detail-708057.html
到了這里,關(guān)于【Spring Cloud系統(tǒng)】- 輕量級(jí)高可用工具Keepalive詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!