微服务部署:蓝绿部署、滚动部署、灰度发布等部署方案对比与总结
在項(xiàng)目迭代的過程中,不可避免需要”上線“。上線對(duì)應(yīng)著部署,或者重新部署;部署對(duì)應(yīng)著修改;修改則意味著風(fēng)險(xiǎn)。
目前有很多用于部署的技術(shù),有的簡(jiǎn)單,有的復(fù)雜;有的得停機(jī),有的不需要停機(jī)即可完成部署。本文筆者簡(jiǎn)單討論一下目前比較流行的幾種部署方案,或者說策略。如有不足之處請(qǐng)指出,如有謬誤,請(qǐng)指正_。
Blue/Green Deployment(藍(lán)綠部署)
藍(lán)綠部署無需停機(jī),并且風(fēng)險(xiǎn)較小。
(1) 部署版本1的應(yīng)用(一開始的狀態(tài))
所有外部請(qǐng)求的流量都打到這個(gè)版本上。
(2) 部署版本2的應(yīng)用
版本2的代碼與版本1不同(新功能、Bug修復(fù)等)。
(3) 將流量從版本1切換到版本2。
(4) 如版本2測(cè)試正常,就刪除版本1正在使用的資源(例如實(shí)例),從此正式用版本2。
從過程不難發(fā)現(xiàn),在部署的過程中,我們的應(yīng)用始終在線。并且,新版本上線的過程中,并沒有修改老版本的任何內(nèi)容,在部署期間,老版本的狀態(tài)不受影響。這樣風(fēng)險(xiǎn)很小,并且,只要老版本的資源不被刪除,理論上,我們可以在任何時(shí)間回滾到老版本。
rolling update(滾動(dòng)發(fā)布)
滾動(dòng)發(fā)布,一般是取出一個(gè)或者多個(gè)服務(wù)器停止服務(wù),執(zhí)行更新,并重新將其投入使用。周而復(fù)始,直到集群中所有的實(shí)例都更新成新版本。
這種部署方式相對(duì)于藍(lán)綠部署,更加節(jié)約資源——它不需要運(yùn)行兩個(gè)集群、兩倍的實(shí)例數(shù)。我們可以部分部署,例如每次只取出集群的20%進(jìn)行升級(jí)。
這種方式也有很多缺點(diǎn),例如:
(1) 沒有一個(gè)確定OK的環(huán)境。使用藍(lán)綠部署,我們能夠清晰地知道老版本是OK的,而使用滾動(dòng)發(fā)布,我們無法確定。
(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)了問題,需要回滾。此時(shí),脾氣不好的程序猿很可能想掀桌子,因?yàn)榛貪L是一個(gè)痛苦,并且漫長(zhǎng)的過程。
(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)。
并不是說滾動(dòng)發(fā)布不好,滾動(dòng)發(fā)布也有它非常合適的場(chǎng)景。
灰度發(fā)布/金絲雀部署
先貼個(gè)百度百科:
灰度發(fā)布是指在黑與白之間,能夠平滑過渡的一種發(fā)布方式。AB test就是一種灰度發(fā)布方式,讓一部分用戶繼續(xù)用A,一部分用戶開始用B,如果用戶對(duì)B沒有什么反對(duì)意見,那么逐步擴(kuò)大范圍,把所有用戶都遷移到B上面來。灰度發(fā)布可以保證整體系統(tǒng)的穩(wěn)定,在初始灰度的時(shí)候就可以發(fā)現(xiàn)、調(diào)整問題,以保證其影響度。
很多人把灰度發(fā)布與藍(lán)綠部署混為一談,筆者認(rèn)為,與灰度發(fā)布最類似的應(yīng)該是金絲雀部署。
“金絲雀部署”是增量發(fā)布的一種類型,它的執(zhí)行方式是在原有軟件生產(chǎn)版本可用的情況下,同時(shí)部署一個(gè)新的版本。同時(shí)運(yùn)行同一個(gè)軟件產(chǎn)品的多個(gè)版本需要軟件針對(duì)配置和完美自動(dòng)化部署進(jìn)行特別設(shè)計(jì)。
我們來看一下金絲雀部署的步驟:
(1) 準(zhǔn)備好部署各個(gè)階段的工件,包括:構(gòu)建工件,測(cè)試腳本,配置文件和部署清單文件。
(2) 從負(fù)載均衡列表中移除掉“金絲雀”服務(wù)器。
(3) 升級(jí)“金絲雀”應(yīng)用(排掉原有流量并進(jìn)行部署)。
(4) 對(duì)應(yīng)用進(jìn)行自動(dòng)化測(cè)試。
(5) 將“金絲雀”服務(wù)器重新添加到負(fù)載均衡列表中(連通性和健康檢查)。
(6) 如果“金絲雀”在線使用測(cè)試成功,升級(jí)剩余的其他服務(wù)器。(否則就回滾)
灰度發(fā)布中,常常按照用戶設(shè)置路由權(quán)重,例如90%的用戶維持使用老版本,10%的用戶嘗鮮新版本。不同版本應(yīng)用共存,經(jīng)常與A/B測(cè)試一起使用,用于測(cè)試選擇多種方案。灰度發(fā)布比較典型的例子,是阿里云那個(gè)“新版本”,點(diǎn)擊“進(jìn)入新版本”,我們就成了金絲雀。
趣聞 :金絲雀部署(同理還有金絲雀測(cè)試),“金絲雀”的由來:17世紀(jì),英國(guó)礦井工人發(fā)現(xiàn),金絲雀對(duì)瓦斯這種氣體十分敏感。空氣中哪怕有極其微量的瓦斯,金絲雀也會(huì)停止歌唱;而當(dāng)瓦斯含量超過一定限度時(shí),雖然魯鈍的人類毫無察覺,金絲雀卻早已毒發(fā)身亡。當(dāng)時(shí)在采礦設(shè)備相對(duì)簡(jiǎn)陋的條件下,工人們每次下井都會(huì)帶上一只金絲雀作為“瓦斯檢測(cè)指標(biāo)”,以便在危險(xiǎn)狀況下緊急撤離。
總結(jié)
(1) 藍(lán)綠部署:不停止老版本,額外搞一套新版本,等測(cè)試發(fā)現(xiàn)新版本OK后,刪除老版本。
(2) 滾動(dòng)發(fā)布:按批次停止老版本實(shí)例,啟動(dòng)新版本實(shí)例。
(3) 灰度發(fā)布/金絲雀部署:不停止老版本,額外搞一套新版本,常常按照用戶設(shè)置路由權(quán)重,例如90%的用戶維持使用老版本,10%的用戶嘗鮮新版本。不同版本應(yīng)用共存,經(jīng)常與A/B測(cè)試一起使用,用于測(cè)試選擇多種方案。
參考文檔
(1) 《Blue-green Deployments, A/B Testing, and Canary Releases》(有圖文說明,必看):http://blog.christianposta.com/deploy/blue-green-deployments-a-b-testing-and-canary-releases/
(2) Martin Fowler《BlueGreenDeployment》(必看):https://martinfowler.com/bliki/BlueGreenDeployment.html
(3) 《在生產(chǎn)中使用金絲雀部署來進(jìn)行測(cè)試》:http://www.infoq.com/cn/news/2013/03/canary-release-improve-quality
(4) 《Using Blue-Green Deployment to Reduce Downtime and Risk(使用爛藍(lán)綠部署降降低停機(jī)時(shí)間與風(fēng)險(xiǎn),基于CloudFoundry)》:http://docs.cloudfoundry.org/devguide/deploy-apps/blue-green.html
(5) 《marathon:Blue-Green Deployment》:https://mesosphere.github.io/marathon/docs/blue-green-deploy.html ,譯文:http://blog.csdn.net/zhuchuangang/article/details/51064974 。
(6) 《微服務(wù)不是免費(fèi)的午餐》:http://blog.csdn.net/phodal/article/details/27098005
(7) 《藍(lán)綠發(fā)布的整個(gè)部署過程》:http://www.tuicool.com/articles/2Iji2ue
本文鏈接: http://www.itmuch.com/work/microservice-deploy/
**版權(quán)聲明: **本博客由周立創(chuàng)作,采用 CC BY 3.0 CN 許可協(xié)議。可自由轉(zhuǎn)載、引用,但需署名作者且注明文章出處。如轉(zhuǎn)載至微信公眾號(hào),請(qǐng)?jiān)谖哪┨砑幼髡吖娞?hào)二維碼。
總結(jié)
以上是生活随笔為你收集整理的微服务部署:蓝绿部署、滚动部署、灰度发布等部署方案对比与总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 纯CSS3实现轮播图
- 下一篇: 微信小程序学习:开发注意点