ログ収集と解析の改善 (BigQuery編)

こんにちは、インフラエンジニアのあしゃくらです。サムザップでインターンをしています。今回は、インターン中に行ったことの一部を書きたいと思います。

 

サムザップで運用している戦国炎舞ですが、そのログデータは、1日分だけで数百 GBにも及びます。この膨大なデータを保存、解析しなければならないのですが、コストがかかっているのが現状です。また、戦国炎舞には、合戦と呼ばれるGvGが1日に3回あるのですが、この合戦のパフォーマンス分析をするためのログ収集に、1合戦で数十分ほどの時間がかかっています。今回は、BigQueryを使用して、ログ収集・解析の高速化、コストカットを行った事例を紹介したいと思います。

要件

まず、戦国炎舞では、レイテンシーが高くなっているなどの条件で通知を送信しており、そのためにElasticsearchとKibanaが使われています。また、Kibanaによって、レスポンスタイム、500エラーの数などの状態を見ることができるようになっています。ですが、これらを行うためのログの収集、解析にコストがかかっています。

 

上記をまとめると、以下のような要件が考えられます。

 

  1. ログデータの集約、解析のコストカット、効率化
  2. ログデータ操作の簡単化、高速化
  3. ログデータの可視化、アラーム
  4. リアルタイムで集約されたログを表示

今回は、1と2の実装を紹介します。

実装

さて、ログ収集ですが、各Webサーバーで行われており、Fluentd(td-agent)というロギングエージェント(log forwarder)が起動しています。Fluentdがログを監視し、新しいログデータのエントリーがあればそれを集約サーバー(log aggregator、同じくFluentd)へ送信するようになっています。

 

fluentd_ha
ログ集約の一例(出展: http://docs.fluentd.org/articles/high-availability)

集約サーバーではログデータが蓄積され、ファイルに書き出されます。そして、このファイルが統計データを求めるスクリプトなどに参照されます。1ヶ月分のログデータのサイズはなんとTB単位…容量と保存のコストがかかっている状況です。

 

そこで、BigQueryです。BigQueryは、データのアップロードが無料であり、保存とクエリだけが課金対象となっています。Googleのストレージを借りることになるため、容量上限に気をもむ必要もありません。しかも、1ヶ月以上保存しているデータは保存料金がなんと半額になります!お得ですね。

 

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-15-12-42-06
BigQueryの料金、2016年9月15日現在(出展: https://cloud.google.com/bigquery/pricing?hl=ja)

BigQueryのクエリの課金は、クエリを実行することで探索/集約などの対象となったデータ量で決まります。クエリをうまく設計するとさらに節約できそうです。

 

FluentdからBigQueryにデータを転送するためにfluentd-plugin-bigqueryというプラグインが見つかりましたので、導入してみました!

 

集約サーバーをGoogle Cloud Engine上で新しく作り、プラグインをインストール。設定を以下のようにしました。”apache.20160915″というようなタグのログが転送されています。このタグがマッチする、match apache.**の設定を以下に記述します。

 

 

集約サーバーがGoogle Cloud Engine上で動いているので、Google APIの認証はauth_method compute_engineで十分です。スキーマは次のように定義し、schema_pathに保存しました。

 

nameにはFluentdのタグ、typeにはデータの型を記述しています。

 

最後に、Compute EngineのサービスアカウントにBigQueryへの書き込みの権限があることを確認してください。

 

BigQueryのクエリはSQLで書くことができるので、SQLに慣れていれば簡単に使うことができます。例えば、こんな感じ。

 

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-15-14-07-21

 

冒頭で述べたように、今までは1合戦の集計に数十分ほどかかっていましたが、BigQueryを使うとなんと、実行時間を数十秒に抑えることができました!これぞクラウドの力ですね。

まとめ

今回は、集約したログをBigQueryに転送することにしました。これにより、保存先の空き容量を気にせず、SQLでログデータの解析、集計ができるようになりました。ただし、クエリの対象データ量で料金が決まるので、クエリを効率良く作ることを考慮しなければなりません。BigQueryの読み込み権限だけのアカウントを使えば、誤操作でデータが削除/改変される心配もありません。

 

参考文献

  1. Fluentd High Availability Configuration: http://docs.fluentd.org/articles/high-availability
  2. BigQueryの料金: https://cloud.google.com/bigquery/pricing?hl=ja
  • このエントリーをはてなブックマークに追加