Zero-Downtime部署
(部分: 體系結構和協議)
1)什麼是Zero-Downtime,為什麼需要
Zero-Downtime(ZDT)是發布應用程序新版本的一種方法,而用戶無需該服務,並且不會丟失請求。目標是:- 零方便客戶和集成。
- 可預測的發布、快速回滾和可管理的風險。
- 將SLO/SLI(潛在性,錯誤,可訪問性)保留在安排範圍內。
ZDT的關鍵不是單一「魔術」技術,而是交付模式,數據兼容性和可勝任的流量路由的組合。
2) Zero-Downtime基本原則
1.版本兼容性:新版本和舊版本必須同時正確處理流量和數據。
2.操作的相等性:重復處理不應破壞狀態。
3.優美的完成(graceful shutdown)和連接排水。
4.循序漸進的健康檢查:準備/生活樣本,健康結束。
5.作為頭等艙公民回滾:回滾比hotfix更簡單、更快。
6.通過設計可觀察性:發布標簽,單個dashbords,SLO上的差分。
7.自動化:發布和回滾腳本-代碼而不是手動說明。
3)沒有市中心的交付模式
3.1 Rolling Update
漸漸地,我們將舊版本的一些實例從流量中刪除,將它們更新到新版本,然後返回池。
優點: 經濟的基礎架構,只是k8s/ASG.
缺點:有一段時間群集同時運行兩個版本(version skew)。
3.2 Blue-Green
兩個完整的程序堆棧:主動(藍色)和候選人(綠色)。切換流量-原子翻轉。
優點:瞬間回滾,清潔隔離。
缺點:基礎架構的↑成本,與靜態更難。
3.3金絲雀/漸進式滾動
我們給出新版本的流量的一小部分(1-5-10-25-50-100%),並按指標給出門。
優點:最小爆炸射線,數據驅動解決方案。
缺點:需要成熟的可觀察性和智能路由。
3.4 Shadow traffic / Dark launch
我們將真實查詢鏡像到新版本(未回復用戶)或隱藏運行以收集指標。
優點:及早發現問題。
缺點:成癮的雙重負擔,需要控制副作用。
4)交通和連接管理
4.1 Readiness/Liveness
Liveness告訴管弦樂隊「重新啟動我」。
準備就緒-「不引導流量,我還沒有準備好。」
沒有正確的準備邏輯和時間限制,就無法發布。
4.2連接排水(連接排水)
在將實例從池中刪除之前:- 停止接受新的連接,
- 等待活動結束,
- 打斷「盤旋」的時間。
4.3 Sticky會話和L7路由
Sticky在靜態場景中很有用,但是使負載平衡復雜化。
L7規則(路徑,標題,cookie,API版本)適用於金絲雀/環。
4.4長壽化合物
WebSocket/gRPC流式傳輸:在升級之前,啟用drain mode+信號「GOAWAY」。
規劃Windows以勝過客戶的Stream和Backof Retrai。
5)數據互操作性和數據庫遷移
5.1 Expand-Migrate-Contract
1.Expand:添加新的列/索引/表格,而不破壞舊版本。
2.Migrate:以背景和偶數方式傳輸數據(batchi,chekpoints)。
3.合同:我們只有在穩定後才能刪除舊的合同。
5.2個實踐
在發布窗口中避免獨家DDL鎖定。
驗證API/事件合同 (schema registry, CDC)。
對於大量遷移-在線工具、副本、分階段切換。
雙環記錄(雙寫),只有重復數據消除和偶數用戶。
Outbox/Inbox可通過隊列進行可靠的集成。
6)緩存,會話和背景任務
會話和緩存是外部(Redis/Memcached),因此版本可以互換。
在打開池之前加熱緩存/jit/速度索引。
按版本劃分背景隊列,或使用領先優勢避免比賽。
7)SLO的可觀察性和門戶
Golden signals: p95/p99潛伏期,error rate, RPS, saturation,排隊。
業務SLA:授權,轉換,成功付款,漏鬥步驟故障。
大門:只有當金絲雀≤基線+降解閾值並且錯誤預算不燃燒時,滾動才能推進。
8)安全完成和回滾
回滾是相同的管道,只是相反的:固定的命令,不是「手工藝品」。
對於藍綠色-翻轉;金絲雀-重量減至0%或前一個穩定步驟。
數據:補償事務、重復處理、事件重復數據消除。
9)零下時間支票清單
發布之前
- 收集了一個簽名的工件(immutable),SBOM和依賴性檢查。
- Readiness/Liveness已實施和測試。
- 外包模式下的遷移計劃,可逆性得到確認。
- 新版本的Dashbords和Alertes已準備就緒,發布標簽已滾動。
- 回滾已在staging/pre-prod上驗證。
發布期間
- 連接排水包括在內,taymouth是足夠的。
- 流量將逐步轉移(金絲雀/環)或翻轉(藍綠色)。
- 將度量標準與基線進行比較,並遵循門檻。
發布後
- N小時後監測,沒有事件。
- 合同遷移已完成,臨時標誌/路線已刪除。
- 回顧,更新花花公子。
10)反模式
無排水的Recreate Deploy和Readiness ⇒請求的懸崖。
未經準備的DDL在黃金時段⇒鎖定和定時。
在服務版本之間混合不兼容的方案。
處理者和鍛煉者缺乏同位素。
「感覺不好」,沒有門和基線比較。
藍綠色時長DNS-TTL,導致翻轉持續數小時。
滾動/金絲雀時實例內存中的本地會話/緩存。
11)實施方案
11.1 Kubernetes (rolling + canary)
Deployment с `maxUnavailable=0`, `maxSurge=25%`.
準備等待預熱(緩存初始化、次要遷移)。
服務-mesh/Ingress帶有重量路由功能(1-5-10-25-50-100%)。
Alerts: p95, 5xx, lag隊列,業務漏鬥。
11.2藍綠色在雲中
平衡器後面的兩個堆棧是'藍色。example.com` и `green.example.com`.
預熱綠色,煙霧/倒退,然後是聽者/路線交換(或低TTL DNS切換)。
有問題時-即時翻轉。
11.3 Stateful服務
數據副本+在線遷移;雙讀與驗證。
背景喬巴通過「領導」版本或分隊進行傳輸。
實例外的會議/緩存;sticky只是暫時打開。
12) Ficheflagi和客戶端應用程序
新的fici被旗幟激活(細分:員工→ beta →所有)。
對於移動/臺式機客戶端,請考慮協議兼容性邊界和舊版本的生存能力(deprecation policy, server side fallback)。
13)生產力和成本
滾動更便宜,但需要謹慎的兼容性。
Blue-Green在發布時更昂貴,但會立即回滾。
金絲雀平衡風險和成本,但需要強大的可觀察性。
通過ephemeral預覽和自動清潔看臺節省費用。
14) ZDT最低參考線
1.Build:單個工件,簽名,SBOM。
2.Test: unit/integration/contract + security.
3.Staging: smoke,負載,expand模式遷移,回滾檢查。
4.Prod:陰影→金絲雀(網關)或藍綠色翻轉。
5.後處理:監視,合同清潔,復古。
15)簡短摘要
Zero-Downtime是一門學科:兼容版本+正確路由+受控遷移+可觀察性和快速回滾。選擇上下文(滾動、藍綠色、金絲雀)下的模式,自動化SLO網關,保持數據等效性-發布將不再是事件,成為可靠的例行過程。