藍綠部署

2010 年 3 月 1 日

我和我的同事們強烈建議客戶的目標之一是完全自動化的部署程序。自動化部署有助於減少軟體「完成」與實現其價值之間產生的摩擦和延遲。Dave Farley 和 Jez Humble 正在完成一本關於此主題的書 - 持續交付。它建立在許多通常與 持續整合 相關聯的想法之上,更進一步朝向快速將軟體投入生產並使其發揮作用的能力。他們關於藍綠部署的部分引起了我的注意,因為這是一種未被充分利用的技術,所以我認為我可以在這裡簡要概述一下。

自動化部署的挑戰之一是切換本身,將軟體從測試的最後階段轉移到實際生產。為了最大程度地減少停機時間,您通常需要快速執行此操作。藍綠部署方法通過確保您擁有兩個盡可能相同的生產環境來做到這一點。在任何時候,其中一個(例如藍色)是實時的。當您準備軟體的新版本時,您會在綠色環境中進行最後階段的測試。一旦軟體在綠色環境中運行,您就會切換路由器,以便所有傳入請求都轉到綠色環境 - 藍色環境現在處於閒置狀態。

藍綠部署也提供你一個快速回滾的方法 - 如果有任何問題,你將路由器切換回藍色環境。在綠色環境上線時,仍有處理遺漏交易的問題,但根據你的設計,你可能會以某種方式將交易提供給兩個環境,以便在綠色環境上線時將藍色環境作為備份。或者你可以在切換之前將應用程式設為唯讀模式,在唯讀模式下執行一段時間,然後將其切換為讀寫模式。這可能足以解決許多未決問題。

這兩個環境需要不同,但要盡可能相同。在某些情況下,它們可以是不同的硬體,或者它們可以是在相同(或不同)硬體上執行的不同虛擬機器。它們也可以是單一作業環境,分割成具有兩個區段的獨立區域,並為這兩個區段提供獨立的 IP 位址。

一旦你讓你的綠色環境上線,並且對其穩定性感到滿意,你就可以使用藍色環境作為你的暫存環境,作為下一次部署的最後測試步驟。當你準備好下一個版本時,你可以從綠色切換到藍色,就像你之前從藍色切換到綠色一樣。這樣,綠色和藍色環境會定期在線上、先前版本(用於回滾)和暫存下一個版本之間循環。

這種方法的一個優點是,它與讓熱備用程式運作所需的相同基本機制相同。因此,這允許你在每次版本發佈時測試你的災難復原程序。(我希望你的版本發佈頻率高於你遇到災難的頻率。)

基本概念是要有兩個容易切換的環境,在它們之間切換,有很多方法可以改變細節。一個專案透過彈跳網路伺服器而不是在路由器上工作來進行切換。另一個變化是使用相同的資料庫,為網路和網域層進行藍綠切換。

資料庫通常會對這種技術構成挑戰,特別是在你需要變更架構以支援新版本的軟體時。訣竅是將架構變更的部署與應用程式升級分開。因此,首先套用資料庫重構來變更架構以支援應用程式的舊版本和新版本,部署它,檢查一切是否正常運作,這樣你就有了一個回滾點,然後部署新版本的應用程式。(並且當升級已穩定下來時,移除資料庫對舊版本的支援。)

這種技術已經「存在」很長一段時間了,但我沒有看到它像應該的那樣經常被使用。 Daniel Terhorst-North 和 Jez Humble 想出了這個名稱 的某種模糊組合。

進一步閱讀

您可以在 Jez Humble 和 Dave Farley 合著的 持續交付書籍 中找到更多關於此技術及其相關技術的詳細資訊。我在 交付指南頁面 中提供了更多關於這些主題的資料。

致謝

插圖由 Ketan Padegaonkar 繪製

更新

2015-06-05:由於 Hacker News 注意到此頁面,因此今天有大量流量湧入。因此,我新增了一段關於資料庫變更的段落,以及延伸閱讀部分。