ロールバック戦略と原子リリース
ロールバック戦略と原子リリース
1)なぜ速いロールバックを必要とするか
優れた試験カバレッジであっても、食品はエラーのないことを保証するものではありません。ロールバック(Rollback)とは、SLO/ビジネスメトリックまたはインシデント信号によってシステムを以前の定常状態に戻す制御されたものです。目的:- MTTRを数分に短縮します。
- 影響の半径を制限します(影響を受けた最小ユーザー/トランザクション)。
- データの整合性と契約の互換性を維持します。
キー:リリースをビルドして、ロールバックはミニプロジェクトではなく、些細なアクションです。
2)「原子放出」の概念"
原子リリース-新しいバージョン/挙動を含めると、副作用が持続することなく、単一の原子操作によって実行(およびキャンセル)することができます。
原子性成分:- 不変アーティファクト(署名付き画像/パッケージ)。
- バージョン管理された構成(手動編集ではなくプロモーションバージョン)。
- 「inclusion」(ルーティング/フラグ)から「delivery」を分離します。
- 互換性のあるデータスキーマ(どちらのバージョンも同時に使用できます)。
- ロールバックランブック:1つの明確なステップ(変更セレクター/重量/フラグ)+チェック。
3)ロールバックの機械類の目録
3.1トラフィック層(最速)
Blue-Green :/targetグループセレクタを安定版に切り替えます。
カナリア州:0%へのより低い重量および凍結の進行。
ゲートウェイ/NGINX/サービスメッシュ:以前の重み/ルートに戻ります。
3.2コンベアレベル
Helm/Argoロールアウト:'abort/rollback'を以前のリビジョンに戻します。
GitOps: MR/コミットをマニフェスト・リポジトリに戻します(コントローラは残りを行います)。
3.3付録/機能
Feature-flags/kill-switch:危険なパスを即座にオフにします。
設定の切り替え:前の設定ショットに戻ります。
3.4データ
ロールフォワードマイグレーション(推奨)+互換性。
事故時のポイント・イン・タイム・リカバリ(PITR)とバックアップ。
報酬(佐賀)とリバーシブル行動のためのidempotency。
4)「展開→移行→契約」パターン
ロールバックが安全であるためには、データスキーマが古いバージョンと新しいバージョンを共存させる必要があります。
1.展開-古いロジックを壊すことなく、新しいフィールド/インデックス(nullable)を追加します。
2.マイグレート-二重書き込み/読み取り、バックフィル、バックグラウンドジョブとidempotency。
3.「契約」(Contract)-100%終了と持続ウィンドウの後に古いフィールド/コードを削除します。
5) SLOのゲートおよび自動ロールバック
各リリースステージへの入り口は、メトリックによって「ガード」されなければなりません。
技術的なSLO: p95/p99レイテンシ、5xxレート、飽和(CPU/メモリ)、エラー予算の書き込み。
ビジネスメトリック:入金/キャッシュアウトのCR、支払いの拒否、詐欺の割合、KYCエラー。
- 5xx> 0。5%10分→ロールバック。
- ベースラインの20%→hold+解析。
- PSPエラー>0。3 p。p。→rollback+スイッチング支払いルート。
6)例: Kubernetes/Helm/Argo/NGINX
6.1ブルーグリーン(K8sサービスセレクター)
yaml
Service points to "blue"; switch to green - change selector apiVersion: v1 kind: Service metadata: {name: app-svc}
spec:
selector: { app: app, version: blue }
ports: [{ port: 80, targetPort: 8080 }]
rollback=セレクターを'blue'に戻します(atomic、 no reassembly)。
6.2カナリア島(イスティオ・バーチャルサービスVPN)
yaml http:
- route:
- destination: { host: app, subset: stable } # 100 weight: 100
- destination: { host: app, subset: canary } # 0 weight: 0
ロールバック=重量カナリア→0、安定→100。
6.3 Argoロールアウト-中止
yaml kubectl argo rollouts abort app # stop and return to stableService
6.4ヘルム-リビジョンへのロールバック
bash helm history app -n prod helm rollback app 17 -n prod # revert to revision 17
6.5 NGINX-上流重量
nginx upstream app {
server blue:8080 weight=100;
server green: 8080 weight = 0; # rollback - return 100/0
}
7)特徴旗およびキルスイッチ「パラシュート」として"
ハイリスクフロー(預金/支払い/ボーナス)のキルスイッチ-必須。
粘着性:ハッシュキーを介してユーザーに「バリアント」を割り当てる-予測可能な比較。
Fail-safe:フラグサーバが利用できない場合、安全なデフォルト。
ts const enabled = flags. bool("new_cashout_flow", false);
if (! enabled) return classicFlow () ;//instant rollback - disable the return newFlow () flag;
8) APIとイベント契約: 「ロールバックを破る」方法"
バージョン管理契約(OpenAPI/gRPC/Avro):新しいバージョンではフィールドが追加され、古いバージョンのセマンティクスは変更されません。
イベントバージョニング:'type=v2'、消費者は未知のフィールドを無視する必要があります。
Outbox+Idempotency:イベントの繰り返しは安全で、消費者はidempotentです。
9)オフセット取引(佐賀)
状態の「ハード」ロールバックがない場合(残金、手紙送信)、補償を使用します:- 投稿された書き込み-補償:リターン、逆転、訂正記録。
- 報酬操作のジャーナルに記録し、成功する前にリトラクション。
- 各操作のIdempotentキー。
json
{
"sagaId": "b7d2...",
"action": "withdraw. execute",
"idempotencyKey": "user123:withdraw:7845",
"compensation": "withdraw. refund"
}
10)構成と秘密: バージョンとしてロールバック
configsをversion artifacts (semver/commit-sha)として保存します。
Rollback=設定を以前のバージョン(GitOpsは元に戻します)に戻します。
秘密-ストレージ経由(KMS/Vault);リリースには回転とバージョン管理が含まれています。
11)ロールバックのrunbook(最低)
1.一時停止の進行(カナリア/ロールアウト)。
2.トラフィックリターン(重み/セレクタ)。
3.SLO/ビジネスメトリクスのチェックはベースラインに戻ります。
4.バックグラウンドジョブの安定化(必要に応じて移行/バックフィルを停止)。
5.インシデントとポストファクトム:アーティファクト(ログ/トレイル/メトリック)、仮説、修正。
6.クリーニング:フラグを閉じ、左コードを削除し、ジョブのスケジュールを返します。
12)自動保護ポリシー
画像の「最新」タグと可変タグを禁止します。
入場管理:署名されたアーティファクトのみ。
CIゲート:SAST/SCA/Policy-checkはプロモーションのために緑色でなければなりません。
凍結ウィンドウ:リスク期間中にリリース/重み>X%はありません。
13)頻繁なアンチパターン
私たちは、互換性の代わりにDDLベースを「ロールバック」します-長いロック/ダウンタイム。
即座にヘッドツーヘッドマイグレーションを実行します。
「デリバリー」と「インクルージョン」をミックスする-すぐにトラフィックを返す方法はありません。
監査なしで本番構成で手動で編集します。
支払い/出力のキルスイッチはありません。
prodのアーティファクトを再構築します(「build once-run many」の違反)。
単一のロールバックボタン/ランブックが機能していません。
14)実装チェックリスト(0-45日)
0-10日
主なサービスにBlue-Green/Canaryを含める。
'latest'を拒否し、画像署名とHelm/Argo履歴を有効にします。
SLOボード(レイテンシ、5xx、主要なビジネス信号)を接続します。
11-25日
リスクフローのキルスイッチを実装します。
データベース移行をexpand-migrate-contract+idempotencyに変換します。
SLOによる自動停止/ロールバック(Argo AnalysisTemplate/alerts)を追加します。
26-45日
バージョン管理設定(GitOps)、 MR-revertによるロールバック。
ランブックを「ゲームデー」(インシデントとロールバックのシミュレーション)に実行します。
下方ロールバックができない佐賀補償を入力してください。
15)成熟度の指標
ロールバックMTTR:ターゲット<5分。
rollback=route/flagスイッチ(再構築なし)>90%のリリースの%。
expand-migrate-contract移行のシェアは90%以上です。
キルスイッチサービスをフラグ>95%でカバーしています。
互換性のないスキーム/契約によるインシデントの数→0。
16)アプリケーション: ミニテンプレート
Argo AnalysisTemplate 5xx Stop
yaml apiVersion: argoproj. io/v1alpha1 kind: AnalysisTemplate metadata: { name: guard-5xx }
spec:
metrics:
- name: http_5xx_rate interval: 1m successCondition: result < 0. 005 provider:
prometheus:
address: http://prometheus. monitoring:9090 query:
sum(rate(http_requests_total{app="app",status=~"5.."}[5m])) /
sum(rate(http_requests_total{app="app"}[5m]))
Kubernetes: 展開のクイックロールバック
bash kubectl rollout undo deploy/app -n prod
Helm: アトミックリリース
bash helm upgrade --install app chart/ \
--atomic \
--timeout 5m \
--set image. tag=v1. 9. 3
NGINX: カナリアクレーン
nginx map $cookie_canary $weight {
default 0;
"~ on" 10; # enable 10% by cookie
}
17)結論
信頼できるロールバックは「火災ボタン」ではなく、アーキテクチャの特性です。不変のアーティファクト、配送と包含の分離、互換性のあるデータスキーム、フィーチャーフラグ、SLOゲートです。atomic releasesをビルドし、リハースランブックを作成し、セキュリティゲートを自動化します。ビジネスやユーザーにとって苦痛を与えることなく、リリースは数分でリバーシブルになります。