微服務(wù)部署:藍(lán)綠部署、滾動(dòng)部署、灰度發(fā)布、金絲雀發(fā)布

在項(xiàng)目迭代的過(guò)程中,不可避免需要”上線“。上線對(duì)應(yīng)著部署,或者重新部署;部署對(duì)應(yīng)著修改;修改則意味著風(fēng)險(xiǎn)。

目前有很多用于部署的技術(shù),有的簡(jiǎn)單,有的復(fù)雜;有的得停機(jī),有的不需要停機(jī)即可完成部署。本文的目的就是將目前常用的布署方案做一個(gè)總結(jié)。

一、藍(lán)綠布署

Blue/Green Deployment(藍(lán)綠部署)

1、定義

藍(lán)綠部署是不停老版本,部署新版本然后進(jìn)行測(cè)試,確認(rèn)OK,將流量切到新版本,然后老版本同時(shí)也升級(jí)到新版本。

1、特點(diǎn)

藍(lán)綠部署無(wú)需停機(jī),并且風(fēng)險(xiǎn)較小。

2、布署過(guò)程
第一步、部署版本1的應(yīng)用(一開(kāi)始的狀態(tài))

所有外部請(qǐng)求的流量都打到這個(gè)版本上。

image.png
第二步、部署版本2的應(yīng)用

版本2的代碼與版本1不同(新功能、Bug修復(fù)等)。

第三步、將流量從版本1切換到版本2。
image.png
第四步、如版本2測(cè)試正常,就刪除版本1正在使用的資源(例如實(shí)例),從此正式用版本2。
3、小結(jié)

從過(guò)程不難發(fā)現(xiàn),在部署的過(guò)程中,我們的應(yīng)用始終在線。并且,新版本上線的過(guò)程中,并沒(méi)有修改老版本的任何內(nèi)容,在部署期間,老版本的狀態(tài)不受影響。這樣風(fēng)險(xiǎn)很小,并且,只要老版本的資源不被刪除,理論上,我們可以在任何時(shí)間回滾到老版本。

4、藍(lán)綠發(fā)布的注意事項(xiàng)

當(dāng)你切換到藍(lán)色環(huán)境時(shí),需要妥當(dāng)處理未完成的業(yè)務(wù)和新的業(yè)務(wù)。如果你的數(shù)據(jù)庫(kù)后端無(wú)法處理,會(huì)是一個(gè)比較麻煩的問(wèn)題;

  • 可能會(huì)出現(xiàn)需要同時(shí)處理“微服務(wù)架構(gòu)應(yīng)用”和“傳統(tǒng)架構(gòu)應(yīng)用”的情況,如果在藍(lán)綠部署中協(xié)調(diào)不好這兩者,還是有可能會(huì)導(dǎo)致服務(wù)停止。
  • 需要提前考慮數(shù)據(jù)庫(kù)與應(yīng)用部署同步遷移 /回滾的問(wèn)題。
  • 藍(lán)綠部署需要有基礎(chǔ)設(shè)施支持。
  • 在非隔離基礎(chǔ)架構(gòu)( VM 、 Docker 等)上執(zhí)行藍(lán)綠部署,藍(lán)色環(huán)境和綠色環(huán)境有被摧毀的風(fēng)險(xiǎn)。

二、Rolling update(滾動(dòng)發(fā)布)

1、滾動(dòng)發(fā)布定義

滾動(dòng)發(fā)布:一般是取出一個(gè)或者多個(gè)服務(wù)器停止服務(wù),執(zhí)行更新,并重新將其投入使用。周而復(fù)始,直到集群中所有的實(shí)例都更新成新版本。

2、特點(diǎn)

這種部署方式相對(duì)于藍(lán)綠部署,更加節(jié)約資源——它不需要運(yùn)行兩個(gè)集群、兩倍的實(shí)例數(shù)。我們可以部分部署,例如每次只取出集群的20%進(jìn)行升級(jí)。

這種方式也有很多缺點(diǎn),例如:

