藍綠部署適合關(guān)鍵服務(wù),滾動更新適合無狀態(tài)服務(wù)。藍綠部署通過兩套環(huán)境切換實現(xiàn)零停機,需注意環(huán)境一致性、切換方式和回滾機制;滾動更新逐步替換實例,依賴健康檢查和最小可用數(shù)控制,適用于 kubernetes 等編排平臺;選擇策略時需考慮服務(wù)狀態(tài)、接口兼容性和技術(shù)棧;實際部署中均需關(guān)注優(yōu)雅終止、探針設(shè)置、dns 緩存及日志追蹤等問題。
在 golang 微服務(wù)部署中,實現(xiàn)零停機更新是保障系統(tǒng)高可用的重要手段。常見的做法有兩種:藍綠部署和滾動更新。它們各有適用場景,也都有需要注意的細節(jié)。
下面從實際操作角度出發(fā),講講這兩種策略怎么用、什么時候用,以及容易踩坑的地方。
藍綠部署:兩套環(huán)境切換,適合關(guān)鍵服務(wù)
藍綠部署的核心思想是維護兩套完全相同的生產(chǎn)環(huán)境(藍和綠),一次只有一套對外提供服務(wù)。新版本部署到空閑的一套后,通過負載均衡器或反向代理切換流量。
立即學(xué)習(xí)“go語言免費學(xué)習(xí)筆記(深入)”;
實現(xiàn)要點:
- 環(huán)境一致性:兩個環(huán)境必須配置一致,包括依賴服務(wù)、數(shù)據(jù)庫版本等。
- 切換方式:可以通過 nginx、Kubernetes Service 或云廠商提供的負載均衡器來切換流量。
- 回滾快速:如果新版本出問題,只需要切回原來的環(huán)境即可。
適合場景:
- 對穩(wěn)定性要求極高,不能容忍任何請求失敗的服務(wù)
- 版本之間改動較大,需要完整驗證新環(huán)境是否正常
注意事項:
- 成本較高,需要雙倍資源
- 如果有狀態(tài)服務(wù)(如本地緩存、文件存儲),處理起來會比較麻煩
滾動更新:逐步替換實例,適合無狀態(tài)服務(wù)
滾動更新是 Kubernetes 等編排系統(tǒng)默認支持的一種策略,它會逐步替換舊版本的 Pod,同時確保始終有一定數(shù)量的健康實例在運行。
實現(xiàn)要點:
- 分批更新:每次更新一部分 Pod,其余繼續(xù)處理請求
- 健康檢查配合:Liveness 和 Readiness 探針要設(shè)置合理,避免將流量導(dǎo)到未就緒的實例
- 最小可用數(shù)控制:設(shè)置 minReadySeconds 和 maxUnavailable,防止更新過程中服務(wù)不可用
適合場景:
- 服務(wù)本身是無狀態(tài)的
- 請求可以容忍短暫中斷(比如前端調(diào)用有重試機制)
- 使用 Kubernetes 等容器編排平臺
常見問題:
- 新舊版本共存期間,如果有接口不兼容,可能導(dǎo)致部分請求失敗
- 數(shù)據(jù)庫遷移如果沒有同步處理,可能引發(fā)數(shù)據(jù)結(jié)構(gòu)不一致
如何選擇:藍綠還是滾動?
這取決于你的業(yè)務(wù)特點和技術(shù)棧:
- 如果你使用的是 Kubernetes 并且服務(wù)是無狀態(tài)的,滾動更新更輕量高效
- 如果你希望新版本上線前完全準備好,并且能快速回滾,藍綠部署更適合
- 如果服務(wù)對可用性要求極高,又擔心滾動更新過程中的兼容問題,也可以先在灰度環(huán)境中測試后再全量更新
實際部署建議
不管用哪種策略,下面幾點都需要注意:
- ? 優(yōu)雅終止:Golang 應(yīng)用要監(jiān)聽 SIGTERM,完成當前請求再退出
- ? 探針設(shè)置合理:Readiness Probe 不要太激進,否則剛啟動的服務(wù)會被誤判為異常
- ? DNS 緩存注意:客戶端如果緩存了 IP 地址,可能會導(dǎo)致流量還打到舊 Pod 上
- ? 日志追蹤配合:新舊版本混跑時,日志要有版本號標識,方便排查問題
基本上就這些。兩種策略都不復(fù)雜,但要真正做到“零停機”,還得結(jié)合具體服務(wù)的特點做調(diào)整。