NetflixがAtlasをオープンソース公開した。同社が2012年初めから開発を続けてきた,次世代監視プラットフォームの一部分にあたる。同社がAtlasを開発したのは,時系列データを保存することで,運用状況をほぼリアルタイムに把握可能にするためだ。インメモリのデータストレージを備えることにより,非常に大量の測定情報を収集,保存し,レポートすることができる。その規模についてはRoy Rapoport氏が,“Atlasでは日常的に,毎秒数十億のデータポイントのフェッチとグラフ化を行っています。” と述べている。
Atlasは,同社のそれまでのソリューションであった,Epicと呼ばれる内製ツールと市販製品との組み合わせに代えて,同社の生成するデータの増え続けるボリュームに対処するために開発された。2011年の時点でNetflixは,同社のストリーミングサービスに関連して200万件の計測情報を監視していたが,2014年にはそれが12億件にまで跳ね上がっている。
Atlasの設計に際して開発チームが重視したのは,その目標 – 運用全般の状況把握を行うこと – に対して,適切なトレードオフを行うことだった。彼らのいう運用状況の把握とは,動作記録的なものに限らず,今現在何が起こっているかを判断できるということだ。これが最終的に,運用データに関する次のようなルールにまとめられた。
- データが古くなると,その価値は指数級数的に低下する。
- データ損失の防止よりもサービス復旧を優先せよ。
- 徐々に機能を低下するように努めよ。
実行速度を確保するために,データの大部分をメモリ上に保持することにした。さまざまなバックエンドを試した結果,最終的に,JVMヒープ内または外部のメモリ上に大部分のデータを置いて参照可能にする方法を選択したのだ。この結論はパフォーマンス的には優秀であるものの,運用面では高価なシステムになる。しかし彼らは,この点を緩和するための工夫も凝らしている。最初は,複製するデータ数を抑制することだ。同社ではデータのレプリカを,クエリのパフォーマンス向上ではなく,主として冗長性のためのみに使用している。永続的に保存されるような古いデータは,単一のレプリカのみで運用する。これによって50%以上のコストを削減している。第2の戦略は自動ロールアップに関するものだ。これは,古くてそれほど重要でない計測情報の余剰なデータを削除するもので,6時間以上経過したものを対象に,ノードディメンジョンなどを削除してストレージスペースを節約する。
自動ロールアップが重要である理由を示す例として,次元を持った計測情報がサイズ的爆発を起こす理由を,Royの示す次の例から考えることができる。
過去3時間にサービスに届いた1秒あたりの要求数を示す,簡単なグラフを考えてみましょう。最終的な出力の最小単位を180データポイントとしておきます。通常のサービスでは,要求数を示すノード毎にひとつの時系列を取得しますから,もしノードが100台あれば,中間的な処理結果は約18,000データポイントということになります。ひとつのサービスに対して,ユーザがデバイス(~1000)や国(~50)で要求をブレークダウンしようとすれば,ノードあたりの時系列数は50,000に到達します。ここで同じく100ノードを仮定すれば,同じ3時間のラインが約9億データポイントに達するのです。
Atlasは,Netflixがオープンソース化の意向を示している数多くの製品中,最初の部分であるに過ぎない。その他のものとしては,
- ユーザインターフェース
- データの閲覧とクエリ構築のためのメインUI
- ダッシュボード
- アラート
- プラットフォーム
- ストレージ層の手前で実行される,通知データのインライン集約
- オフヒープメモリとLuceneを使用したストレージオプション
- パーセンタイルを行うバックエンド
- 公開と永続化を行うアプリケーション
- ロールアップと分析を行うEMR処理
- SNMPポーリング,ヘルスチェックなど
- クライアント
- ServoとAtlasの統合サポート
- ローカルロールアップとアラート
- リアルタイム分析
- 計測情報のボリュームレポート
- 自動カナリア分析
- 外れ値と異常値の検出
- 外れ値の特性に基づいたサーバの自動選択
より詳細な情報については,こちらのWikiを参照してほしい。