幾種常見的不停機發布方式[轉]

轉自http://www.10tiao.com/html/357/201607/2247484105/1.html

何爲不停機發布?

本文所說的不停機發布,是指在不停止對外服務的前提下完成應用的更新。與熱部署的區別在於,熱部署關注於應用層面並且以不重啓應用爲前提,而不停機發布則關注於服務層面。隨着摩爾定律逐漸逼近極限和多核時代的到來,分佈式應用已經成爲事實上的主流。下文首先給出一種通用的適用於分佈式應用環境的不停機發布方式,然後再介紹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,其基本思想都是在發佈過程中,通過某種機制使得服務請求始終能夠被系統的某個節點或者某個進程處理,從而保證了服務的可用性。

來源:拾貝

原文:http://t.cn/R5R99YU

版權:本文版權歸原作者所有


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章