【CI/CD】幾種常見的不停機發布方式

來源:互聯網
上載者:User

何為不停機發布?

本文所說的不停機發布,是指在 不停止對外服務 的前提下完成應用的更新。與 熱部署 的區別在於,熱部署關注於 應用 層面並且以 不重啟應用 為前提,而不停機發布則關注於 服務 層面。隨著摩爾定律逐漸逼近極限和多核時代的到來,分布式應用已經成為事實上的主流。下文首先給出一種通用的適用於分布式應用環境的不停機發布方式,然後再介紹Master/Worker這種常見的適用於單機應用的不停機發布方式。

Cluster模式

對於運行於叢集環境的分布式應用,一般在應用之上都有一層負載平衡(LB)。如果在發布過程中,在更新任一節點(也可以是一組節點)前先關閉該節點對應的負載,更新完再開啟負載,即可實現整體服務的不停機發布。在此基礎上,為了保證服務的穩定性,可以加上備機的支援,即更新某一節點時,先掛上備機,更新完再卸下,依次輪換更新完所有節點後最後再升級備機,如所示:

完整設計可以參考我寫的另一篇 文章

上述發布過程其實就是一個簡單的CD(Continuous Deployment)系統。作為一個參考實現,可以使用 Jenkins 2.0 Pipeline 特性定義整個發布流程,使用 Nginx Dynamic Upstream 外掛程式操縱Nginx,然後配合指令碼完成應用的啟停和檢測。

Master/Worker模式

對於單機應用,由於不存在LB,一般由應用程式容器實現不停機發布特性,最常見是Master/Worker模式。容器中常駐一個master進程和多個work進程,master進程只負責載入程式和分發請求,由fork出來的worker進程完成具體工作。當容器收到更新應用的訊號時,master進程重新載入更新後的程式,然後fork新的worker進程處理新的請求,而老的worker進程在處理完當前請求後就自動銷毀。Ruby的 Unicorn ,PHP的 FPM 都是採用了這套機制。

延伸閱讀

不同於Master/Worker模式,erlang採用了另一種獨特的方式實現了不停機發布。

erlang VM為每個模組最多儲存2份代碼,目前的版本'current'和舊版本'old',當模組第一次被載入時,代碼就是'current'版本。如果有新的代碼被載入,'current'版本代碼就變成了'old'版本,新的代碼就成了'current'版本。erlang用兩個版本共存的方法來保證任何時候總有一個版本可用,對外服務就不會停止。



—— 引自 分析erlang熱更新實現機制

小結

不管是LB,還是Master/Worker,其基本思想都是在發布過程中,通過某種機制使得服務要求始終能夠被系統的某個節點或者某個進程處理,從而保證了服務的可用性。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.