究竟為啥總在凌晨上線,如何進(jìn)行無損發(fā)布
為什么很多互聯(lián)網(wǎng)公司升級(jí)系統(tǒng),選擇在晚上上線?
美名其曰,晚上上線,對(duì)用戶影響最小。
為什么會(huì)對(duì)用戶產(chǎn)生影響?
很多人認(rèn)為,系統(tǒng)升級(jí)往往需要重啟,重啟的過程中,正在訪問的用戶會(huì)訪問失敗。
例如,如果升級(jí)的是web-server:
如上圖,重啟ip1上的tomcat時(shí),tomcat上或許有1000個(gè)http請(qǐng)求正在處理,這些請(qǐng)求就會(huì)失敗。
又例如,如果升級(jí)的是service:
如上圖,重啟ip1的service時(shí),service上或許有2000個(gè)請(qǐng)求正在處理,這些請(qǐng)求就會(huì)失敗。
web-server升級(jí)能否不影響正在處理的請(qǐng)求?
可以,需要nginx和web-server配合。
(1) 給nginx發(fā)指令,將ip1上的流量切走;
(2)nginx不會(huì)將新流量放給ip1,舊流量會(huì)很快處理完成;
(3)舊流量完成后,升級(jí)web-server;
此時(shí),ip1上的web-server處于沒有流量的狀況,可以隨便玩:
- 停服務(wù)備份
- 升級(jí)(粉色代表升級(jí)后的節(jié)點(diǎn))
- 服務(wù)重啟
- 測(cè)試工程師直連ip1進(jìn)行驗(yàn)證
- 驗(yàn)證完畢
(4) 給nginx發(fā)指令,將流量切回ip1;
(5) 流量切回ip1,單節(jié)點(diǎn)上線成功;
一個(gè)節(jié)點(diǎn)升級(jí)完成之后,其他節(jié)點(diǎn)可以依次逐臺(tái)升級(jí)。
service升級(jí)能否不影響正在處理的請(qǐng)求?
可以,需要RPC-client和RPC-server配合。
(1)向準(zhǔn)備升級(jí)的service節(jié)點(diǎn)ip1發(fā)送切流量指令;
這里和web-service不同:
- web-service是向上游nginx發(fā)指令切流量;
- service是通過下游server發(fā)指令切流量;
(2) RPC-server通過tcp長(zhǎng)連接將切流量的指令通知RPC-client;
執(zhí)行切流量指令的組件最終是RPC-client上的tcp連接池。
(3) RPC-client不再將新流量放給ip1,舊流量逐步處理完成;
為啥不能像web-server一樣,直接給上游nginx發(fā)指令呢,因?yàn)閟ervice有太多的上游。
(4) 舊流量逐步遷移完成,RPC-client會(huì)間歇性重連;
此時(shí),ip1上的service處于沒有流量的狀況,可以隨便玩:
- 停服務(wù)備份
- 升級(jí)(粉色代表升級(jí)后的節(jié)點(diǎn))
- 服務(wù)重啟
這個(gè)過程中,RPC-client會(huì)間歇性嘗試重連(例如每分鐘重試一次),直至ip1節(jié)點(diǎn)恢復(fù);
(5)流量切回ip1,單節(jié)點(diǎn)上線成功;
一個(gè)節(jié)點(diǎn)升級(jí)完成之后,其他節(jié)點(diǎn)可以依次逐臺(tái)升級(jí)。
是否還有其他注意事項(xiàng)?
- 如果沒有實(shí)現(xiàn)服務(wù)自動(dòng)發(fā)現(xiàn),服務(wù)治理,早期可以這么玩;
- web-server無損升級(jí),強(qiáng)烈建議腳本化;
- service無損升級(jí),需要服務(wù)框架支持;
【本文為51CTO專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】