20160503145236

モチベーション

  • RDS の勉強をしたい→スロークエリの設定を見てみよう
  • RDS のスロークエリをお手軽に可視化出来ないものか
  • Elasticsearch + Fluentd + Kibana(EFK スタック) を改めて勉強したい
  • 実サービスへの影響を極力抑えたい
  • 可視化する手間は極力省く

ということで、Elasticsearch + fluentd + Kibana + docker-compose を利用することで、ほぼコマンド一発で可視化する環境は起動する環境を作ってみた。

Contribute to rds-slowquery-log-demo development by creating an account on GitHub.

github.com

参考

memo

RDS のパラメータグループの設定

  • log_output : TABLE
  • slow_query_log : 1
  • long_query_time : 任意の秒数

各パラメータについて以下の通り整理。(ドキュメントより抜粋)

パラメータ デフォルト 概要 備考
slow_query_log 0 スローログを有効にする場合には 1 にする
long_query_time 10sec ログに記録されるクエリの最短実行時間の値を秒単位で指定する(最小値は 0) log_output=FILE の場合には小数点値を指定可能 / log_output=TABLE の場合には整数値を指定
log_queries_not_using_indexes 0 有効にする場合には 1 を設定する / インデックスを使用しない全てのクエリをスロークエリログに記録する
log_ouput: TABLE mysql.slow_log テーブルに書き込む
log_ouput: FILE ファイルに書き込む 1 時間毎にローテーションされる

fluent.conf を設定する


  @type rds_slowlog
  tag rds-slowlog
  host ${RDS_ENDPOINT}
  username ${RDS_USERNAME}
  password ${RDS_PASSWORD}


(snip)

コンテナのビルドと起動

コンテナをビルドして起動する。

docker-compose build
docker-compose up -d

以下のような環境になる。

20160503160348

mapping template を指定する

mapping template を指定する。

curl -XPUT http://elasticsearch:9200/_template/mysqlslowquery_template -d '
{
  "template": "mysqlslowquery-*",
  "mappings": {
    "mysqlslowquery": {
      "properties": {
        "query_time_float": { "type": "float" },
        "lock_time_float": { "type": "float" },
        "rows_examined": { "type": "integer" },
        "rows_sent": { "type": "integer" },
        "sql_text": {
          "type": "string",
          "fields": {
            "raw": {"type": "string", "index": "not_analyzed"}
          }
        }
      }
    }
  }
}'

mapping template を設定後、念のためにインデックスを削除しておく。

Kibana で確認

スロークエリが検出されると Elasticsearch にログが蓄積されるので、あとは Kibana で確認する。

20160503150300

Kibana テンプレートも一応用意してあるのでインポートすれば OK 牧場。

% tree kibana
kibana
├── dashiboard.json
├── discover.json
└── visualize.json

0 directories, 3 files

面倒だったところ

  • 当初は TABLE では無く、FILE で記録したかったけど断念
  • sql_text は analyze させないこと(multi_field は利用出来ないので注意する)
  • ローテーションを行う際のクエリも飛んできてしまうので fluent-plugin-rewrite でローテーションクエリを除外
  • query_timelock_time のフォーマットが NN:NN:NN となっているので record_transformer プラグインで強引に数値化している
  • Alpine Linux で Fluentd のコンテナをビルドしようとしたけど断念、結局、本家の Dockerfile を拝借(有難うございましたmm)

todo

  • スロークエリログを FILE にした場合にどのように可視化するかを検討する
  • docker-compose v2 に対応させる
  • も少しカッコいいグラフを書けるようにする(Kibana 力が足りてない)

以上、可視化がゴールでは無く、可視化して分析してスロークエリが無くなることがゴールであることを忘れないようにしたい。

元記事はこちら

RDS(MySQL) のスロークエリを EFK スタック + Docker で出来るだけ手軽に可視化する考察