2015年9月28日月曜日

Mongo のスロークエリを ElasticSearch に集約してみる

概要

MongoDB のスロークエリログを td-agent に食わせて、ElasticSearch にスロークエリログを溜め込んでみました

環境

  • CentOS release 6.3 (Final)
  • td-agent 0.12.12
    • fluent-plugin-mongo-slow-query (0.1.1)
    • fluent-plugin-secure-forward (0.3.2)
  • ElasticSearch 1.5.2-1

Mongo のスロークエリを td-agent に食わす

fluent-plugin-mongo-slow-query のインストール

  • td-agent-gem install fluent-plugin-mongo-slow-query fluent-plugin-secure-forward

今回は fluent-plugin-secure-forward も使うのでインストールしておきます
もちろんなくても OK です

送信側の td-agent.conf の編集

  • vim /etc/td-agent/td-agent.conf
<source>
  type mongo_slow_query
  path /var/log/mongodb/mongod.log
  tag mongod.log
</source>

<match mongod.log>
  secure no
  type secure_forward
  shared_key xxxxxxxxxx
  self_hostname mongo001
  <server>
    host elastic001
    port 24284
  </server>
</match>

source に解析対象の mongod.log の指定します
mongod.log にはあらかじめ「–slowms」オプションを使ってスロークエリが出力されるようにしておきます
tag も設定しておきましょう

match で設定した tag の情報を受け取ります
受け取ったあとは secure_forward を使って ElasticSearch サーバに送信します
secure_forward の port はデフォルトの 24284 を使っています

受け取り側 (ElasticSearch側) の td-agent.conf の設定

受け取り側でも td-agent を起動して送信側から secure_forward で送信されたデータを受け取ります

  • vim /etc/td-agent/td-agent.conf
<source>
  type secure_forward
  shared_key xxxxxxxxxx
  self_hostname elastic001
  cert_auto_generate yes
</source>

<match mongod.log>
  type elasticsearch
  logstash_format true
  logstash_prefix mongod_log
</match>

secure_forward で飛んできた情報を source で受け取り、受け取った情報に含まれている tag を元に match で処理させます

type elasticsearch を指定することで ElasticSearch にデータを送信することができます
port や host パラメータを指定しないとデフォルトの localhost:9200 に接続しにいきます
なので、あらかじめ ElasticSearch のインストールおよび設定、起動は実施しておきましょう

td-agent がいい感じに ElasticSearch にデータを入れてくれるので ElasticSearch 側は特に何も設定しないで起動しておけば OK だと思います

動作確認

各種 td-agent, ElasticSearch を起動しましょう
起動したら mongod.log にスロークエリが出るようなクエリを投げます
mongod.log にスロークエリログが出たら ElasticSearch 側にデータ入っているか確認してみます

データが ElasticSearch に入っているか確認する

localhost に API をコールして確認してみます

  • curl -X GET ‘localhost:9200/mongod_log-2015.09.24’

みたいなインデックスにアクセスすれば Json データが取得できると思います
もしインデックス名がわからない場合は

  • curl -XGET ‘localhost:9200/_cat/indices?v’ | grep mongo

あたりでインデックスの一覧が確認できます
それでもインデックスがない場合はうまく ElasticSearch にデータが送られていないことになります

今回の場合、secure_forward でデータを連携しているため、サーバ間の ACL を確認したり、secure_forward の文字列が正しいか確認してみてください
それでもダメな場合は一旦、type file を使うなどしてデータが取得 - 連携されているか確認してください

0 件のコメント:

コメントを投稿