ブルーグリーンデプロイとカナリアリリースとは ― 違いと切り戻し
ブルーグリーンデプロイは
ブルーグリーンデプロイとカナリアリリースの違いは、一度に切り替えるか、徐々に広げるか
ブルーグリーンデプロイは、新旧2つの環境を用意し、利用者の振り分け先を一度に新しい環境へ切り替える方法です。カナリアリリースは、新しい版を一部の利用者だけに先に出し、様子を見ながら広げる方法です。
どちらも、新しい版を出すたびにサービスを止めたり、不具合を利用者の全員に届けたりしないための方法です。方式によって、必要なサーバの台数と、問題が起きたときに前の版へ戻す速さが変わります。前の版へ戻すことを、切り戻しまたはロールバックと呼びます。
こうした新しい版への切り替え方を、デプロイ戦略と呼びます。CI/CDのパイプラインでは、最後の本番の段でどの方式を使うかを決めます。
止めて入れ替える方法の弱点は、止まる時間と戻す手間
いちばん単純な出し方は、古い版をすべて止めてから、新しい版で起動し直す方法です。Kubernetesでは、この出し方をRecreateと呼びます。台数は増えませんが、止めてから起動し終わるまで、利用者はサービスを使えません。
新しい版に不具合があると、起動した直後から利用者の全員がその影響を受けます。戻すには古い版を入れ直すことになり、その間もサービスはまた止まります。この2つの弱点を減らす方式として、次の3つがあります。
ローリングアップデートは、サーバを1台ずつ置き換える方法
ローリングアップデートは、動いているサーバを1台ずつ新しい版に置き換えていく方法です。残りのサーバが要求を受け続けるので、サービスは止まりません。ロードバランサなどの振り分けの仕組みは、準備ができていない新しいサーバには要求を送りません。
増やす台数は少しで済みます。Kubernetesの記事で説明したとおり、Kubernetesは初期設定で、この方式でPodを入れ替えます。そのとき、Podの合計はあるべき数の125%までに抑えます。
その代わり、置き換え終わるまでは古い版と新しい版が混ざって動きます。同じ利用者の要求が、続けて違う版に届くこともあります。切り戻すときは、もう一度古い版へ1台ずつ置き換えるので、台数が多いほど時間がかかります。
ブルーグリーンデプロイは、新旧2つの環境を切り替える方法
ブルーグリーンデプロイでは、できるだけ同じ構成の本番環境を2つ持ちます。いま利用者が使っている方をブルー、新しい版を置く方をグリーンとします。グリーンで最後のテストを終えたら、振り分けを切り替えて、すべての要求をグリーンへ送ります。
切り替えたあとも、ブルーは止めずに待機させておきます。問題が見つかったら、振り分けをブルーに戻すだけで切り戻せます。Martin Fowlerは、すぐに戻せることをこの方式の利点に挙げています。
弱点は、本番と同じ構成をもう1つ持つことです。GoogleのSREの文書は、通常の出し方の2倍の資源を使うと書いています。2つの環境を同じ構成で作るには、構成をファイルに書いて作るIaCが役に立ちます。
どちらをブルーと呼ぶかに決まりはありません。Fowlerは本番で動いている方をブルーとして説明し、GoogleのSREの文書は本番の方をグリーンと呼んでいます。どちらの呼び方でも、2つの環境を交互に使います。片方が本番のとき、もう片方は前の版か次の版の置き場になります。
ホットスタンバイは、予備を動かしたまま待機させる方式です。Fowlerは、切り替える仕組みがホットスタンバイと同じなので、リリースのたびに災害復旧の手順を試せるとも書いています。予備の環境を用意して切り替える考え方は、BCPとDRの記事で説明しています。
カナリアリリースは、一部の利用者から先に出して広げる方法
カナリアリリースでは、まず新しい版を少数のサーバに置きます。この時点では、利用者を送りません。次に、ごく一部の利用者だけをそこへ送り、エラーの数や応答の速さを古い版と比べます。問題がなければ、新しい版のサーバと送る利用者を少しずつ増やします。
先に送る利用者は無作為に選ぶほか、社内の利用者や1つの地域から始めることもあります。名前は、炭鉱に連れて入ったカナリアに由来します。有毒なガスが漏れるとカナリアが人より先に弱るので、坑夫は危険に早く気づけました。
切り戻すときは、新しい版へ送っていた利用者を古い版へ送り直します。不具合の影響を受けるのは、それまで新しい版へ送っていた一部の利用者だけです。GoogleのSREの文書の例では、要求の20%が失敗する版を利用者の5%に出すと、全体の失敗は1%にとどまります。
この差は、エラーバジェットの減り方に表れます。エラーバジェットは、許される失敗の量です。詳しくはSLA・SLO・SLIの記事で説明しています。エラーバジェットの減る量は、不具合のある版に届いた通信の量に比例するからです。弱点は、広げ終わるまで複数の版を同時に動かし、それぞれを見張り続ける手間がかかることです。
3つの方式の比較は、台数・切り戻しの速さ・旧新が混ざる期間
3つの方式は、新しい版に届く利用者の割合の変わり方が違います。次の図は、その割合が時間とともにどう増えるかを並べたものです。
ブルーグリーンでは旧新が混ざる期間がなく、割合は0%から100%へ一度に変わります。ローリングとカナリアでは混ざる期間がありますが、カナリアは少数に出した段階でいったん止めて確かめる点が違います。ローリングは、置き換えた台数に応じて自動で割合が増えていきます。
| 方式 | 最大の | 旧新が | 不具合が | 切り戻し |
|---|---|---|---|---|
| 止めて | いつもと | ない | 最初から | 入れ直す。 |
| ローリング | いつもより | 置き換え | 置き換えた | もう |
| ブルーグリーン | いつもの | ない | 切り替えた | 振り分けを |
| カナリア | いつもより | 広げ終わるまで | 最初は | 利用者を |
次の図で方式を選ぶと、4台で動くサービスを更新するときの、段階ごとの台数と利用者の行き先を確かめられます。
- 1更新の
前 旧旧旧旧利用者:すべて古い版へ - 2全部を
止める 止止止止利用者:どこにも つながらない - 3新しい
版で 起動 新新新新利用者:すべて新しい 版へ
- 最大の
台数 - 4台の
まま - 旧新が
混ざる 期間 - ない
- 不具合が
届く 範囲 - 起動した
直後から、 利用者の 全員 - 切り戻しの
手間 - 古い版を
入れ直す。 その間は また サービスが 止まる
- 1更新の
前 旧旧旧旧利用者:すべて古い版へ - 21台目を
置き換え 新旧旧旧利用者:4分の1が 新しい 版へ - 3半分を
置き換え 新新旧旧利用者:半分が新しい 版へ - 4全部を
置き換え 新新新新利用者:すべて新しい 版へ
- 最大の
台数 - 4台と、
入れ替え中の 少しの 台数。 Kubernetesの 初期設定なら 最大5台 - 旧新が
混ざる 期間 - 全部を
置き換え 終わるまで - 不具合が
届く 範囲 - 置き換えた
台数に 応じて 広がる - 切り戻しの
手間 - もう
一度、 古い版へ 1台ずつ 置き換える。 台数が 多い ほど 時間が かかる
- 1新しい
環境を 用意 ブルー本番旧旧旧旧グリーンテスト新新新新利用者:すべてブルーへ - 2振り分けを
切り替え ブルー待機旧旧旧旧グリーン本番新新新新利用者:すべてグリーンへ
- 最大の
台数 - 2つの
環境で 8台。 いつもの 2倍 - 旧新が
混ざる 期間 - ない。
一度に 切り替える - 不具合が
届く 範囲 - 切り替えた
直後から、 利用者の 全員 - 切り戻しの
手間 - 振り分け先を
ブルーに 戻すだけ。 待機中の ブルーが そのまま 使える
- 1更新の
前 旧旧旧旧利用者:すべて古い版へ - 2カナリアを
置く 旧旧旧旧新利用者:5%だけ新しい版へ - 3様子を
見て 広げる 新新旧旧利用者:半分が新しい 版へ - 4全部を
置き換え 新新新新利用者:すべて新しい 版へ
- 最大の
台数 - 4台と、
カナリアの 台数。 例では 5台 - 旧新が
混ざる 期間 - 広げ終わるまで。
どこで 止めて 様子を 見るかを 決めて おく - 不具合が
届く 範囲 - 最初は
新しい版へ 送った 一部の 利用者だけ - 切り戻しの
手間 - 新しい版へ
送っていた 利用者を、 古い版へ 送り直す
どの方式も、新しい版の状態を測る仕組みがあってはじめて役に立ちます。ブルーグリーンでは切り替える前のテストと切り替えた直後の監視、カナリアでは古い版との比較が判断の材料です。変えたサービスだけを出し直すマイクロサービスでは、サービスごとに方式を選べます。
データベースの変更が絡むときは、古い版でも動く形を保つ
どの方式でも、切り替えの途中や切り戻した後は、古い版のアプリもデータベースを使います。新しい版に合わせて列を消したり名前を変えたりすると、古い版が動かなくなり、切り戻せなくなります。そこで、データベースの変更は、新旧どちらの版でも動く形で先に出します。
列の名前を変える場合は、次の順に進めます。
- 新しい名前の列を足し、古い列も残す。古い版も新しい版も動く形にする
- 新しい版のアプリを、どれかの方式で出す
- 古い版のアプリが要らなくなってから、古い列を消す
Danilo Satoは、この進め方をパラレルチェンジと呼んでいます。エキスパンド・アンド・コントラクトとも呼ばれます。互換性のない変更を、広げる・移す・縮めるの3段階に分けて安全に進めます。Fowlerも、ブルーグリーンでは、スキーマ(データベースの表の構造)の変更をアプリの更新と分けて出すよう勧めています。
ブルーグリーンで2つの環境が別々のデータベースを持つ場合は、別の問題も残ります。グリーンが本番だった間に書き込まれたデータは、ブルーに戻すとそのままでは見えません。Fowlerは、両方の環境に取引を送る作りや、切り替えの前に読み取りだけの状態で動かす工夫を挙げています。
参考にした資料
- Martin Fowler「BlueGreenDeployment」(2010年3月。2015年6月にデータベースの段落を追記)
- Danilo Sato「CanaryRelease」(2014年6月)
- Danilo Sato「ParallelChange」(2014年5月。エキスパンド・アンド・コントラクト)
- Kubernetes Docs「Deployments」(RecreateとRollingUpdate、ロールバック)
- Google「The Site Reliability Workbook」Chapter 16「Canarying Releases」
練習問題(全5問)
正解:新旧2つの
ブルーグリーンデプロイは、
正解:新しい版へ
カナリアリリースでは、
正解:ブルーグリーンデプロイ
ブルーグリーンデプロイは、
正解:古い版と
ローリングアップデートは
正解:まず
切り替えの
選んでから「採点する」を押すと、解説つきで答え合わせができます。