モチベーション
- RDS の勉強をしたい→スロークエリの設定を見てみよう
- RDS のスロークエリをお手軽に可視化出来ないものか
- Elasticsearch + Fluentd + Kibana(EFK スタック) を改めて勉強したい
- 実サービスへの影響を極力抑えたい
- 可視化する手間は極力省く
ということで、Elasticsearch + fluentd + Kibana + docker-compose を利用することで、ほぼコマンド一発で可視化する環境は起動する環境を作ってみた。
github.com
参考
- https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_LogAccess.Concepts.MySQL.html
- https://github.com/kenjiskywalker/fluent-plugin-rds-slowlog
- https://github.com/kentaro/fluent-plugin-rewrite
- http://docs.fluentd.org/articles/filter_record_transformer
- http://qiita.com/ryonext/items/e8491f8abd360fae4095
- http://kikumoto.hatenablog.com/entry/2015/12/04/000152#in_mysqlslowquery_ex
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 を設定する
(snip)
コンテナのビルドと起動
コンテナをビルドして起動する。
docker-compose build docker-compose up -d
以下のような環境になる。
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 で確認する。
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_time
とlock_time
のフォーマットがNN:NN:NN
となっているので record_transformer プラグインで強引に数値化している- Alpine Linux で Fluentd のコンテナをビルドしようとしたけど断念、結局、本家の Dockerfile を拝借(有難うございましたmm)
todo
- スロークエリログを FILE にした場合にどのように可視化するかを検討する
- docker-compose v2 に対応させる
- も少しカッコいいグラフを書けるようにする(Kibana 力が足りてない)
以上、可視化がゴールでは無く、可視化して分析してスロークエリが無くなることがゴールであることを忘れないようにしたい。