カナリアリリース

2014年6月25日

カナリアリリースは、新しいソフトウェアバージョンを本番環境に導入するリスクを軽減するための手法です。変更をインフラストラクチャ全体に展開してすべての人に利用可能にする前に、まずごく少数のユーザーに対して徐々に変更をロールアウトします。

BlueGreenDeploymentと同様に、まずソフトウェアの新しいバージョンをインフラストラクチャの一部に展開します。この時点では、ユーザーはルーティングされません。

新しいバージョンに問題がないことを確認したら、選択された一部のユーザーをルーティングし始めます。どのユーザーに新しいバージョンを表示するかを選択する方法はいくつかあります。単純な方法としては、ランダムなサンプルを使用する方法があります。一部の企業では、世界にリリースする前に、内部ユーザーや従業員に新しいバージョンをリリースすることを選択します。より高度なアプローチとしては、ユーザーのプロファイルやその他の属性に基づいてユーザーを選択する方法もあります。

新しいバージョンに対する信頼性が高まるにつれて、インフラストラクチャ内のより多くのサーバーにリリースを開始し、より多くのユーザーをルーティングすることができます。新しいバージョンをロールアウトするための良いプラクティスは、PhoenixServersを使用して既存のインフラストラクチャを再利用するか、新しいインフラストラクチャをプロビジョニングし、ImmutableServersを使用して古いインフラストラクチャを廃止することです。

カナリアリリースは、ParallelChangeの応用であり、移行フェーズは、すべてのユーザーが新しいバージョンにルーティングされるまで続きます。その時点で、古いインフラストラクチャを廃止できます。新しいバージョンに問題が見つかった場合、ロールバック戦略は、問題が修正されるまでユーザーを古いバージョンにリダイレクトするだけです。

カナリアリリースを使用する利点は、問題が見つかった場合に安全なロールバック戦略を使用して、本番環境で新しいバージョンのキャパシティテストを実行できることです。負荷を徐々に増やすことで、新しいバージョンが本番環境に与える影響に関するメトリクスを監視および収集できます。これは、完全に分離されたキャパシティテスト環境を作成する代替アプローチです。環境は可能な限り本番環境に近いものになるためです。

この手法の名前はあまり知られていないかもしれませんが[1]、カナリアリリースはしばらくの間採用されています。段階的ロールアウトまたは増分ロールアウトと呼ばれることもあります。

大規模な分散シナリオでは、どのユーザーを新しいバージョンにリダイレクトするかを決定するためにルーターを使用する代わりに、異なるパーティション分割戦略を使用することも一般的です。たとえば、地理的に分散したユーザーがいる場合は、最初に特定の地域または場所に新しいバージョンをロールアウトできます。複数のブランドがある場合は、最初に単一のブランドにロールアウトできます。Facebookでは、複数のカナリアを使用する戦略を選択しており、最初のカナリアは社内従業員のみが表示でき、すべてのフィーチャーフラグがオンになっているため、新しい機能の問題を早期に検出できます。

カナリアリリースは、技術的な実装が似ているため、A/Bテストを実装する方法として使用できます。ただし、これら2つの懸念を混同しないようにすることが望ましいです。カナリアリリースは、問題やリグレッションを検出するのに適した方法ですが、A/Bテストは、さまざまな実装を使用して仮説をテストする方法です。カナリアを使用してビジネスメトリクスを監視してリグレッションを検出する場合[2]、A/Bテストにも使用すると、結果に干渉する可能性があります。より実際的な注意点として、A/Bテストから統計的に有意であることを示すのに十分なデータを収集するには数日かかる場合がありますが、カナリアロールアウトは数分または数時間で完了させたいでしょう。

カナリアリリースを使用する欠点の1つは、ソフトウェアの複数のバージョンを同時に管理する必要があることです。同時に本番環境で実行されているバージョンを3つ以上にすることもできますが、同時実行バージョンの数を最小限に抑えることが最善です。

カナリアリリースを使用することが難しいもう1つのシナリオは、ユーザーのコンピューターまたはモバイルデバイスにインストールされているソフトウェアを配布する場合です。この場合、新しいバージョンへのアップグレードがいつ発生するかを制御することはできません。配布されたソフトウェアがバックエンドと通信する場合は、ParallelChangeを使用して両方のバージョンをサポートし、どのクライアントバージョンが使用されているかを監視できます。使用量が特定のレベルまで低下したら、バックエンドを契約して新しいバージョンのみをサポートできます。

カナリアリリースを行う場合、データベースの変更の管理にも注意が必要です。ここでも、ParallelChangeを使用することは、この問題を軽減する手法です。これにより、ロールアウトフェーズ中にデータベースがアプリケーションの両方のバージョンをサポートできます。

さらに詳しく

カナリアリリースは、Jez HumbleとDave Farleyの著書Continuous Deliveryで説明されています。

この講演で、Chuck RossiがFacebookのリリースプロセスとカナリアリリースの詳細な使用方法について説明しています。

謝辞

フィードバックをくれたThoughtworksの同僚、Jez Humble、Rohith Rajagopal、Charles Haynes、Andrew Maddison、Mark Taylor、Sunit Parekh、Sam Newmanに感謝します。

1: この手法の名前は、炭鉱夫が炭鉱にカナリアをケージに入れて運んでいたことに由来します。有毒ガスが鉱山に漏れた場合、鉱夫が死ぬ前にカナリアが死にます。カナリアリリースは、本番インフラストラクチャ全体またはユーザーベースに影響を与える前に、潜在的な問題に対する同様の形式の早期警告を提供します。

2: ビジネスメトリクスを監視し、統計的に有意なリグレッションでリリースを自動的にロールバックする手法は、クラスター免疫システムとして知られており、IMVUによって開拓されました。このブログ記事で、この手法やその他のプラクティスについて、彼らの継続的デプロイのアプローチの中で説明しています。