多段Norikraが楽になるNorikra-listener-plugin-Norikraを作った

1ヶ月ほど前になりますが、多段Norikraを簡単に試せるようにするNorikra Listenerプラグインを作りました。

norikra-listener-norikra | RubyGems.org | your community gem host

github.com

なぜ作ったか?

ログ量が増えてくると1台のNorikraではさばくことができなくなります。

そうした場合には数台のサーバーごとにNorikraを1つ立てて、その後段に各Norikraの実行結果をまとめるNorikraを立てることで、スケールさせることができます。

例: Norikra in Gunosy Network Ads@Norikra meetup #2 // Speaker Deck

その際に前段と後段のNorikraをつなげるために、従来は下図のbeforeように間にfluentdを挟む必要がありました。

f:id:mia_0032:20151112083941j:plain

多段Norikraを試そうにも、fluentdのconf書き換えが必要になってしまうのがネックだなと思い、NorikraのWebUIから送り先を指定できれば楽になると思って作ったのが、このプラグインです。

結果的には図のafterのように間にfluendを挟まなくても多段化できるようになりました。

このプラグインを入れておけば、多段にしたくなったときに、後段のNorikraを立てて、WebUIからクエリを登録するだけで、多段化することができます。

なお、クエリ単位で変更できるので、このクエリ結果はこのNorikraへ、別のクエリ結果は別のNorikraへ、という指定もできます。

本格的に多段Norikraを運用する場合は、間にfluentdを挟みバッファリングした方が良いと思いますが、ちょっとした実験にはオススメのプラグインです。

どういう場面で使う?

例えば前段のNorikraで、1秒間のアクセス数をとり、後段のNorikraでそれらをまとめてSUMすることで1分間のアクセス数を得るといった使い方ができます。

前段のNorikraは流れてくるログを直接受けるため、マシンリソースがシビアになりがちで、あまりWindowの長い集計をするのは難しいです。

後段には前段の集計値しか流れてこないため、マシンリソースには余裕があり、そのため、後段で長いWindowの集計を行えば、目的としている集計値を安定して取得することができます。

他にも1段目のNorikraで単純なログの加工や必要なカラムにのみに絞る処理を行い、後段でそれを集計するといった使い方も考えられます。

UUであれば、前段で短いWindowでuser_idをDISTINCTし、後段でさらにDISTINCTしてCOUNTすれば、1台で行うよりはメモリを食わなくなるかなと思います。

使い方

クエリグループに NORIKRA(<送信先Norikraのhost>:<送信先Norikraのport>,<送信先のtarget>) と記述するだけです。

クエリの実行結果が指定したNorikraに送信され、指定したtarget名で登録されます。

あとは通常の流し込まれたデータと同じように扱うことができます。

最後に

使ってみて、この機能欲しいとか、不具合あれば遠慮なくIssueかプルリクしてください。

関連エントリ