ほとラボ

It works!

ISUCON 練習会をするために InfluxDB + Grafana でポータルサイトを作った

9/17,18日に迫る ISUCON 6 予選に向けて、某若手エンジニアコミュニティで参加者を募って ISUCON 練習会を開催した。

お題は今年の出題者である pixiv さんが社内 ISUCON を開催したときの AMI を活用させていただいた。

inside.pixiv.net

やってみた結果については同じチームだった sota1235 さんがまとめてくれているのでここには書かないが、まあここままだと決勝進出はまず無理だしもっと予習を頑張らないといけない。

ポータルサイト使えない問題

本番の ISUCON ではポータルサイトが用意されていて、ベンチマーカーを実行すると自分のチームのスコアがページに反映され、また他チームのスコアもリアルタイムで確認することが出来る。

しかし ISUCON 終了後に練習用 AMI が公開される際にはポータルサイトの AMI は公開されない。一人で予習復習する分にはポータルサイトは必要ないのだし、そりゃそうだ。

しかし今回の練習会のように複数チームでわいわいやるのであれば、本番さながらに他チームのスコアがリアルタイムで見れたほうが間違いなく楽しい。こうなったら自分で作るしかないので、試行錯誤を重ねてそれっぽいものを作った。

1行もコード書きたくない

まず思いつくのは、愚直に「スコアを MySQL か何かに保存して Google Charts のようなグラフ描画ツールで表示する Web アプリケーションを開発する」こと。 ただこれは極力やりたくない。 超汎用的な手段で無理矢理解決しにいっている感じがあって、面白くもなんともない。

21世紀という便利な時代なんだから、きっと他にもっとこのニーズに最適化された解決策があるはずだ、と思う。 エンジニアだからこそ、安直にプログラミングで解決しにいってはいけない。 「送られてきたデータをグラフで表示する」くらいのシンプルなニーズであれば、1行もコードを書かずに解決したい。

あと思いつくのは Mackerel にスコア飛ばすくらいだけど、無料プランだとホスト5台までだから5チームまでしかできないのかー、でも有料プランを使うと1ホスト(チーム)あたり1800円かかってしまって現実的ではない、という感じでコスト的に除外。

そんなことをあれこれ考えてるうちに、時系列 DB を使ってみようと思い立った。

時系列 DB の機運

時系列 DB はその名の通り時系列に沿ったデータを取り扱うのに特化した DB。 用途が限定的だ思うかもしれないが決してそんなことはない。 よくよく考えると多くのデータにはタイムスタンプがついていて、それを可視化しようとなったら時系列に沿ったグラフを表示することが多いので、時系列 DB が活用できる場面は思っていた以上に多い。

時系列 DB にもいくつも種類があるが、今回は

  • 簡単に扱えそうだから
  • 比較的新しいっぽいから
  • オシャレっぽいから

という雑な理由で InfluxDB を使ってみることにした。

趣味プロダクトだし、ダメだったらそのときに次の手段を考えればいいんや。

他の時系列 DB についてはこんな感じ。

  • Elasticsearch
    • fluentd → Elasticsearch → Kibana でログ可視化、という話はよく聞く
    • 単純なデータのグラフを表示する程度のニーズで使うには複雑すぎる
    • そもそも時系列 DB じゃないし
  • RRDtool
    • 枯れてる(らしい)
  • Graphite

詳しくは: 時系列DB・可視化のいまむかし - Qiita

今回は用途が小規模かつ1日だけだったので、可用性だの何だのということは一切考えていない。 長期的にメトリクス監視をしたいなどの場合はもっといろいろと検討した方がいいと思う。

ポータルサイトでスコアを集計する仕組み

  • 競技の参加チームにはベンチマークサーバにスクリプトをひとつ入れてもらう
    • ベンチマークを実行する際にはそのスクリプトを実行する
    • スクリプトを実行すると、ベンチマークが実行されると同時に InfluxDB のサーバへデータが送信される
    • そのスクリプト: ISUCON/bench.sh at master · ngineerxiv/ISUCON · GitHub
  • InfluxDB のデータは Grafana でリアルタイムに可視化される

f:id:hoto17296:20160904205703p:plain

実際の様子

触ってみた感想

InfluxDB は導入・設定も簡単だったし、スキーマレスだし、データ構造がシンプルだし、とっつきやすいことこの上なかった。

Grafana は InfluxDB のみならずいくつもの時系列に対応していて便利。 InfluxDB がシンプルな分を Grafana のリッチさがカバーしていて、良い組み合わせ。

InfluxDB / Grafana ともに公式ドキュメントがちゃんと書かれていて、導入方法とか書こうと思ったけど特に書く必要もないかなと思った。

まとめ

  • InfluxDB + Grafana で ISUCON 練習会のポータルサイトを作った
    • シェルスクリプトちょっと書いたけどほぼ「コード書かずに」作れた
  • InfluxDB も Grafana もとっつきやすくて便利