究竟為啥總在凌晨上線,如何進行無損發布
為什么很多互聯網公司升級系統,選擇在晚上上線?
美名其曰,晚上上線,對用戶影響最小。
為什么會對用戶產生影響?
很多人認為,系統升級往往需要重啟,重啟的過程中,正在訪問的用戶會訪問失敗。
例如,如果升級的是web-server:
如上圖,重啟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無損升級,需要服務框架支持;
【本文為51CTO專欄作者“58沈劍”原創稿件,轉載請聯系原作者】