爲啥總在凌晨上線,如何無損發佈

爲何不少公司升級系統,選擇在晚上上線?nginx

:美名其曰,晚上上線,對用戶影響最小。web

 

爲何會對用戶產生影響?tomcat

:系統升級每每須要重啓,重啓的過程當中,正在訪問的用戶會訪問失敗。框架

 

若是升級的是web-server:tcp

爲啥總在凌晨上線,如何無損發佈

 

 

如上圖,重啓ip1上的tomcat時,tomcat上或許有1000個http請求正在處理,這些請求就會失敗。分佈式

 

若是升級的是service:微服務

爲啥總在凌晨上線,如何無損發佈

 

 

如上圖,重啓ip1的service時,service上或許有2000個請求正在處理,這些請求就會失敗。源碼分析

 

web-server升級可否不影響正在處理的請求?性能

:能夠,須要nginx和web-server配合。學習

 

(1)給nginx發指令,將ip1上的流量切走

爲啥總在凌晨上線,如何無損發佈

 

 

(2)nginx不會將新流量放給ip1,舊流量會很快處理完成

爲啥總在凌晨上線,如何無損發佈

 

 

(3)舊流量完成後,升級web-server

爲啥總在凌晨上線,如何無損發佈

 

 

此時,ip1上的web-server處於沒有流量的情況,能夠隨便玩:

  • 停服務備份
  • 升級(粉色表明升級後的節點)
  • 服務重啓
  • 測試工程師直連ip1進行驗證
  • 驗證完畢

 

(4)給nginx發指令,將流量切回ip1

爲啥總在凌晨上線,如何無損發佈

 

 

(5)流量切回ip1,單節點上線成功

爲啥總在凌晨上線,如何無損發佈

 

 

一個節點升級完成以後,其餘節點能夠依次逐臺升級。

 

service升級可否不影響正在處理的請求?

:能夠,須要RPC-client和RPC-server配合。

 

(1)向準備升級的service節點ip1發送切流量指令

爲啥總在凌晨上線,如何無損發佈

 

 

這裏和web-service不一樣:

  • web-service是向上遊nginx發指令切流量
  • service是經過下游server發指令切流量

 

(2)RPC-server經過tcp長鏈接將切流量的指令通知RPC-client

爲啥總在凌晨上線,如何無損發佈

 

 

執行切流量指令的組件最終是RPC-client上的tcp鏈接池。

 

(3)RPC-client再也不將新流量放給ip1,舊流量逐步處理完成

爲啥總在凌晨上線,如何無損發佈

 

 

爲啥不能像web-server同樣,直接給上游nginx發指令呢,由於service有太多的上游。

 

(4)舊流量逐步遷移完成,RPC-client會間歇性重連

爲啥總在凌晨上線,如何無損發佈

 

 

此時,ip1上的service處於沒有流量的情況,能夠隨便玩:

  • 停服務備份
  • 升級(粉色表明升級後的節點)
  • 服務重啓

 

這個過程當中,RPC-client會間歇性嘗試重連(例如每分鐘重試一次),直至ip1節點恢復

 

(5)流量切回ip1,單節點上線成功

爲啥總在凌晨上線,如何無損發佈

 

 

一個節點升級完成以後,其餘節點能夠依次逐臺升級

 

是否還有其餘注意事項?

  • 若是沒有實現服務自動發現,服務治理,早期能夠這麼玩
  • web-server無損升級,強烈建議腳本化
  • service無損升級,須要服務框架支持
  • 若是想學習Java工程化、高性能及分佈式、深刻淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友能夠加個人Java高級交流:787707172,羣裏有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給你們。
相關文章
相關標籤/搜索