絶品ゆどうふのタレ

ふと気づいたことを綴るだけのメモ

Norikra meetup #2 に参加してきた

  • https://atnd.org/events/65969

  • Norikraをつかいたいなーという気持ちを主張するためにとりあえずmeetupに参加してきた。

    • 画面黄色かった
    • だいたいみんな監視系で使ってた
    • だいたいみんなSPOFで困ってた
    • やっぱ便利そう
    • 使いたい
  • AWS Summitからのはしごだったのでさすがに疲れた。。。

メルカリでのNorikraの活用、Mackerelを添えて

  • kazeburoさん
  • Mercari

  • いかに早くスムーズにサイクルを回すか

  • Zabb....?

    • いいことはいっぱい
    • 煩雑だしめんどくさい
  • DevとOpsで情報を共有

  • MetricsをDevと共有
  • これを何とかするのに、fluentd経由でkibana / bigquery / tdなどでやっている

  • 何かあった時にすぐ知りたい

  • Norikra + mackerel

  • mackerel

    • はてな提供のサーバ管理ツール
    • Serverにagentを入れると、それをMackerelに送る
    • 直接クライアントを叩くことも可能
  • Norikra にSQLを投入するとmackerelにグラフを作られるようにしてみた

    • そこにalert用の閾値設定
  • メルカリでのNorikra構成

    • 各サーバからfluentd中継サーバへ、そこからnorikra
    • access_logとerror_logが対象
    • 全件処理してる
    • jolokiaを有効にしてKuradoでJVMのmonitoring
  • Norikraが落ちる問題

    • GCの途中で落ちてるっぽい
    • 正直分からない

設定とクエリ

  • Basic count()

    • Norikraで取ってきて、mackerelに投げてる
    • mackerelのいいところ
      • グラフの特定の値の表示を消すことができる
      • わずかしか出ない数値だけを表示したいときに楽
    • 特定のUAからのアクセスが「ある」場合をグラフ化
      • 閾値以下になった場合には、アラート発砲
  • percentile

    • アクセスのレスポンスタイムのパーセンタイルを取りたい
    • 全件やるとクエリが重そうだったので、1分間の最初の五万件だけを対象に絞った
    • percentilesのプラグインが返してくるのがオブジェクトの形になってしまうので、これをフラットにするためにもう一つplugin
    • レスポンスタイムの監視は、ほとんどの速いレスポンスに引きづられるので平均は意味が無い
    • なので、パーセンタイルや中央値などを使って監視するのが正しい
  • Q: kibanaと比べてどう?

    • データを一杯入れると重いし、グラフを多人数で見るのが重たい
    • リアルタイムにエラーログを見たい、とかはkibana使ってる
  • Q: メモリとかGCオプション

    • memory 64Gのマシンで、max 40Gで使ってる
    • メモリが少ないと圧縮、とかのオプションは外してる
    • フルGCで泊まる時間はNorikraでは問題ないので、そんなに気にしてない
  • Q: クエリのタイムウィンドウはどれくらいで運用してる?

    • 1分ぐらい
    • 特別重くかかるものの時だけは5分ぐらい
  • Q: 冗長化はしてる?

    • してない

Norikra to realtime log analytics

  • harukasan

  • 昔はsshでログ取ってくるとかhogehoge

  • 今はfluentd
    • そのままTDやHDFSやElasticsearchとか
  • さらにそれをCloudforecastとか、kibanaとかtableauとか

  • fluentdがあるおかげで、ここを通せばだいたいどうとでもなる

  • でも、そこから先の解析はまだよしなにやってくれるわけじゃない

