一篇文章說盡全部軟件發佈

高效能組織和低效能組織在軟件交付的效率上有數量級上的差別。技術組織的軟件交付能力是一種綜合能力,涉及衆多環節,其中發佈是尤其重要的環節。——魯迅數據庫

                                                                   

 

   即便做爲非開發工程師,相信不少人也據說過「金絲雀發佈」、「滾動發佈」和「藍綠髮布」等術語。一個穩定、可控、靈活、用戶體驗良好的發佈流程是發佈流程的一個較爲理想狀態瀏覽器

  老司機想經過一篇文字給各位分享一下常見的幾種發佈模式,讓開發或者非開發人員對軟件發佈一個更爲清晰全面的認識,讓你們可以根據本身的所在團隊的狀況,對發佈策略給出正確的實踐,必要時候參與討(si)論(bi)。服務器

  

一、 金絲雀發佈負載均衡

 

金絲雀 (Canary) 測試。源於之前礦工下礦洞前,先會放一隻金絲雀進去探是否有有毒氣體,看金絲雀可否活下來,由此得名。運維

 

 

簡單的金絲雀測試通常經過手工測試驗證,複雜的金絲雀測試須要比較完善的監控基礎設施配合,經過監控指標反饋,觀察金絲雀的健康情況,做爲後續發佈或回退的依據。工具

 

金絲雀發佈,通常先把新版本發佈到單集羣1臺服務器,或者一個小比例,主要作流量驗證用。測試

若是金絲測試經過,則把剩餘的原有版本所有升級爲新版本。若是金絲雀測試失敗,則直接摘除金絲雀的流量,宣佈發佈失敗。優化

    

金絲雀發佈,簡單可控不粗暴!初創型公司比較適合。spa

 

二、 一羣金絲雀發佈日誌

 

單服務器集羣滾動發佈,老司機給起個名字叫「一羣金絲雀發佈」。

單服務器集羣滾動發佈,在金絲雀發佈基礎上的進一步優化改進,是一種自動化程度較高的發佈方式,用戶體驗比較平滑,是目前成熟型技術組織所採用的主流發佈方式。

前提:滾動發佈須要比較複雜的發佈工具和智能 LB,支持平滑的版本替換和流量拉入拉出

 

單服務器集羣滾動發佈實踐起來這樣的:

1. 先發 1 臺,或者一個小比例,主要作流量驗證用,是否是很像金絲雀 (Canary) 測試;

2. 每次發佈時,先將老版本流量從LB上摘除,清除老版本,發佈新版本,再將LB流量接入新版本;

3. 滾動式發佈每次操做通常由若干個批次組成,每批的數量通常是能夠預設的(使用發佈模板設定)。例如:第一批2%,第二批10%,第三批50%,第四批100%。每批上線之間留觀察間隔,經過人工驗證或監控反饋確保沒有問題,再發下一批次。因此整體上滾動式發佈過程是可控的 (其中第一批的時間通常會比以後的批次更長);

4. 回退過程:將新版本流量從LB上摘除,清除新版本,替換上老版本發佈,再將LB 流量接入老版本。和發佈過程同樣,回退過程通常也比較可控的;

 

滾動發佈學名叫 Rolling Update Deployment。

在老司機看來,像是先放一隻金絲雀,看看沒問題?再放10只金絲雀,還沒問題?再放N只… 直到整個礦井充滿了金絲雀…

 

上面說的是單服務器集羣的滾動發佈,後面會講多服務器集羣的滾動發佈。

 

    以上說的都是單服務器集羣的發佈模式,下面講講雙組服務器集羣的發佈模式。

    

    非單集羣發佈的,都須要LB(Load Balance)進行流量引導和負載均衡調控來實現。

    如下提到的LB,僅僅指代Load Balance(負載均衡),不要有其餘聯想…

三、 藍綠髮布

 

藍綠髮布,爲一次發佈分配兩組服務器,一組運行現有的老版本,一組運行待上線的新版本,再經過LB切換流量方式完成發佈,這就是所謂的雙服務器組發佈方式,俗稱「藍綠髮布」。

 

藍綠髮布實踐起來,簡單粗暴!

1. 老版本稱爲藍組,新版本稱爲綠組,發佈時經過LB一次性將流量從藍組直接切換到綠組,不通過金絲雀和滾動發佈;

