無印吉澤

ソフトウェア開発、運用管理(俗にいう DevOps)、クラウドコンピューティングなどについて、吉澤が調べたり試したことを書いていくブログです。

Norikra Meetup #2 参加レポート

f:id:muziyoshiz:20150604215341p:plain
イベントページ: Norikra meetup #2 : ATND

僕自身はNorikra使ったことないのですが、周囲には使っている人がいて評判も良いので、他の人のユースケースも聞いてみたい、あわよくば自分とこの業務にもねじ込みたい、と思い参加してきました。期待通り、ユースケースを色々聞けて面白かったです。

今回聞いたNorikraのユースケースには、大体以下のような共通点がありそうに感じました。

  • ステータスコードごとの件数を集計するために使っているところが多い
  • Norikraでの集計結果は、Fluentdを介して、他のツール(MackerelやらZabbixやら)に渡す
  • Norikraが落ちたら落ちたで諦めるという割り切りで使う(冗長化はcold standby程度)
  • 同じデータをデータベースにも流し込み、Norikraはあくまで速報値やアラート用に使う
  • メモリを大量に積んだマシンを用意すればなんとかなる
  • Gunosyの事例のように、分散型のシステム構成も取れる

個人的には@さんの、NorikraでSPAM検出する話が特に面白かったです。Webアプリケーション全般でこういうニーズはありそうなので、fluent-plugin-spam-reactor公開してくれたら嬉しいなあ……。

@ さんの挨拶

  • 参加者へのアンケートの集計結果
    • Norikraを知っていますか? → 107 /119
    • 使ったことがありますか? → 34 / 119

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

  • メルカリ1500万DL、急成長を支える運用

    • メルカリで運用系エンジニアとして働いている
    • PDCAをいかに早く、スムーズに回すかが重要
    • Zabbixも色々できるが辛い
  • DevOps

    • 開発者は直接SSH接続できないようになっている
    • 開発者は、過去のデータを見たい場合はtreasure data, bigquery, kibanaを見る
    • graphとalertも共有。Devも監視条件を指定したい
  • Norikra+Mackerel

    • Mackerel: 様々な時系列データを可視化・監視できる
      • MackerelのメインはAgentを入れてHost Metricsを取る(うちは使ってない)
      • clientからservice metricsを送ることもできる
    • Norikra+Mackerelで1ヶ月くらい使った感想として、しきい値設定が楽
    • アラートをSlackに通知(グラフも表示できる)
    • access_logとerror_logを、サンプリングせずに全件対象
      • 細かいエラーが取れなくなるのを避けるため
  • Norikraの運用

    • Jolokiaを有効にして、KuradoでJVMのmonitoring
    • Norikra自体は長い間使っているが、落ちる問題がある。同じようなことが起きてる人がいたら原因を教えて欲しい
  • 設定とクエリ

    • fluentdの設定で、Norikraのgroupを指定
    • HTTPステータスコード(2xxとか)ごとの件数を集計してグラフ化
    • Mackerelの良い所は、積み上げグラフのなかから、特定の種類のグラフだけ表示できる(件数が少ない5xxだけグラフ表示、など)
    • 特定UAからのアクセスをcountし、特定のUAからのアクセスがない場合にアラート発報している
    • 90,95,98,99パーセンタイルの平均値をグラフ化
      • flatten_hashに通してからでないと、mackerelが受け取れない
      • 平均値は、早いレスポンスに引きずられる。そのため、中央値やパーセンタイルで監視したほうが意味がある
  • Q&A

    • [Q] Kibanaと比べて良い所/悪いところ
      • [A] Kibana、グラフを多人数で見ると重たい。Mackerelは集約後のデータなので、グラフが軽い。エラーログの詳細はKibanaで見る。
    • [Q] Norikraの環境、オプション
      • メモリ64GBのマシン
    • [Q] クエリのタイムウィンドウはどれくらい?
      • [A] 基本1分。データとしてもう少し長く見たいのがあって、ログインのエラー回数。これはもう少し長くて5分とか。
    • [Q] Norikraの冗長化は?
      • [A] やってない

ログ解析にNorikraを導入する (@)

  • 自己紹介

  • Log ecosystem with Fluentd

    • Fluentdで集約→log storage→visualization/analytics(GrowthForecast, HRForecast, Spreadsheet, Tableau)
    • Pixivでの構成は、Google BigQueryのバッチ結果をHRForecastに書き込み、Jenkinsでバッチ実行
    • ログの転送はFluentdのおかげで綺麗になった
    • でも、データベースは1個に集約できず、複数使い分ける必要があるのが現状
  • 処理色々

    • バッチ処理
    • アドホック解析
      • Kibanaが流行って、みんなやり始めた
    • Offline Analysis
      • 日本にはExcel使いが多い
    • バッチ処理は時々重すぎる
    • 5分毎の傾向を知りたいとか、1日の傾向を知りたいとか、バッチに時間が掛かるので頻繁にクエリを投げられない
  • Norikra

    • スキーマレス、SQL-likeなクエリを書けるのが良い
    • status codeごとのカウント
    • ログをカウントして100件超えたら出力、とか
    • NorikraからBigQueryとかに渡すところをどうするか? → もう一度Fluentdに渡す → Fluentdに振り分けを任せる
    • Query Groupを、データを流す先ごとに作る。gfとかIdobataとか
  • Norikraの運用

    • NorikraのところがSPOF
    • Norikraのマシンは8GB以上のメモリを必要とする。メモリを大量に載せたほうが良い
    • CPUはさほどいらない
    • Supervisordでデーモン化
  • Norikra導入前

    • Fluentdの、似た名前のややこしいプラグイン2つ(fluent-plugin-numeric-monitor, fluent-plugin-numeric-counter)を使っていた
    • コンフィグに頑張って正規表現を書く、ということをやっていたが、fluentdの再起動が必要だったり、設定ファイルを配ったりが面倒
    • Norikraでやると楽
  • Norikraの監視

    • engine statisticsをMuninで出している
    • Norikraは安定しているので、監視にはあまり手が回っていない
  • Q&A

    • [Q] クエリ数は?
      • [A] 5〜6個。フィルタして秒間1000個くらいのイベントに適用(@kazeburoさんから、自分のところは11個あるとコメント)
    • [Q] タイムウィンドウは?
      • [A] 大きくするとメモリを食うので、すべて1分にしている

