こんにちは。Songmuです。
この記事ははてなエンジニアアドベントカレンダーの3日目です。
昨日、Hatena Engineer Seminar #3を開催いたしました。何より参加率が高かったことに感激したのですが、その分少し窮屈な思いをさせてしまったかもしれないのは申し訳なかったです。多数のご参加本当にありがとうございました。
セミナーではMackerel overviewという話をさせてもらったのですが、そこでお話したMackerelで採用している技術について説明します。
Mackerelとは?
今年の9月17日にリリースしたはてな謹製のサーバー管理・監視ツールです。
数多くのサーバーを運用しているはてなは、これまでサーバー管理ツールを内製してきたのですが、そのノウハウを活かし、サービス用に新たに一から作ったサービスになります。
また、はてなの既存サービスとは性質が異なるため、技術選定もはてなではこれまでそれこと使ったことのなかった技術も積極的に採用しています。
アーキテクチャ
ユーザーは管理対象のサーバーに、mackerel-agentと呼ばれるエージェントをインストールします。このエージェントが、APIを通して定期的にサーバーの状態をPOSTします。ユーザーはダッシュボードを通してサーバーの状態やグラフをみられるほか、通知設定をすることによりアラートを受け取ることが可能です。
mackerel-agent
mackerel-agentはGoで書かれた常駐プログラムです。ユーザーさんのサーバーにインストールしてもらうということもあり、OSSになっています。
何故Goで書いたのかというと理由は以下のようなものが挙げられます。
- シングルバイナリが吐けるのでセットアップが簡単
- マルチプラットフォーム対応が比較的容易
- OSX/Windowsでも動作可能(現状サポート外)
- 常駐プロセスを書くことに向いている
- フットプリントが小さく監視対象のサーバーのパフォーマンスに影響を及ぼさない
現在多くのユーザーにお使いいただいており、安定的に稼働しているので、この選択は間違っていなかったと感じています。
ユーザーダッシュボード
JavaScriptのフレームワークとしてAngularJSを採用しています。また、グラフ描画部分など一部にTypeScriptを導入しており、これから導入部分を増やしていきたいと考えています。JSのビルドはgulpを採用しています。
AngluarJSやTypeScriptを採用しているのは、規約がしっかりしており長期的にメンテナンス可能なサービスを作る上では必要だと考えたためです。
バックエンド構成
一般的なWebアプリケーション構成に沿っていますが、はてなとして特徴的なのは以下が挙げられます。
- ApplicationにScalaを採用
- RDBにPostgreSQLを採用
- TSDB(Time series database:時系列データベース)にGraphiteを採用
Scala
はてなではこれまでほとんどのサービスをPerlで開発してきましたが、MackerelではScalaで開発をしています。
採用経緯は、 id:hakobe932 のYAPC::Asia 2014でのトークScala In Perl Company や id:mechairoi のScalaMatsuriでのトーク Scala use cases at Hatena に詳しいですが、主な理由に以下のようなものが挙げられます。
- 表現力の高い静的型システム
- 記述の柔軟さ簡潔さ
- Web開発の実績
- 社内に書ける人がいる
- Java資産を含む豊富なライブラリ
- ミッションクリティカルなサービスなのでかっちりした言語を使いたい
- リードエンジニアの趣味
フレームーワークにはPlay2、ORMにはSlickを採用しています。
実際Scalaを書いてみると、LLの様な柔軟な書き方が可能でありながら、型に守られている安心感があります。実際deploy直後にアプリケーション起因の障害を起こしてしまうようなことは発生していません。
ただ、よく言われることですが、コンパイル時間の長さに難があるので、そこは改善したく思っています。
PostgreSQL
はてなではこれまでMySQLを使うことが多かったのですが、MackerelではPostgreSQLを採用しています。それは以下の様な理由が挙げられます。
- JSON型
- 柔軟なindex
- JSON型のキーにすらindexが張れる
- indexに式を指定可能
- チェック制約
Mackerelはサービスの性質上、データ構造が保存する複雑になり得るため、RDBMSでありながらJSON型のようにKVSライクに使える機能も持ったPostgreSQLは非常に魅力的でした。
Graphite
Graphiteはpython製の時系列データベースの一つです。時系列データベースを使うとグラフ描画がやりやすくなります。古くはRRDツールが有名です。Graphiteは比較的枯れており、現在も開発が積極的にすすめられているため採用しています。
Graphiteはなかなかおもしろい構成になっており、CarbonというTCPのtext protocolで通信を行うtwistedのデーモンで入力を受け付け、それをwhisperという独自形式のファイルに書き込みます。データは、Djangoで作られたWebAppからJSONを受け取れるようになっています。
Carbonへの入力はkey, value, timestampの組を指定するのですが、これはsensuが出力するデータをそのまま入力出来るようになっているため、Graphiteはsensuと組み合わせて使われることが多いようです。
このようにMackerelでは半分は合理的選択、半分は新しい挑戦として、これまで取り組んできたことのない技術も採用しています。まだまだ、ノウハウが足りない部分も多いため、これらの技術に自信のある方、また新たなサービスで新たな技術に取り組んでみたい方も是非採用にご応募ください。
明日は id:y_uuki です。Goの話を書いてくれるようです。楽しみですね。