読者です 読者をやめる 読者になる 読者になる

ひとりでやるRiak Advent Calendar 2012 day15 - fluent-plugin-riakで快適ログ生活

Ripples

さてそろそろネタも切れかけ…てない!!まだまだある!! みなさんご存知&大好きFluentdは、簡単にログを拾うことができて、しかも集めたログをS3やらHDFSやらいろんなところに書き出せるというスグレモノ。当然だけど、Riakにはまだ書き出せない(Riak CSには書き出せるよ!)。大抵のユースケースだと、長期間の分析用途にはHDFSに貯めつつ、短期間の分析用にはMongoDBに書き出すというのが鉄板だと思う。

Riakはその間くらい、Hadoopを運用する体力はないけどMongoDBじゃスケール感が足りないという人に割と合うんじゃないかと思って作ってみた。fluent-plugin-riakは、fluentdから出てくるログをいい感じでRiakに書き出すことを目指している。Riak自体は実績のあるソフトウェアなので、例えばTBからPBくらいのオーダーなら、データの保存はこなせる。クエリはワークロードによるが、多少CPUインテンシブではなく、ある程度の範囲を舐めるクエリであればそれなりにレスポンスはよいだろう。
インストールは簡単で、

$ sudo gem install fluent-plugin-riak

とする。bundlerなどを使うならそれなりにやってもらえればよい。(ちょっと追記)Riak側での設定ではデフォルトでBitcaskを使うようになっているので、これをeleveldbを使うようにしておく必要がある。2i(secondary index)を使うためだ。

-    {storage_backend, riak_kv_bitcask_backend},
+    {storage_backend, riak_kv_eleveldb_backend},

データを入れる

そして、fluent.confは

<match riak.**>
  type riak

  buffer_type memory
  flush_interval 10s
  retry_limit 5
  retry_wait 1s
  buffer_chunk_limit 256m
  buffer_queue_limit 8096

  # pb port
  nodes 127.0.0.1:8087
  #for cluster, define multiple machines
  #nodes 192.168.100.128:10018 129.168.100.128:10028 
</match>

などと書く。fluent-plugin-mongoを参考にしたので仕様についてはreピーtedlyさんのブログエントリを参考にしていただきたい。よくわからずに流用しているところもあるので、コメントやPRを頂きたいところ。tag_mappedはそのうちbucket_mapみたいな感じで使いたいなとは思っている。
Riakのすばらしいところはmongo_repsetとかややこしいことしなくても自動的に分散してくれるところですね。

データをみてみる

さて、いまのところは以下のような仕様だ。

  • "fluentlog" というBucket名を固定にしている。将来的にはこれは設定できるようにしたい。
  • indexは
    • year_int - 2013とか西暦年からクエリできるようになっている
    • month_int - 2013-2 とか月単位でクエリできるようになっている
    • tag_bin - タグ名、上記の例だと "riak.*" というタグが入っているはずなのでたとえば "riak.debug" などのexact matchで簡単にリストすることができる(mapreduceを使えば複数の一致もとれた…はず)
  • フォーマットは、複数のログがひとつのRiakオブジェクトにJSONリストで入っている。つまり "[log0, log1, log2, ...]" というふうに、バッファリングされたそれぞれのJSONオブジェクトのログがまとめてinsertされている。
  • ひとつひとつのJSONオブジェクトには、timestampとtagが付加されている。

といったところだ。これにJSやErlangでMapReduceを書けばMongo同様のクエリを発行することができる。詳しいクエリ例は後日。

これは重い操作なのでデータが多いときには非推奨だが、どのようにデータが入っているか見たいときは

$ curl http://localhost:8098/buckets/fluentlog/keys?keys=true
{"keys":["2013-02-13-ff49285f-fd50-441c-a138-ad5701dd247a","2013-02-13-d91d1140-4112-4e01-9e6c-8f37db3d08bd","2013-02-13-c14d58dd-3621-4ff0-9847-bbfbc23cef75","2013-02-13-98b7c2f1-a9d8-4818-8165-68f964105ea2","2013-02-13-51494a19-8087-4baf-9c6c-7fc1a67fc31b","2013-02-13-2676aa92-90f3-484a-a74f-7a39e28cced7"]}

とする。これで多くのキーが取得できるので、その中から、例えば

$ curl http://localhost:8098/buckets/fluentlog/keys/2013-02-13-2676aa92-90f3-484a-a74f-7a39e28cced7
[{"hello":"hello","time":"2013-02-12T16:51:06Z","tag":"riak.debug"},{"hello":"hello","time":"2013-02-12T16:51:07Z","tag":"riak.debug"},{"hello":"hello","time":"2013-02-12T16:51:07Z","tag":"riak.debug"},{"hello":"hello","time":"2013-02-12T16:51:08Z","tag":"riak.debug"}]

などととってくることができる。ああ、クエリをかけるのが楽しみで楽しみで仕方がないなぁ!!!