2. 出現問題回退,直接經過LB將流量切回藍組;

發佈初步成功後,藍組機器通常不直接回收,而是留一個待觀察期,視具體狀況觀察期的時間可長可短,觀察期事後確認發佈無問題,則能夠回收藍組機器。

 

藍綠髮布,適合簡單粗暴的服務器土豪,畢竟須要準備雙倍的服務器/容器資源。

簡單粗暴,其實也意味着對用戶體會很明顯。

四、 功能開關發佈

 

若是土豪擁有了技術,能夠在代碼層面上作文章。那麼就是另外一種發佈方式:功能開關發佈。

說得通俗一點兒,至關於在功能上作了一個if … else … ,固然實際比這個複雜得多。

五、 紅藍金絲雀發佈

 

配合金絲雀發佈,可讓藍綠髮布不那麼簡單粗暴,可以更精益!

紅藍金絲雀發佈,是對藍綠髮布的一種簡單優化。發佈時先從綠組拉入 1 臺金絲雀,待金絲雀驗證經過再發全量。對比藍綠髮布,該發佈方式的優點是有一個生產流量的金絲雀驗證過程,能夠減輕新版本可能有問題的風險和影響面。

    紅藍金絲雀發佈,若是有問題回退很快,直接經過LB將流量切回老版本便可。

    完成發佈後,通常老版本版本要保留觀察以備萬一,好比留1~2天,後沒有問題則回收老版本服務器、容器資源。

 

六、 進階的發佈模式--A/B發佈

 

A/B發佈,跟A/B測試殊途同歸,相似於升級版的功能切換髮布。

配合LB,控制流量。移動端的流量進A集羣,PC端的流量進B集羣。

 

A/B發佈實踐起來分兩種:

1. 簡單配置:

純基於LB實現A/B試,LB須要可以經過條件作流量路由。例如:經過 client IP,設備類型、瀏覽器類型、甚至是定製的HTTP Header或查詢字符串。

2. 高級定製:

高級的A/B測試須要專門的平臺支撐,這類平臺能夠細粒度到針對某類用戶作 A/B 測試。不在本文討論之列。

 

功能開關發佈和A/B發佈看起來相似,但前者通常是無狀態和全量的,而A/B發佈通常是有狀態的,可以跟蹤事務和用戶級別的狀態能夠實現針對某類特定用戶的。

 

一句話,功能開關發佈是成衣,A/B發佈是高定款。

 

七、 技術大咖才能操做的--影子發佈

 

設想如下場景:

• 核心業務要技術轉型,可是服務不能停;

• 關鍵業務從.NET轉型JAVA,服務不能停;

• 現金業務後臺DB從Oracle轉到MySQL,服務不能停;

……

爲了確保萬無一失,有一種稱爲影子測試的大招,採用比較複雜的流量複製、回放和比對技術實現。

 

影子發佈,具體實踐有點兒複雜:

目標:實現老的遺留系統服務遷移升級到新的服務;

部署啓動前,須要在測試環境部署一份遺留系統服務和新的服務,將生產數據庫複製兩份到測試環境。

同時須要將生產請求導流出來一份,通常能夠經過消息隊列收集、導流。導流目標是將生產請求日誌,複製回放,分發到測試環境裏面的遺留系統服務和新的服務。

測試環境中的兩種服務,收到響應後進行比對,若是全部響應比對成功,則能夠認爲 遺留系統服務和新的服務在功能邏輯上是等價的。

若是有響應比對失敗,則認爲二者在功能邏輯上不等價,須要修復新的環境,並從新進行影子測試,直到所有比對成功。

 

根據系統複雜度和關鍵性不一樣,比對測試時間短的可能須要幾周,長的可達幾個月之久。

 

影子發佈最大的優點,由於旁路在獨立測試環境中進行,能夠對生產流量徹底無影響。

能完成影子發佈的,必須是研發、測試、運維三路大咖聯手才能完成。

 

八、 終極大招--LB發佈

 

最終極、最無敵、最強力、最有效、最無招勝有招…… LB發佈,即:老闆發佈!

老闆說怎麼發佈,我們就怎麼發佈…

相關文章
相關標籤/搜索