漫談金絲雀部署
一些歷史
John Scott Haldane 于 1895 年提出,因?yàn)樾⌒秃銣貏游锏暮粑粨Q比人類更快,礦井中的一氧化碳等有毒氣體或甲烷等窒息性氣體會先影響它們。
比如,同樣的一氧化碳濃度,老鼠會在幾分鐘內(nèi)受到一氧化碳的影響,人類需要 20 倍的時(shí)間才會受到影響,于是 1896 年左右開始,老鼠被用作井下有毒氣體預(yù)警的物種。
一段時(shí)間后,人們發(fā)現(xiàn)金絲雀這種生物對于有毒氣體更加敏感。在 1900 年開始有記錄顯示,一些礦井開始把金絲雀作為井下有毒氣體的預(yù)警物種。
后來,人們?yōu)榱四苤貜?fù)使用金絲雀,發(fā)明了一個用于金絲雀毒氣探測的專用籠子?;\子可以主動充氧,前方設(shè)有一個通氣孔,通氣孔可以通過密閉窗進(jìn)行開啟和關(guān)閉。在需要金絲雀進(jìn)行預(yù)警的時(shí)候,把通氣孔打開。如果籠子中的金絲雀被毒氣毒暈,關(guān)上通氣孔的窗口并讓籠子充滿氧氣。如果金絲雀如果沒有被毒死,就有可能活過來。
來源: https://en.wikipedia.org/wiki/Domestic_canary#/media/File:Revival_cage.jpg
因?yàn)榭萍嫉牟粩喟l(fā)展,有毒氣體探測器被發(fā)明了出來。這種用生命來探測的方式開始逐步退出歷史舞臺。直到1986 年英國和美國完全停止使用金絲雀來作為預(yù)警生物使用。
金絲雀部署,這種部署方式的目標(biāo)與邏輯和使用金絲雀來預(yù)警非常類似(通過開關(guān)通氣孔/流量的方式來控制危害與恢復(fù)能力),我猜想可能大家也希望能紀(jì)念一下在 20 世紀(jì)為礦工獻(xiàn)出生命的金色小鳥們,所以這種方式被冠上了金絲雀的名稱。
了解了名字的來歷,我們開始來了解一下金絲雀部署到底是什么樣的。
基本定義
金絲雀部署是在將更改推廣到整個服務(wù)集群并使其對所有人可用之前,將更改推廣到一小部分用戶進(jìn)行測試。并在測試過程中持續(xù)觀測被測試的服務(wù)各個維度的狀態(tài),驗(yàn)證新版本的健壯性、可用性、穩(wěn)定性等。
當(dāng)驗(yàn)證結(jié)果達(dá)到期望目標(biāo)后,可以逐步將新的版本部署到更多服務(wù)器,使更多用戶使用到它。
優(yōu)勢
(1) 零下線時(shí)間與快速回滾:
在一系列的相關(guān)驗(yàn)證和測試之后,如果新版本的軟件被認(rèn)為不合適,則很容易回滾和控制影響范圍。
(2) 真實(shí)場景下的測試:
由于是直接將新版本部署到生產(chǎn)環(huán)境進(jìn)行測試,所以能夠通過真實(shí)流量對新版本進(jìn)行針對性的驗(yàn)證。當(dāng)然,需要對流量和用戶進(jìn)行限制,來控制驗(yàn)證的范圍和影響面。
(3) 較低的基礎(chǔ)設(shè)施成本:
因?yàn)榻鸾z雀部署策略是通過一定規(guī)則,按規(guī)則對的請求進(jìn)行要求的分流或路由(例如:用戶名、地區(qū)、年齡、隨機(jī)等),所以只需要少量額外的基礎(chǔ)設(shè)施,就可以達(dá)到驗(yàn)證的效果。對比藍(lán)綠部署策略,需要準(zhǔn)備與生產(chǎn)環(huán)境同樣的一套基礎(chǔ)設(shè)施,部署成本顯然會高很多。
靈活的按需進(jìn)行驗(yàn)證相關(guān)版本、功能的正確性。
可以根據(jù)不同的特征和標(biāo)識,對請求的流量進(jìn)行多個維度分流和路由,以達(dá)到不同粒度不同特征的靈活驗(yàn)證。
不是銀彈
雖然金絲雀部署能夠?yàn)榇蠹业牟渴鹛峁?qiáng)力的支持和幫助。但是,軟件工程中是沒有銀彈的。金絲雀部署在很多場景也需要謹(jǐn)慎使用:
- 嚴(yán)格不允許出錯的系統(tǒng),例如:醫(yī)療系統(tǒng)、消防系統(tǒng)等
- 需要部署的數(shù)據(jù)結(jié)構(gòu)無法向下兼容已經(jīng)當(dāng)前版本數(shù)據(jù)結(jié)構(gòu)
雖然阿里云的 MDS 能夠提供分流影子數(shù)據(jù)庫的能力。但是,正式用戶使用的話,依然會影響到實(shí)際的數(shù)據(jù)和行為體驗(yàn)。所以,僅限于測試人員或內(nèi)部用戶體驗(yàn)使用才能發(fā)揮他的能力。
- 非自動化的金絲雀部署,既耗時(shí)又容易出現(xiàn)錯誤。所以,我們應(yīng)該盡可能使用自動化的方式去使用它,而不是手動去維護(hù)分流策略和邏輯。
- 以及很多其他對于生產(chǎn)環(huán)境要求嚴(yán)格的場景,均不建議使用
接下來換個思維,讓我們來看看一些與細(xì)節(jié)無關(guān)的討論。
金絲雀發(fā)布 or 金絲雀部署?
在交流和口語中,大家習(xí)慣于將發(fā)布和部署混用。常常會看到類似于將藍(lán)綠部署、灰度發(fā)布(比起金絲雀大家更愿意用灰度)、滾動發(fā)布等名詞被列舉到一起,以表示他們都是發(fā)布版本的一些不同的方法。
下面我們開始來咬文嚼字。
發(fā)布:
[issue;release;deliver;distribute] 宣布,發(fā)表
例句:向全國發(fā)布新聞
部署:
1. [disposition;deployment]∶處理;料理
例句:炮兵的部署已標(biāo)明在這張地圖上
2. [arrange;lay out]∶安排
例句:部署計(jì)劃
根據(jù)上面的兩個詞典釋義,我是這樣理解發(fā)布和部署的:
發(fā)布廣義上是指思想、觀點(diǎn)、文章和意見等通過報(bào)紙、書刊、網(wǎng)絡(luò)或者公眾演講等文字和演講的形式公之于眾,向外界傳輸消息的一種過程。放在計(jì)算機(jī)這個范疇中時(shí),它是一種將某個特定的軟件放到大家能接觸到的一些地方,被動的讓大家去更新或者同步。比如:我把軟件的某個版本打包發(fā)布了。
部署廣義上是指安排或執(zhí)行人力、計(jì)劃、任務(wù)等。放到計(jì)算機(jī)這個范疇,它是一種將特定軟件安裝或更新到對應(yīng)的環(huán)境中,使其可以為用戶提供服務(wù)。比如:我把新版本部署到測試環(huán)境了,你測試一下。
根據(jù)上面的解釋,我認(rèn)為用更準(zhǔn)確的是金絲雀部署(Canary Deployment)。
與 A/B 測試的關(guān)系
剛開始對金絲雀部署了解時(shí),發(fā)現(xiàn)許多地方將 A/B 測試與金絲雀部署混為一談,甚至有直接將這它們兩個當(dāng)成一個東西來對待。實(shí)際上,在深入了解后,會發(fā)現(xiàn)它們之前確實(shí)是有聯(lián)系,不過還沒達(dá)到可以畫上等號的程度。
相同之處
他們之間的網(wǎng)絡(luò)流量處理邏輯非常相似,都是通過流量不同特征來決定,對流量進(jìn)行服務(wù)的版本。
金絲雀部署可用作實(shí)現(xiàn)A/B 測試的技術(shù)基礎(chǔ)的一部分;但是不要將它們避免混為一談。
不同之處
他們兩者的目的是完全不同的,金絲雀部署被用來檢測問題和回歸功能,A/B 測試是一種來用來測試業(yè)務(wù)設(shè)計(jì)假設(shè)的方法。從二者的目標(biāo)出發(fā),他們測試的和觀測的方法是不一樣的。
金絲雀部署的通常是使用偏技術(shù)側(cè)觀測工具(APM、日志監(jiān)控等)。技術(shù)/開發(fā)人員會對需要部署的新版本服務(wù)進(jìn)行觀測。當(dāng)觀測結(jié)果與預(yù)期相符,則技術(shù)人員可以進(jìn)一步操作。否則,需要先解決問題,再部署和觀測,直到能夠達(dá)到預(yù)期,再進(jìn)行下一步操作。
如果我們用同樣的方式和工具來希望對業(yè)務(wù)觀測,是無法得到準(zhǔn)確結(jié)果的。甚至觀測的人員職能都不同。一般情況下,A/B 測試對觀測部分需要預(yù)先的觀測數(shù)據(jù)收集埋點(diǎn)。接著,對收集到的業(yè)務(wù)數(shù)據(jù)進(jìn)行整理和統(tǒng)計(jì),最終得出相關(guān)的數(shù)據(jù)分析結(jié)果和統(tǒng)計(jì)結(jié)果,以提供給業(yè)務(wù)人員對新業(yè)務(wù)進(jìn)行分析和判斷。
最后,從更時(shí)間的角度來說,業(yè)務(wù)人員在收集足夠的數(shù)據(jù)以證明A/B 測試的顯著性可能需要數(shù)天時(shí)間,而技術(shù)人員希望金絲雀部署在幾分鐘或幾小時(shí)內(nèi)完成。
聊了這么多實(shí)現(xiàn)無關(guān)的話題,接下來讓我們來一起看看,實(shí)現(xiàn)金絲雀部署有哪些辦法吧。
實(shí)現(xiàn)
實(shí)現(xiàn)結(jié)構(gòu)
金絲雀部署的關(guān)鍵點(diǎn)有如下幾點(diǎn):
- 網(wǎng)絡(luò)流量分流
- 分流策略管理
- 多應(yīng)用間分流傳遞策略
- 數(shù)據(jù)兼容性處理
由上圖關(guān)鍵點(diǎn)我們可以通過下圖了解的更加明確:
下面我們從流程入手,看看金絲雀部署具體的執(zhí)行過程是什么樣的。
具體流程
從流程入手,這樣很容易就能了解到金絲雀部署在不同階段,呈現(xiàn)出什么樣的特征,提供了什么樣的能力等。
- 正常階段: 當(dāng)前環(huán)境中只有 1-n 個版本已驗(yàn)證版本, 為所有的用戶提供服務(wù)
- 驗(yàn)證階段:當(dāng)前環(huán)境存在 2 到 n 個版本, 其中有一個已驗(yàn)證版本, 為大部分用戶提供相對穩(wěn)定服務(wù), 剩下的 1 到 n-1 版本為需驗(yàn)證版本, 為特定用戶(某些場景下隨機(jī)挑選)提供相對不穩(wěn)定服務(wù)。同時(shí),持續(xù)觀需驗(yàn)證版本運(yùn)行情況,以判斷該版本是需要進(jìn)行部署,還是進(jìn)行其他處理。
- 部署階段: 某個需驗(yàn)證版本通過驗(yàn)證后,此需驗(yàn)證版本將被部署至計(jì)劃的服務(wù)集群占比。如果,還需進(jìn)一步測試,則又回到驗(yàn)證期進(jìn)行驗(yàn)證.直至,需驗(yàn)證版本部署占比達(dá)到最終需要。往往會使用滾動部署的方式進(jìn)行部署。
- 狀態(tài)流轉(zhuǎn)總覽
實(shí)現(xiàn)方式
這里提到的主要都是服務(wù)器端的實(shí)現(xiàn)方式。
我根據(jù)不同的實(shí)現(xiàn)方式將他們分為下列幾種類型:
- 基礎(chǔ)設(shè)施實(shí)現(xiàn)(IaaS):比如通過阿里云 MDS 工具實(shí)現(xiàn)
- 平臺實(shí)現(xiàn)(PaaS):通過 K8S 的 Ingress 組件或 Istio 來實(shí)現(xiàn)
- 通過 Nginx 等中間件實(shí)現(xiàn):直接在 Nginx 中通過腳本控制流量轉(zhuǎn)發(fā)規(guī)則
- ...
由于,金絲雀部署本身的實(shí)現(xiàn)細(xì)節(jié)與應(yīng)用場景具有緊耦合特性。具體的實(shí)現(xiàn)方法就不在這里展開了。在使用過程中關(guān)注文中提到它的特性與注意事項(xiàng)(不是銀彈)以及具體的執(zhí)行流程和結(jié)構(gòu)來進(jìn)行部署。我在這里做的更多的拋磚引玉,希望大家能有更多金絲雀部署的精彩內(nèi)容和思考能一起來討論。
最后
來源:http://coachellavalleyweekly.com/canary-in-a-coal-mine/
20 世紀(jì)的某一天,昏暗的狹窄的礦井中。頭戴礦燈的礦工一手提著一個籠子,另一手并著腳努力的往前爬行,汗水裹著黑色的粉末在臉上往下流淌。美麗的鳥兒在搖搖晃晃的籠子中努力的保持著平衡,不知道迎接他僥幸逃脫后的陽光還是窒息的毒氣。