(1) 沒(méi)有一個(gè)確定OK的環(huán)境。使用藍(lán)綠部署,我們能夠清晰地知道老版本是OK的,而使用滾動(dòng)發(fā)布,我們無(wú)法確定。
(2) 修改了現(xiàn)有的環(huán)境。
(3) 如果需要回滾,很困難。舉個(gè)例子,在某一次發(fā)布中,我們需要更新100個(gè)實(shí)例,每次更新10個(gè)實(shí)例,每次部署需要5分鐘。當(dāng)滾動(dòng)發(fā)布到第80個(gè)實(shí)例時(shí),發(fā)現(xiàn)了問(wèn)題,需要回滾,這個(gè)回滾卻是一個(gè)痛苦,并且漫長(zhǎng)的過(guò)程。
(4) 有的時(shí)候,我們還可能對(duì)系統(tǒng)進(jìn)行動(dòng)態(tài)伸縮,如果部署期間,系統(tǒng)自動(dòng)擴(kuò)容/縮容了,我們還需判斷到底哪個(gè)節(jié)點(diǎn)使用的是哪個(gè)代碼。盡管有一些自動(dòng)化的運(yùn)維工具,但是依然令人心驚膽戰(zhàn)。
(5) 因?yàn)槭侵鸩礁?,那么我們?cè)谏暇€代碼的時(shí)候,就會(huì)短暫出現(xiàn)新老版本不一致的情況,如果對(duì)上線要求較高的場(chǎng)景,那么就需要考慮如何做好兼容的問(wèn)題。

三、灰度發(fā)布/金絲雀部署

1、定義

灰度發(fā)布是指在黑與白之間,能夠平滑過(guò)渡的一種發(fā)布方式。AB test就是一種灰度發(fā)布方式,讓一部分用戶(hù)繼續(xù)用A,一部分用戶(hù)開(kāi)始用B,如果用戶(hù)對(duì)B沒(méi)有什么反對(duì)意見(jiàn),那么逐步擴(kuò)大范圍,把所有用戶(hù)都遷移到B上面來(lái)?;叶劝l(fā)布可以保證整體系統(tǒng)的穩(wěn)定,在初始灰度的時(shí)候就可以發(fā)現(xiàn)、調(diào)整問(wèn)題,以保證其影響度,而我們平常所說(shuō)的金絲雀部署也就是灰度發(fā)布的一種方式。

注釋?zhuān)?/strong>礦井中的金絲雀
17世紀(jì),英國(guó)礦井工人發(fā)現(xiàn),金絲雀對(duì)瓦斯這種氣體十分敏感。空氣中哪怕有極其微量的瓦斯,金絲雀也會(huì)停止歌唱;而當(dāng)瓦斯含量超過(guò)一定限度時(shí),雖然魯鈍的人類(lèi)毫無(wú)察覺(jué),金絲雀卻早已毒發(fā)身亡。當(dāng)時(shí)在采礦設(shè)備相對(duì)簡(jiǎn)陋的條件下,工人們每次下井都會(huì)帶上一只金絲雀作為“瓦斯檢測(cè)指標(biāo)”,以便在危險(xiǎn)狀況下緊急撤離。

灰度發(fā)布結(jié)構(gòu)圖如下:

image.png
2、灰度發(fā)布/金絲雀發(fā)布由以下幾個(gè)步驟組成:
  • 準(zhǔn)備好部署各個(gè)階段的工件,包括:構(gòu)建工件,測(cè)試腳本,配置文件和部署清單文件。
  • 從負(fù)載均衡列表中移除掉“金絲雀”服務(wù)器。
  • 升級(jí)“金絲雀”應(yīng)用(排掉原有流量并進(jìn)行部署)。
  • 對(duì)應(yīng)用進(jìn)行自動(dòng)化測(cè)試。
  • 將“金絲雀”服務(wù)器重新添加到負(fù)載均衡列表中(連通性和健康檢查)。
  • 如果“金絲雀”在線使用測(cè)試成功,升級(jí)剩余的其他服務(wù)器。(否則就回滾)

除此之外灰度發(fā)布還可以設(shè)置路由權(quán)重,動(dòng)態(tài)調(diào)整不同的權(quán)重來(lái)進(jìn)行新老版本的驗(yàn)證。

參考文章
https://www.v2ex.com/t/344341

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容