天天看點

靈活/持續內建/持續傳遞/DevOps基本理論全面解析(下)

3.5 測試部署效果

藍綠部署(Blue-Green Deployment)

一種應用釋出模式,可将使用者流量從先前版本的應用或微服務逐漸轉移到幾乎相同的新版本中(兩者均保持在生産環境中運作)。

該種部署軟體的方法中,維護兩個相同的主機環境

藍色

舊版本的生産環境

綠色

新版本的預釋出環境

一旦生産流量從藍色完全轉移到綠色,藍色就可在復原或退出生産的情況下保持待機,也可更新成為下次更新的模闆。

自動化部署面臨的挑戰之一是轉換本身,将軟體從測試的最後階段轉移到實際生産中。通常,您需要快速執行此操作,以最大程度減少停機時間。藍綠部署方法通過確定擁有兩個盡可能相同的生産環境來做到這一點。

在任何時候,其中一個(例如藍色)都處于活動狀态。準備新版本的軟體時,在綠色環境中進行最後的測試階段。一旦軟體在綠色環境中運作,就可以切換路由器,以便所有傳入請求都進入綠色環境-藍色的請求現在處于空閑狀态。

藍綠部署還提供了快速復原的方法-如果出現任何問題,将路由切換回藍色環境。

在綠色環境處于活動狀态時,仍然存在處理丢失的事務的問題,你可能能夠以在綠色環境處于活動狀态時将藍色環境作為備份的方式向這兩個環境提供交易。或者,您可以在切換前将應用程式置于隻讀模式,以隻讀模式運作一段時間,然後将其切換為讀寫模式。這可能足以清除許多未解決的問題。

兩種環境必須不同,但要盡可能相同。在某些情況下,它們可以是不同的硬體,也可以是在相同(或不同)硬體上運作的不同虛拟機。它們也可以是一個單獨的操作環境,分為兩個區域,兩個區域具有單獨的IP位址。

将綠色環境投入使用并對它的穩定性感到滿意之後,就可以将藍色環境用作過渡環境,以進行下一個部署的最後測試步驟。準備好釋出下一個版本時,你從綠色切換為藍色的方式與之前從藍色切換為綠色的方式相同。這樣,綠色和藍色環境便會定期在實時上一個版本(用于復原)和下一個新版本之間進行循環。

這種方法的一個優點是,它與獲得熱備份工作所需的基本機制相同。是以,這使您可以在每個版本上測試災難恢複過程。 (我希望你釋出的時間比災難多得多。)基本思想是要在兩個易于切換的環境之間進行切換,有很多方法可以更改細節。一個項目通過跳動Web伺服器而不是在路由器上工作來進行切換。另一種變化是使用相同的資料庫,進而為Web和域層設定了藍綠色的開關。使用這種技術,資料庫通常可能是一個挑戰,尤其是當您需要更改架構以支援軟體的新版本時。技巧是将架構更改的部署與應用程式更新分開。是以,首先應用資料庫重構來更改架構以支援應用程式的新舊版本,進行部署,檢查一切是否正常,以便您有一個復原點,然後部署該應用程式的新版本。 (并且在更新失敗後,删除對舊版本的資料庫支援。)

該技術已經存在了很長時間了,但是Martin Fowler并不認為它應該經常使用。 Daniel Terhorst-North和Jez Humble的一些模糊組合提出了這個名稱。

這種持續部署模式原本存在不足之處。并非所有環境都具有相同的正常運作時間要求或正确執行 CI/CD 流程(如藍綠部署)所需的資源。但是,随着企業加大對數字化轉型的支援,許多應用開始支援這種。

模型圖

在這些執行個體的前面是排程系統,它們充當産品或應用程式的客戶“網關”。通過将排程系統指向藍色或綠色執行個體,可以将客戶流量引流到期望的部署環境。通過這種方式,切換指向哪個部署執行個體(藍色或綠色)對使用者來說是快速簡單而透明的。

靈活/持續內建/持續傳遞/DevOps基本理論全面解析(下)

金絲雀部署(灰階釋出)

一部分客戶流量被重新引流到新的版本部署中。例如,新版本的搜尋服務可與目前服務的生産版本一起部署。

然後,可将10%的搜尋查詢引流到新版本,以在生産環境中對其進行測試。

如果服務那些流量的新版本沒問題,那麼可能會有更多流量會被逐漸引流過去。如果仍然沒有問題出現,那麼随時間推移,可對新版本增量部署,直到100%的流量都排程到新版本。

靈活/持續內建/持續傳遞/DevOps基本理論全面解析(下)

暗釋出(DarkLaunching)

也叫功能開關,指軟體特性在正式釋出之前,先将其第一個版本部署到生産環境。通過應用“開關”技術,使使用者在無感的情況下應用新特性的功能,軟體提供商通過收集使用者的實際操作記錄來獲得針對這個新特性的回報資料。

當然,釋出新特性,使使用者無感還是比較難做到的。新特性所針對軟體的改變通常不展現在使用者經常使用的界面按鈕的調整,更多的是背景交易邏輯或算法層面的調整。

對于可能需要輕松關掉的新功能(若發現有問題),開發人員可添加功能開關(feature toggles)。這是代碼中的if-then軟體功能開關,僅在設定資料值時才激活新代碼。

此資料值可以是全可通路的位置,部署的應用程式将檢查該位置是否應執行新代碼。如果設定了資料值,則執行代碼;如果沒有,則不執行。

這為開發人員提供了一個遠端“終止開關”,以便在部署到生産環境後發現問題時關閉新功能。

靈活/持續內建/持續傳遞/DevOps基本理論全面解析(下)

案例

某網際網路公司重新開發了一個線上新聞推薦算法,希望能夠為其使用者推薦更多和更好的新聞内容。但是,由于此算法相對于以前算法的複雜度較高,提供算法的公司需要搜集該算法的執行效果。基于這種需求,我們就可以應用暗部署的方法。我們可以為這個算法配置一個開關,并将其部署到生産環境中。當針對這個算法的開關打開時,使用者的通路流浪就會觸發這個新算法的執行。通常使用者并不知道其此次通路所調用的算法的新舊。如果這個算法在大規模使用者并發情況下的性能不好,我們就可以馬上關閉這個算法所對應的開關,讓使用者使用原來的算法。

參考

https://www.mindtheproduct.com/what-the-hell-are-ci-cd-and-devops-a-cheatsheet-for-the-rest-of-us/ https://tech.youzan.com/gray-deloyments-and-blue-green-deployments-practices-in-youzan/ http://stormluke.me/deploy-not-equal-release-part-one/ https://martinfowler.com/bliki/BlueGreenDeployment.html