発明のための再発明

Webプログラマーが、プログラムの内部動作を通してプログラムを作る時の参考になるような情報を書くブログ(サーバーサイドやDevOpsメイン)

Azureにおけるデプロイ停止の取り組み - Gandalf

はじめに

バグのないコードは書けないません。
それを前提に、ブルーグリーンデプロイやカナリアリリースが実践されています。
それらの方法ではどのように問題を発見するかが重要になります。
この記事で紹介するGandalfは、Azure内で稼働する障害検知のためのシステムです。

Azureはクラウドサービスとして、安全なデプロイを行うために以下のような4層のチェックを入れています
f:id:mrasu:20200512221429j:plain

Gandalfは、最後の「全体の監視」のためのシステムです。

今回の記事では、「Gandalf: An Intelligent, End-To-End Analytics Service for Safe Deployment in Large-Scale Cloud Infrastructure」から、Gandalfの仕組みを紹介します。

この論文によると、Azureでは1日に100以上のロールアウトが行われ、そのうちの20%以上が1000分以上かかるそうです。そのため、複数のロールアウトが同期間に実行されることは避けられません。
そのため、Gandalfは

  • 障害の検知
  • 障害を引き起こしているロールアウトの推定

という過程を通して、問題のあるロールアウトを停止します。
以下では、それぞれに使われている方法を紹介します。

Gandalf概要

f:id:mrasu:20200512221512j:plain
Gandalfでは、各ノードから送られてくるデータを使用し、上図のように

  • 各ノードのデプロイ前後1時間のデータのみを使用する分析 (Speed Layer)
  • 長期間(30日)のデータと複雑なモデルを使用する分析 (Batch Layer)

という2種類の分析を同時に行い、異常を探します。
ロールアウト開始直後に発生する問題もあれば、長期間動かさなければ発生しない問題もあるため、長期と短期の両方を分析対象としています。
異常を検知した場合にはロールアウトを停止すると共に、開発者への情報提供も行います。

障害検知

Gandalfは各ノードからOSのイベント情報やログ、APIのステータスなどを収集しています。
しかし、ハードウェア障害のようにソフトウェアの変更とは関係のない問題も発生します。
そのため、デプロイに起因した障害を抽出する必要があります。

そのために、

  1. エラーのグルーピング 例えば、エラーコードとエラーメッセージを受け取る場合、エラーコードは複数のエラーで重複し、メッセージは構造化されていません。そのため、エラーメッセージからIDなどを除外し、Incremental hierachial clusteringを使用することで、エラーをまとめています。
  2. エラー傾向を予測し、ハズレ値を取るものを検出する
    まとまったそれぞれのエラーに対して、Holt-Winters法を使用して障害の発生数を予測します。その予測と4シグマ離れていた場合、対象のエラーがロールアウトに起因すると判定します。

上の2つの段階を経ることで、ロールアウトに関係したエラーを監視します。

原因検知

障害を発見したら、原因のロールアウトを特定します。
Gandalfは以下の方法でロールアウトと障害の関係度(correlation)を計算しています。

  1. ノードを変更した時間と障害発生時間の差から、各ロールアウトと障害の関係度を取る
  2. 障害が発生したノードの数とロールアウト期間に発生した数の割合を求め、障害に関係するロールアウトをピックアップする
  3. 最近のロールアウトをより重視するための重み付けをする

こうして得られた値から、障害と最も関係のあるロールアウトを割り出し、開発者に伝えます。
さらに、影響する顧客数やノード数などを基にロールアウトの停止もGandalfが判断します。

終わりに

このように、Azureではロールアウト中に障害を検知し、ロールアウトを停止しています。
この記事では障害検知の仕組みのみを説明しましたが、論文では計算式やその背景、Gandalfが発見したエラーの具体例なども書かれているので、興味が湧いたらぜひ読んでみてください。