如何實現不停機部署?
數次在面試時被問到這個問題,搜集了一些資訊,記錄一下。
聲明:基於我個人的理解撰寫,有可能不是 Best Practice
自己實際操作過的環境
公司 A
程式以 PHP 為主,如果有緊急的 hotfix 要部署,就直接將新的 code 用 rsync 或其他方式直接丟到執行環境。但我們不能把特例當平常,說這是 zero-downtime 好像會被笑。
除此之外每週固定有三小時的停機時間,一般要作任何更改就是在這段時間部署並測試。
公司 B
沒有固定維護時間。
部份服務,如 Nginx Proxy 或 DNS 可以先切走之後,再進行主機規格或組態調整。
其他的服務就沒這麼幸運了,直接線上部署,再趕快接著測看有沒有壞掉,或是等客戶爆炸。
雪上加霜的是這裡的部署是由壁壘分明的運維部門進行的,開發部門想推動流程的改變難度極高。
幾種作法
Rolling update 滾動升級
通常用於已經 Container 化的較為靈活的環境,配合 Load Balancer 來管理流量。
小部份的引入新版本的 instance ,舊的 instance 將現有的事項執行完成後即關閉。
順帶一提,Nginx 的 master / worker 在更新 config 時也是用類似的模式在運作的。\
Blue / Green 藍綠部署
準備兩組不同的環境,一組為原版,另一組為異動過的版本,直接從 Router 或其他可以導流的環節將所有流量導到新的環境,有問題時只需要再切回來即可,缺點是維護另一組環境有一定的成本
canary deployment 金絲雀部署
有點像是Rolling Update ,但不同版本會同時在線上服務,可以用於發現問題或使用者反應
留言