ITの教科書検索
入門読了 約10分

ブルーグリーンデプロイとカナリアリリースとは ― 違いと切り戻し

ブルーグリーンデプロイは新旧2つの環境を一度に切り替え、カナリアリリースは一部の利用者から少しずつ広げる方法です。台数と切り戻しの速さの違いを図で比べます。

目次
  1. 2つの方式の違い
  2. 止めて入れ替える方法の弱点
  3. ローリングアップデート
  4. ブルーグリーンデプロイ
  5. カナリアリリース
  6. 3つの方式の比較
  7. データベースの変更の注意
  8. 練習問題

ブルーグリーンデプロイとカナリアリリースの違いは、一度に切り替えるか、徐々に広げるか

ブルーグリーンデプロイは、新旧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つの方式は、新しい版に届く利用者の割合の変わり方が違います。次の図は、その割合が時間とともにどう増えるかを並べたものです。

新しい版に届く利用者古い版に届く利用者ローリング1台ずつ置き換え0%25%50%75%100%ブルーグリーン一度に切り替え0%0%100%100%100%カナリア少数で様子を見る0%5%5%50%100%時間の流れ新しい版に届く利用者古い版に届く利用者ローリング1台ずつ置き換え0%25%50%75%100%ブルーグリーン一度に切り替え0%0%100%100%100%カナリア少数で様子を見る0%5%5%50%100%時間の流れ
棒の塗った部分が、新しい版に届く利用者の割合です。ローリングは少しずつ増え、ブルーグリーンは一度に切り替わり、カナリアは少数に出した段階で様子を見てから広げます。

ブルーグリーンでは旧新が混ざる期間がなく、割合は0%から100%へ一度に変わります。ローリングとカナリアでは混ざる期間がありますが、カナリアは少数に出した段階でいったん止めて確かめる点が違います。ローリングは、置き換えた台数に応じて自動で割合が増えていきます。

止めて入れ替える方法・ローリング・ブルーグリーン・カナリアの違い
方式最大の台数旧新が混ざる期間不具合が届く範囲切り戻し
止めて入れ替えるいつもと同じない最初から全員入れ直す。その間も止まる
ローリングいつもより少し多い置き換え終わるまで置き換えた台数に応じてもう一度置き換える
ブルーグリーンいつもの2倍ない切り替えた直後から全員振り分けを戻すだけ
カナリアいつもより少し多い広げ終わるまで最初は一部の利用者利用者を古い版へ戻す

次の図で方式を選ぶと、4台で動くサービスを更新するときの、段階ごとの台数と利用者の行き先を確かめられます。

方式を選ぶと、4台で動くサービスを新しい版にするときの台数と、切り戻しの手間が開きます。
デプロイの方式
  1. 1更新の前
    旧旧旧旧
    利用者:すべて古い版へ
  2. 21台目を置き換え
    新旧旧旧
    利用者:4分の1が新しい版へ
  3. 3半分を置き換え
    新新旧旧
    利用者:半分が新しい版へ
  4. 4全部を置き換え
    新新新新
    利用者:すべて新しい版へ
最大の台数
4台と、入れ替え中の少しの台数。Kubernetesの初期設定なら最大5台
旧新が混ざる期間
全部を置き換え終わるまで
不具合が届く範囲
置き換えた台数に応じて広がる
切り戻しの手間
もう一度、古い版へ1台ずつ置き換える。台数が多いほど時間がかかる

どの方式も、新しい版の状態を測る仕組みがあってはじめて役に立ちます。ブルーグリーンでは切り替える前のテストと切り替えた直後の監視、カナリアでは古い版との比較が判断の材料です。変えたサービスだけを出し直すマイクロサービスでは、サービスごとに方式を選べます。

データベースの変更が絡むときは、古い版でも動く形を保つ

どの方式でも、切り替えの途中や切り戻した後は、古い版のアプリもデータベースを使います。新しい版に合わせて列を消したり名前を変えたりすると、古い版が動かなくなり、切り戻せなくなります。そこで、データベースの変更は、新旧どちらの版でも動く形で先に出します。

列の名前を変える場合は、次の順に進めます。

  1. 新しい名前の列を足し、古い列も残す。古い版も新しい版も動く形にする
  2. 新しい版のアプリを、どれかの方式で出す
  3. 古い版のアプリが要らなくなってから、古い列を消す

Danilo Satoは、この進め方をパラレルチェンジと呼んでいます。エキスパンド・アンド・コントラクトとも呼ばれます。互換性のない変更を、広げる・移す・縮めるの3段階に分けて安全に進めます。Fowlerも、ブルーグリーンでは、スキーマ(データベースの表の構造)の変更をアプリの更新と分けて出すよう勧めています。

ブルーグリーンで2つの環境が別々のデータベースを持つ場合は、別の問題も残ります。グリーンが本番だった間に書き込まれたデータは、ブルーに戻すとそのままでは見えません。Fowlerは、両方の環境に取引を送る作りや、切り替えの前に読み取りだけの状態で動かす工夫を挙げています。

参考にした資料

練習問題(全5問)

Q1ブルーグリーンデプロイの説明として、最も適切なものはどれ?
Q2カナリアリリースで、新しい版に不具合が見つかったときの切り戻しとして適切なものはどれ?
Q34台で動くサービスを新しい版にするとき、最も多くの台数を同時に必要とする方式はどれ?
Q4ローリングアップデートの途中で起きることとして、正しいものはどれ?
Q5新しい版のアプリが、データベースの列の名前を変えて使う場合に適切な進め方はどれ?

選んでから「採点する」を押すと、解説つきで答え合わせができます。

関連記事

クラウドの記事を続けて読む

クラウド 全36本中20本目