解析の方式

  • Batch processing
    • daily / monthly...
    • PVとか
  • Ad-hoc analysis
    • Kibata & Elasticsearch
    • BI Tool: Tablau
  • Offline Analysis

  • Batch processは重すぎる

    • 5分毎の・・・1分ごとの。。。というのを知りたいときには困る
    • エラー時の情報をすぐに通知して欲しい
  • こういうのに向いてる方式

  • Stream Processing

    • データはずっと流れていて、そこにtime windowを切る
    • そのデータに対して処理をする
    • Norikra
  • Norikra

    • schema less
    • SQL like query
  • fluentdから送る

    • fluent-plugin-norikra
      • target_map_tag にしておくと便利
  • じゃあその結果を他に流すか?

    • fluentd -> Norikra -> fluentd
    • sweep でタグを使って投げる

Norikra Deployment

  • Norikra / GrowthforecastあたりはSPOFで困ってる

  • Hardware

    • Norikraにはメモリいっぱい(8GB以上
  • JVM 1.7

  • jruby でbuild
  • daemonize はsupervisord

  • Q: Norikra自身の監視は?

    • 特にしてない
  • Q: どのくらいの数のクエリ入れてますか?

    • 5~6こ
    • そんなに多くはならない
  • Q: time windowどのくらいにしてる?

    • 1分にしてる
    • でかくするとすごいメモリを食う

NorikraでWebサービスを守る

  • fujiwaraさん
  • HTTP status code / response timeを書いたり
  • fluentd-plugin-(datacounter|numeric-monitor)を置き換えた

  • r3.xlarge ( 4core 30GBのメモリ )

    • メモリは10Gから多い時で20Gいくかどうか
  • クエリ数はちょっと多い

    • VirtualHost毎にカウントしてる
    • なんだかんだ40クエリぐらいかけている
  • スパマーが来た

    • Web版を出したら、APIとかが見えるので、POSTをしてきたりされた
  • APIにPOSTメソッドにモリモリ送ってきものをクエリで抽出
  • twitter経由でのログインも抽出
  • さらに10分に何回、1時間に何回、という閾値も設定
  • これで引っかかったものをfluentdの自作プラグインでフックして、memcachedに投げ込んでspam-reportが発行される

  • まとめ

    • 簡単にクエリをカスタマイズできて、自作plugin書くと色々できる

Gunosy AdのNorikra事例

  • ユースケース

    • Adでターゲティング広告みたいなことしてる
    • ユーザーの好みと外れてるものはできるだけ早く外したい
    • イケてる広告画像をできるだけ早く洗い出したい
  • 環境

    • AWS
    • アドサーバはGolangにリプレース
  • c4.large 1台あたり

    • 1000req/sec
    • 2000~2500log/sec
  • 元々はRedshift+独自の集計

    • だるい
  • ログ量多くてkibana4に生ログ突っ込むと死ぬ

    • Speak streaming 使ってもしょうがない
  • そこでNorikra

  • 最終段のところでKibana4につっこむ

  • OpsWorksでポチポチサーバ構築して多段構成を何とかしてる

    • クエリ情報は全部custom jsonにくくりだしてる
  • 監視

  • datadogはdashbordにiframe埋め込めて便利

Norikra Recent update

  • (スライド見つからなかった)

  • tagomorisさん

  • 1年間で約17リリース

  • Suspend Queries

    • なんかの理由でちょっと止めたい
    • 登録はするけど一時的に止める、ということが可能に
    • suspendしたクエリはstats fileに吐き出されないので注意
  • Nullable fields

    • 同じようなデータなんだけど複数の場所から送られてくる
    • 新しいパラメータには存在するけど、古い方にはない。。。けど集計にはどっちも含めたい!という場合
    • NULLABLE()で囲むと、 項目がnullのイベントも抽出される
  • Listener

    • クエリのグループを指定するできる
      • LOOPBACK(target)
      • STDOUT() -> 結果が出たら、メモリプールに行かずにNorikraのログに吐かれる
  • Listener plugin

    • Listernerを自分で作れる
    • これでfluentd-pluginがなくても色々できる!
    • sync listener vs async listener
  • Dynamic plugin reloading

    • SIGHUPで読み込まれるようになった
    • restartなしでよくなった
  • その他にも色々