藍綠發(fā)布實踐回顧
0緣起
隨著藍綠發(fā)布項目落地進入試運行,也對藍綠發(fā)布項目做個簡要回顧。
早在2022年初的時候效能、交易和中間件的同學(xué)就如何提高發(fā)布效率做過討論,藍綠發(fā)布當(dāng)時也被提出。由于彼時有更重要的事情去落地,藍綠發(fā)布也被擱置未能成行。
隨著染色環(huán)境項目的落地,推進接入工作的基本完成。測試開發(fā)環(huán)境存在的眾多問題(多套環(huán)境、運維問題、環(huán)境沖突、溝通問題)基本得到根治。
測試環(huán)境得到根治的同時,生產(chǎn)環(huán)境自然就成為接下來的重點。大版本發(fā)布時長達7個小時,的確是大家的痛點,我們也希望從根本上提高發(fā)布效率。本文主要內(nèi)容有:
- 應(yīng)用發(fā)布訴求
- 發(fā)布方案對比
- 藍綠發(fā)布流程
- 藍綠流量調(diào)度
- 組件能力支持
1應(yīng)用發(fā)布訴求
微服務(wù)應(yīng)用發(fā)布時有以下訴求:
- 上下游依賴:本服務(wù)的發(fā)布依賴其他服務(wù),要別的服務(wù)先發(fā)布才行
- 小流量灰度:發(fā)布時先小流量灰度驗證、避免問題被放大
- 按批次發(fā)布:支持節(jié)點批次劃分、按批次發(fā)布
其中上下游依賴問題最為突出,為解決依賴問題需提前填寫發(fā)布計劃,將應(yīng)用組織成梯隊來規(guī)避上下游依賴問題。
- 填寫發(fā)布計劃較為繁瑣:每次發(fā)布需要去組織填寫、比較繁瑣
- 必須按照梯隊順序發(fā)布:一個梯隊發(fā)完才能發(fā)布另一個梯隊、需要互相等待
- 應(yīng)用回滾穩(wěn)定性需提升:一個應(yīng)用驗證有問題,需要依賴上游聯(lián)動回滾,回滾過程中有生產(chǎn)流量、穩(wěn)定性存在優(yōu)化空間
由此可見,應(yīng)用發(fā)布的痛點聚焦到了破除上下游上,自然解決方案也以此為中心。
2發(fā)布方案對比
發(fā)布方式 | 基本原理 | 常見實現(xiàn) |
灰度發(fā)布 | 小流量驗證 | 方式一:金絲雀發(fā)布,發(fā)布時先拉入一臺驗證,正常后發(fā)布剩余節(jié)點 |
滾動發(fā)布 | 分批次發(fā)布 | 在灰度驗證的基礎(chǔ)上,通過發(fā)布系統(tǒng)選擇發(fā)布批次 |
藍綠發(fā)布 | 流量調(diào)度實現(xiàn) | 線上同時藍綠兩個應(yīng)用組提供服務(wù) |
紅黑發(fā)布 | 彈性擴縮容、流量調(diào)度 | 線上只運行一個紅色集群 |
熟悉中間件運維的同學(xué)怎么運維才是安全的呢?先摘流、運維變更、再逐步引流。
這種方式應(yīng)用到應(yīng)用發(fā)布系統(tǒng),即為藍綠發(fā)布。
在生產(chǎn)環(huán)境發(fā)布時,我們通常有兩個版本,線上運行的版本、待發(fā)布的版本。
也就是在生產(chǎn)環(huán)境區(qū)分流量只需要兩個顏色即可,藍綠發(fā)布通過兩個染色流量來區(qū)分線上運行版本和待發(fā)布版本。
此外,希望在大版本發(fā)布與日常迭代中都能使用藍綠發(fā)布來提效,作為核心應(yīng)用的首選發(fā)布方式。
3藍綠發(fā)布流程?
在發(fā)布系統(tǒng)中集成藍綠發(fā)布,與普通發(fā)布有何區(qū)別,藍綠發(fā)布流程是怎么樣的呢?
3.1 藍綠架構(gòu)圖示
線上的資源容量需能夠容納業(yè)務(wù)增量的2倍以上,將線上的運行的服務(wù)節(jié)點資源一分為二,分成藍色環(huán)境和綠色環(huán)境。
3.2 藍綠發(fā)布流程
為了避免混淆將藍綠環(huán)境固定,先部署待發(fā)布新版本的環(huán)境固定為「藍色環(huán)境」,后部署待發(fā)布新版本的環(huán)境固定為「綠色環(huán)境」,應(yīng)用發(fā)布先發(fā)「藍色環(huán)境」,后發(fā)「綠色環(huán)境」。
發(fā)布流程梳理如下:
- 將藍色集群摘流,此時流量被染綠進入綠色集群
- 系統(tǒng)發(fā)布時先經(jīng)過「藍色環(huán)境」,后發(fā)布「綠色環(huán)境」
- 應(yīng)用上下游服務(wù)在「藍色環(huán)境」集中完成部署
- 引入1%流量藍色流量驗證
- 「藍色環(huán)境」上下游服務(wù)驗證「不符合預(yù)期」,流量切換到綠色環(huán)境
- 「藍色環(huán)境」完成驗證「符合預(yù)期」,全部流量染成藍色,流量調(diào)度到了藍色環(huán)境
- 此時綠色環(huán)境已無流量,新版本在綠色環(huán)境集中完成部署
- 通過遞進式引流到綠色環(huán)境【1%~50%】
- 最后呈現(xiàn)的流量分布,藍綠流量各50%
縱觀整個發(fā)布流程,需要眾多部門和組件的聯(lián)動配合才能完成,下到容器、上到網(wǎng)關(guān),中間貫穿眾多核心中間件。
4藍綠流量調(diào)度?
在設(shè)計流量調(diào)度時分為全局流量調(diào)度與局部流量調(diào)度,分別應(yīng)對不同的發(fā)布場景。
全局流量調(diào)度(單通道發(fā)布):所有藍綠環(huán)境的應(yīng)用都參與流量調(diào)度,適用一次發(fā)布上百個應(yīng)用場景、上下游關(guān)系難以梳理。
局部流量調(diào)度(多通道發(fā)布):適用于已知應(yīng)用依賴發(fā)布、日常迭代。
在已知應(yīng)用依賴的情況下,通過局部流量調(diào)度即可滿足需求。
4.1 全局流量調(diào)度
上面提到「全局流量單通道」在藍綠環(huán)境的服務(wù)均會參與調(diào)度,流量調(diào)度變更涉及全部在藍綠環(huán)境的應(yīng)用,下面以流量全部調(diào)度藍色環(huán)境為例觀測各個組件的行為。
伴隨著綠色環(huán)境被摘流,流量全部在藍色環(huán)境運行。
- RPC選擇本環(huán)境對應(yīng)節(jié)點、并提供兜底選擇策略
- 綠色環(huán)境應(yīng)用消息組被下線摘除消費流量、同時在藍色環(huán)境喚醒綠色消費組接管流量
- 配置中心應(yīng)用只訪問對應(yīng)藍綠環(huán)境的配置集
- 分布式調(diào)度此時只調(diào)度到藍色環(huán)境
4.2 局部流量調(diào)度
「局部流量多通道」的流量調(diào)度比例,由各通道進行自行管控。如下圖所示:
- 全局流量單通道:藍綠切流比例 50%:50%
- 局部流量多通道1 :藍綠切流比例 5%:95%
- 局部流量多通道2 :藍綠切流比例 0%:100%
需要注意的是
- 一個應(yīng)用只允許在一個發(fā)布通道發(fā)布,避免流量沖突和干擾
- 當(dāng)「全局流量單通道」發(fā)布與「局部流量多通道」同時發(fā)布時
- 以「局部流量多通道」比例為準(zhǔn)
- 「局部流量多通道」發(fā)布結(jié)束后,會被「全局流量單通道」流量比例接管
4.3 調(diào)度實現(xiàn)原理
?
無論是「全局流量單通道」調(diào)度還是「局部流量多通道」調(diào)度,實現(xiàn)原理都是一樣的,下面以RPC調(diào)用為例說明,如下圖所示。
工作原理簡述如下:
- @1 由發(fā)布系統(tǒng)即將【通道標(biāo)識、包含的應(yīng)用列表、切流比例】寫入元數(shù)據(jù)中心
- @2 「局部流量多通道」中的應(yīng)用收到藍綠比例。例如:圖示中應(yīng)用A收到自身所屬通道的藍綠流量比例
- @3 「局部流量多通道」中的應(yīng)用將自身的藍綠比例寫入注冊中心。例如:應(yīng)用A將自身藍綠流量比例寫入注冊中心
- @4 調(diào)用應(yīng)用A的【所有上游應(yīng)用】通過注冊中心均收到應(yīng)該調(diào)用A的藍綠流量比例。例如:應(yīng)用B、應(yīng)用C、應(yīng)用D均收到應(yīng)該調(diào)用應(yīng)用A的藍綠比例
- @5 上游應(yīng)用按流量比例向下游服務(wù)發(fā)起調(diào)用
從流量調(diào)度和實現(xiàn)原理來看,流量的調(diào)度會與RPC、消費組、分布式調(diào)度、發(fā)布系統(tǒng)、配置中心、注冊中心一起聯(lián)動。需要把存在的流量出口(例如:網(wǎng)關(guān)、消息、分布式調(diào)度等)流量管控起來。
5組件能力支持
上文中提到流量的調(diào)度涉及到眾多組件聯(lián)動與協(xié)同,那各個組件需要提供哪些能力呢?下面介紹下這些組件需提供的能力。
5.1 容器邏輯分組
藍綠發(fā)布離不開容器的邏輯分組,應(yīng)用使用藍綠發(fā)布之前,需要將應(yīng)用的機器實例分布到藍綠環(huán)境中去。容器需要具備的能力如下:
- 提供應(yīng)用藍綠邏輯分組
- 藍綠標(biāo)識植入環(huán)境變量
- 應(yīng)用分組發(fā)布系統(tǒng)可見
如下圖所示,應(yīng)用通過容器分組,分布到藍綠集群。
5.2 發(fā)布系統(tǒng)支持
發(fā)布系統(tǒng)是整個藍綠發(fā)布的入口,用戶直接感受的系統(tǒng)。對下與容器交互、對上與元數(shù)據(jù)中心交互。
- 提供藍綠發(fā)布多通道能力,將本次發(fā)布關(guān)聯(lián)應(yīng)用拉入同一發(fā)布通道
- 提供藍綠發(fā)布流水線、流量調(diào)操作
- 根據(jù)容器平臺提供的邏輯分組接口、指定藍綠集群發(fā)布
- 將通道信息、應(yīng)用列表、流量調(diào)度信息寫入元數(shù)據(jù)中心,供中間件感知
如下圖所示,將整個藍綠發(fā)布形成流水線。
5.3 統(tǒng)一框架支持
統(tǒng)一框架包含流量調(diào)度SDK、與注冊中心和配置中心交互,聯(lián)動整個RPC、Feign/HTTP流量調(diào)度。
- 優(yōu)先根據(jù)藍綠標(biāo),選擇本環(huán)境節(jié)點調(diào)用
- 根據(jù)權(quán)重路由策略選擇下游節(jié)點
- 提供兜底策略,避免無節(jié)點可選
節(jié)點選擇示意圖如下:
如下圖所示,框架會將藍綠環(huán)境信息與權(quán)重在注冊中心注冊。
5.4 消息組件支持
消息組件根據(jù)流量調(diào)度SDK的回調(diào),需要將消費流量摘除和激活。
邏輯實現(xiàn)約定如下:
- 藍綠環(huán)境各使用三個消費組 melon-consumer、BLUE-melon-consumer、GREEN-melon-consumer
- 消費組melon-consumer用于消費無(藍綠)標(biāo)識的流量,藍綠標(biāo)識會在每條消息屬性中存儲
- 消費組__BLUE-melon-consumer用于消費「藍色」標(biāo)識流量
- 消費組__GREEN-melon-consumer用于消費「綠色」標(biāo)識流量
藍綠兩個環(huán)境均有流量:
- 綠色環(huán)境melon-consumer 、_GREEN-melon-consumer參與消費;BLUE-melon-consumer下線不參與消費
- 藍色環(huán)境melon-consumer 、_BLUE-melon-consumer參與消費,GREEN-melon-consumer下線不參與消費
只有綠色環(huán)境有流量時:
- 綠色環(huán)境melon-consumer、_GREEN-melon-consumer參與消費,BLUE-melon-consumer被動態(tài)喚醒參與消費,未被消費完的藍色流量被接管
- 藍色環(huán)境GREEN-melon-consumer、BLUE-melon-consumer、melon-consumer均被動態(tài)下線,不參與消費
只有藍色環(huán)境有流量時:
- 綠色環(huán)境_GREEN-melon-consumer、BLUE-melon-consumer、melon-consumer均被動態(tài)下線,不參與消費
- 藍色環(huán)境_GREEN-melon-consumer、BLUE-melon-consumer、melon-consumer均參與消費,其中__GREEN-melon-consumer被動態(tài)喚醒,接管未被消費的綠色流量
如下圖所示,藍綠消費組消費各自對應(yīng)的消息:
此外,DTS等組件同步的消息會被「無前綴標(biāo)記的消費組(例如:melon-consumer)」接管,能夠在100%流量調(diào)度時摘除消費流量。
5.5 配置中心支持
配置中心提供能的能力,主要藍綠環(huán)境的節(jié)點選擇與其對應(yīng)的配置集,涉及到SDK和配置中心集群的改動。
- 配置中心提供藍色配置集
- 藍色環(huán)境應(yīng)用選擇藍色版本配置集
- 綠色環(huán)境應(yīng)用選擇綠色版本配置集
- 提供兜底策略、無藍綠版本時選擇主版本配置集
如下圖所示,配置中心提供藍綠不同的版本的配置集。
5.6 網(wǎng)關(guān)調(diào)用支持
- 讀取注冊中心節(jié)點流量調(diào)度比例
- 提供根據(jù)流量比例選擇下游節(jié)點的策略,例如:通過節(jié)點權(quán)重加權(quán)計算
如下圖所示,流量全部切換到藍色集群后,網(wǎng)關(guān)向下游分發(fā)的流量染藍。
5.7 分布式調(diào)度支持
- 通過命名空間區(qū)分藍綠環(huán)境調(diào)度
- 一次調(diào)度只在一個環(huán)境進行,避免兩個環(huán)境同時發(fā)生調(diào)度,對業(yè)務(wù)影響
- 支持按照調(diào)度中心百分比(100%切流時)執(zhí)行調(diào)度
- 支持輸入藍綠環(huán)境,手動執(zhí)行到特定環(huán)境
如下圖所示,在調(diào)度時選擇對應(yīng)藍綠環(huán)境的節(jié)點。
5.8 藍綠監(jiān)控看板
藍綠發(fā)布進行流量調(diào)度時,需要有一個可觀測面板觀察HTTP、DUBBO、MQ等的流量比例以及是否被摘流。
如下圖看板所示HTTP流量,藍色流量占比10%,綠色流量占比90%。
6后記
藍綠發(fā)布通過摘流、變更、再引流,因在無流量的情況下發(fā)布,相對比較安全。但是基于公司實際情況,有些場景的流量是無法摘除的。
- 未通過網(wǎng)關(guān)進入服務(wù)流量:例如:通過域名SLB進入服務(wù)、通過Ingress進入服務(wù)的流量無法摘除
- 消費Kafka的流量無法摘除:由于應(yīng)用使用的原生kafka客戶端并全面鋪開、無法對切入提供支持
- 未使用統(tǒng)一框架/注冊中心:未使用統(tǒng)一框架和Sylas注冊中心的java應(yīng)用、以及非Java類應(yīng)用當(dāng)前不支持藍綠發(fā)布
此外,還有一些注意事項在使用藍綠發(fā)布時需警惕。
- 消費消息需冪等:使用消息中間件必須做冪等,這是基本要求,在消費組啟停管控中可能產(chǎn)生重復(fù)消息
- 消費組線程數(shù)量:由于會有三個消費組、消費線程也會增加兩倍,有業(yè)務(wù)影響時需調(diào)低線程數(shù)
- 需要好流量評估:藍綠發(fā)布需一半節(jié)點承接線上流量、在應(yīng)用升級藍綠集群時做好確認(rèn)
- 升級到特定版本:使用藍綠發(fā)布需要應(yīng)用升級到框架指定版本
- Feign/HTTP流量:針對使用框架Feign的HTTP流量,需上下游應(yīng)用全部升級后方可使用
- 使用Dubbo流量:使用框架Dubbo的服務(wù)只需要自身服務(wù)升級版本即可、無需上下游升級?