NorikraでWebサービスを守る (@)

  • 自己紹介

    • KAYAC
    • コミュニティ系のサービスにNorikraを入れている
  • Norikraの使い方

    • レスポンスコード別の件数をグラフ化
    • 10msec以下、100msec以下、ごとの件数をグラフ化
    • worker logsの集計
    • 元々はfluentdのプラグインで全く同じグラフを書いていた。裏側だけを切り替えて、見た目は全く変わっていない
    • ピーク時で10,000 msg/sec
    • ログ集計のためにログをRedshiftに入れて、それとは別にNorikra→Zabbixでグラフ描画
    • r3.xlarge (4core 30GB mem)を使い、75%くらいのメモリをNorikraに割り当てている
  • 背景

    • コミュニティ系のWebサービスだとスパマーが来る
    • 最初はスマホアプリonlyだったのであまり来なかった
    • Webバージョンをリリースしたらスパマーが来るようになった
  • 集計方法

    • 特定のURLに対してPOSTされた件数をhostごとにカウント
    • twitter経由でログインされた件数をhostごとにカウント
      • ペースを落としてログイン試行する奴がいるので、1分ごと、10分毎、1時間毎、で別のしきい値をかけている
  • fluent-plugin-spam-reactor

    • 内部で使っているだけなので未公開
    • 単純にNorikraに入れようとすると詰まることがある。aggregatorで詰まるとか
    • 詰まってからドカンと流れてきた時に誤検知しないようにしている
    • ログの最初の時刻と最後の時刻を差をとって、その時間内の1分あたりの件数を出すことで、誤検知を防ぐ
    • spam-reactorは、何度もひっかかったhostは、banする時間をexponentialに長くしている
      • 1時間banして、1分計測して再検知してban、とやっていると、再検知中の1分間は攻撃できてしまう
      • hostの情報はmemcachedに記録

GunosyのNorikraを用いたアドネットワークのリアルタイム集計 (@)

  • 自己紹介

    • Gunosy、ニュースだけじゃなくてアド事業もやっている
    • 広告配信関連の開発マネージャ
  • ユースケース

    • CTRや消化額、CPAの半リアルタイムフィードバック
    • 半リアルタイムの可視化・分析のニーズ(Kibanaとか)
  • 環境

    • アドネットワーク用アドサーバをgolangでリプレース
    • c4.large 1台あたり、1,000 req/sec
    • Norikraにはログの一部を投げている
    • Redshiftの運用は割と辛いので、定時バッチくらいにしたい
    • ログ量多くてKibana4に直接突っ込むと死ぬ→Norikraでさばきたい
  • 多段Norikra

    • 2〜3台のAPIサーバに対して、1台のfluentd+Norikraサーバ
    • でかいサーバを1台設置で良い? → アドテクでは、カジュアルに急にサーバが増えたりする。急激にトラフィックが跳ね上がる
    • 拡張性を残しておきたかった
    • 最終段のNorikraでサマった値を1分ごとにKibana4へ投入
    • 非エンジニアでも最低限必要な情報をドリルダウンできる
    • OpsWorksでNorikraのサーバ構築できる。設定はすべてcustom jsonにくくりだし
  • Norikra自体の監視

    • Datadogで監視
    • Papertrailで、FluentdとNorikraのログを監視
    • Datadogはiframeを埋め込めるので、Kibanaの画面も埋め込めて便利
  • 速報値はNorikraで集計、正確な値はRedshiftでバッチで集計

  • Opsworksで、一人でもアドサーバの監視・運用はできてる

Norikra Recent updates & Ask me anything (@)

  • suspended queries

    • 一時的に止めたいときに使う機能
    • 再起動したら消えてしまうクエリなので注意
  • NULLABLE fields

    • 一部のマシンのみカラムを増やした(バージョン混在)、といった場合に使える
    • そのカラムがNULLでも、集計対象にする、というための指定(デフォルトだとクエリに入っているカラムがないと、そのデータは無視される)
  • Listener

    • memory poolにためたものを、clientがfetchして使う
      • fluent-plugin-norikraはこれを自動で行うので、意識してない人が多いかも
      • 自動で行われているが、それでもfetchするぶんだけ性能に効いてくる
    • STDOUT() → Norikraのログに出てくる。クエリを試したいときに便利
    • fluentdに渡すlistenerの例
    • 自社のシステムに渡したいような場合も、listenerを書けば良い
  • Dynamic plugin reloading

    • 1.3からSIGHUPを受け取ると、gemでインストールしたプラグインをリロードしてくれる
  • Q&A

    • [Q] クエリ対象の文字列に " や ' が入っているとLIKE検索に失敗した
      • [A] Esperの検索は、Javaの文字列として解釈されるからかも? Issueに登録して欲しい
    • [Q] Dynamic plugin reloadingはFluentdに入らない?
      • [A] Fluentdの設定ファイルを安全にロードするのは難しそう。match節の増減などもあるため。範囲を限定すればできるかも