Nginx雙機(jī)熱備的實(shí)現(xiàn)步驟
目前所接觸的項(xiàng)目還不涉及到分布式,都是單機(jī)模式。不過(guò)好在至今沒(méi)出過(guò)什么大問(wèn)題,基本能滿足客戶的需求。
由于數(shù)據(jù)量不是很大,單機(jī)的性能已經(jīng)可以滿足,按理不應(yīng)該做加法,畢竟部署的越復(fù)雜,維護(hù)起來(lái)就越麻煩。
性能雖然可以滿足,但有一個(gè)不得不提的痛點(diǎn):項(xiàng)目無(wú)法隨時(shí)更新。
目前的解決方式是:白天改bug、測(cè)試,等到晚上客戶不使用系統(tǒng)時(shí)才停機(jī)維護(hù),效率相對(duì)較低。
有沒(méi)有可能讓項(xiàng)目可以隨時(shí)更新?
答案肯定是有,相對(duì)簡(jiǎn)單的解決方案是:雙機(jī)熱備(應(yīng)用雙活) 。
什么是雙機(jī)熱備?
這里引用一下百度百科的解釋。
雙機(jī)熱備是應(yīng)用于服務(wù)器的一種解決方案,其構(gòu)造思想是主機(jī)和從機(jī)通過(guò)TCP/IP網(wǎng)絡(luò)連接,正常情況下主機(jī)處于工作狀態(tài),從機(jī)處于監(jiān)視狀態(tài),一旦從機(jī)發(fā)現(xiàn)主機(jī)異常,從機(jī)將會(huì)在很短的時(shí)間之內(nèi)代替主機(jī),完全實(shí)現(xiàn)主機(jī)的功能。
就是同時(shí)部署兩套系統(tǒng),一主一備。主節(jié)點(diǎn)負(fù)責(zé)對(duì)外提供服務(wù),備用節(jié)點(diǎn)默認(rèn)不提供服務(wù),只有在主節(jié)點(diǎn)出問(wèn)題的情況下,備用節(jié)點(diǎn)才頂替主節(jié)點(diǎn),繼續(xù)對(duì)外提供服務(wù)。
大哥不行了,二弟替一會(huì)兒。
可以解決什么問(wèn)題?
利用這個(gè)思路,是否可以實(shí)現(xiàn)同時(shí)部署AB兩套系統(tǒng),當(dāng)系統(tǒng)需要更新維護(hù)時(shí),停用A服務(wù),B服務(wù)頂替A工作。待A服務(wù)更新完畢后,A服務(wù)啟動(dòng)提供升級(jí)后的服務(wù),B服務(wù)停用再更新。實(shí)現(xiàn)應(yīng)用的熱插拔?
答案當(dāng)然也是可以的。
紙上得來(lái)終覺(jué)淺,絕知此事要躬行。
本人寫(xiě)了個(gè)小demo親測(cè)!
實(shí)現(xiàn)思路
搭建項(xiàng)目前先簡(jiǎn)單理一下思路。
要做的分為以下幾步:
1、啟動(dòng)兩套簡(jiǎn)單的Web服務(wù)
2、服務(wù)內(nèi)就兩個(gè)簡(jiǎn)單的方法
保存值到Session
從Session取值
3、Nginx配置負(fù)載均衡,PC01主,PC02備
3、保存Session到PC01服務(wù),然后停用PC01
4、從PC02服務(wù)取值,看PC02能否正常工作并訪問(wèn)Session
如果服務(wù)可以無(wú)縫切換,Session也都正常則表示成功。
項(xiàng)目環(huán)境
兩套SpringBoot服務(wù)(雙活)
Redis(實(shí)現(xiàn)Session共享)
Nginx(負(fù)載均衡-主備模式) (也可使用KeepAlived)
為什么需要Redis?
使用多套系統(tǒng)無(wú)法避開(kāi)的一個(gè)問(wèn)題就是Session,再也不能像以前單機(jī)模式下直接從request中g(shù)etSession了,Session是保存在服務(wù)器的,多個(gè)服務(wù)器之間無(wú)法共享Session。關(guān)于共享Session有很多實(shí)現(xiàn)方案,這里采用的是Redis。
搭建步驟
1、先簡(jiǎn)單看一下前端
由于只講環(huán)境搭建,所以項(xiàng)目竟可能的簡(jiǎn)單。
只有兩個(gè)功能,保存值到Session和從Session中取值。
const PATH = ‘/backend/'; //保存到Session function saveSession() { const personName = $('#personName').val(); if (personName.length <= 0) { alert('請(qǐng)輸入再保存'); return; } $.ajax({ type:'post', url: PATH+"test/save", async:false, xhrFields: { withCredentials: true }, crossDomain: true, data: { personName:personName }, success: function(json) { $('#screen').text(json); } }); } //查詢Session function requestServer() { $.ajax({ type:'post', url: PATH+"test/query", async:false, xhrFields: { withCredentials: true }, crossDomain: true, success: function(json) { $('#screen').text(json); } }); }
2、再看一下后端服務(wù)
很簡(jiǎn)單的一個(gè)服務(wù),就兩個(gè)方法:保存值到session、從session中取值
只從request中獲取SessionId作為Key,數(shù)據(jù)作為Value保存到Redis。
@RestController @RequestMapping("/test") public class TestController { private static final String SERVER = "PC01"; @Autowired private RedisUtil redisUtil; @RequestMapping("/save") public Object save(String personName, HttpServletRequest request, HttpServletResponse response) { String sessionId = request.getRequestedSessionId(); if (redisUtil.set(sessionId, personName)) { return SERVER+",Session保存成功"; } return "Session保存失敗"; } @RequestMapping("/query") public Object query(HttpServletRequest request) { String sessionId = request.getRequestedSessionId(); Object personName = redisUtil.get(sessionId); if (personName != null) { return "Hello," + personName+",我是"+SERVER; } return "Session為空"; } }
項(xiàng)目會(huì)編譯兩個(gè)jar包,同時(shí)部署。
PC01對(duì)應(yīng)8081端口,PC02對(duì)應(yīng)8082端口。
3、Nginx配置負(fù)載均衡
#主備模式,backup只有在主節(jié)點(diǎn)故障時(shí)才提供服務(wù) upstream backend { server 127.0.0.1:8081; server 127.0.0.1:8082 backup; } server { listen 81; server_name localhost; location /{ #前端 root www/back; } location /backend{ #反向代理到8081、8082 proxy_pass http://backend; } }
到這一步環(huán)境就算搭建完成了。
4、測(cè)試
現(xiàn)在雖然PC01和PC02都是啟動(dòng)的,但是只有PC01對(duì)外提供服務(wù)。
我們將‘小潘’保存到Session,然后查詢。
可以看到,我們現(xiàn)在訪問(wèn)的是PC01服務(wù),且Session也保存成功了。
接下來(lái),我們停用PC01服務(wù)。
[root@localhost test]# lsof -i:8081 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 71972 root 13u IPv6 88606 0t0 TCP *:tproxy (LISTEN) [root@localhost test]# kill -9 71972
強(qiáng)制殺掉進(jìn)程,項(xiàng)目會(huì)不會(huì)因此而掛掉呢?
再次請(qǐng)求查詢Session
可以看到,項(xiàng)目并沒(méi)有掛掉。不僅如此,而且Session也能正常訪問(wèn),PC02迅速頂替了PC01的位置,繼續(xù)對(duì)外提供服務(wù)。
接下來(lái),就可以對(duì)PC01進(jìn)行維護(hù)更新了,更新好了直接啟用,PC02又會(huì)退居幕后,等待下一次復(fù)出。
整個(gè)過(guò)程對(duì)于用戶而言是無(wú)縫的。
利用雙機(jī)熱備,不僅可以實(shí)現(xiàn)項(xiàng)目的隨時(shí)更新,而且還實(shí)現(xiàn)了高可用。即使PC01意外宕機(jī),PC02也會(huì)迅速接替,不至于整個(gè)項(xiàng)目癱瘓。
到此這篇關(guān)于Nginx雙機(jī)熱備的實(shí)現(xiàn)步驟的文章就介紹到這了,更多相關(guān)Nginx雙機(jī)熱備內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Nginx+keepalived雙機(jī)熱備技術(shù)實(shí)踐
- 生產(chǎn)環(huán)境部署Nginx服務(wù)器雙機(jī)熱備部署keepalived的步驟(多種模式教程)
- Nginx結(jié)合keepalived實(shí)現(xiàn)雙機(jī)熱備方案
- Nginx+Keepalived實(shí)現(xiàn)雙機(jī)熱備
- keepalived雙機(jī)熱備nginx的配置方法
- Nginx+Tomcat負(fù)載均衡群集全過(guò)程
- Nginx部署負(fù)載均衡服務(wù)的步驟全解析
- nginx負(fù)載均衡配置方式
- nginx負(fù)載均衡及詳細(xì)配置方法
- nginx實(shí)現(xiàn)負(fù)載均衡與實(shí)例解讀
- Nginx實(shí)現(xiàn)負(fù)載均衡的配置步驟
- nginx tcp負(fù)載均衡的具體實(shí)現(xiàn)
- keepalived+nginx+httpd實(shí)現(xiàn)的雙機(jī)熱備+負(fù)載均衡
相關(guān)文章
nginx 反向代理之 proxy_pass的實(shí)現(xiàn)
這篇文章主要介紹了nginx 反向代理之 proxy_pass的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11詳解Nginx如何根據(jù)swagger關(guān)鍵字屏蔽頁(yè)面
這篇文章主要為大家詳細(xì)介紹了Nginx 如何根據(jù)swagger關(guān)鍵字屏蔽頁(yè)面的實(shí)現(xiàn)方案,文中有詳細(xì)的解決方案,對(duì)我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-08-08Nginx?CertBot配置HTTPS泛域名證書(shū)Debian及常見(jiàn)問(wèn)題
這篇文章主要介紹了Nginx?CertBot配置HTTPS泛域名證書(shū)Debian及常見(jiàn)問(wèn)題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11nginx 部署 vue 項(xiàng)目找不到j(luò)s css文件的解決方法
這篇文章主要介紹了nginx 部署 vue 項(xiàng)目找不到j(luò)s css文件的解決方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07在Nginx中阻止來(lái)自特定的IP地址訪問(wèn)的操作指南
在網(wǎng)絡(luò)安全方面,有時(shí)你可能需要限制特定國(guó)家或地區(qū)的訪問(wèn)權(quán)限,本文將介紹如何使用?Nginx?配置文件來(lái)阻止來(lái)自特定國(guó)家或地區(qū)的?IP?地址訪問(wèn)你的網(wǎng)站,需要的朋友可以參考下2024-07-07