pt-query-digestをリアルタイムに取りたい!

34e9b225b73cd31e1cf54ade49015d24?s=47 Genta Kamitani
November 26, 2019
20

 pt-query-digestをリアルタイムに取りたい!

社内LTで発表したスライドです。

34e9b225b73cd31e1cf54ade49015d24?s=128

Genta Kamitani

November 26, 2019
Tweet

Transcript

  1. pt-query-digest を リアルタイムに取りたい! 開発本部 CTO室 SREG 神谷 元太

  2. pt-query-digest 知ってる人?

  3. pt-query-digest とは

  4. 大量のSQLクエリを SELECT * FROM hoge WHERE foo = 123 SELECT

    * FROM hoge WHERE foo = 456 SELECT * FROM hoge WHERE foo = 789 INSERT INTO hoge (fuga, foo) VALUES (1, 2), (3, 4) INSERT INTO hoge (fuga, foo) VALUES (5, 6), (7, 8), (9, 10) SELECT * FROM bar WHERE 0 <= baz AND baz <= 5 ORDER BY id ASC SELECT * FROM bar WHERE 10 <= baz AND baz <= 15 ORDER BY id SELECT * FROM bar WHERE 20 <= baz AND baz <= 25 ORDER BY id
  5. こうして SELECT * FROM hoge WHERE foo = 123 SELECT

    * FROM hoge WHERE foo = 456 SELECT * FROM hoge WHERE foo = 789 INSERT INTO hoge (fuga, foo) VALUES (1, 2), (3, 4) INSERT INTO hoge (fuga, foo) VALUES (5, 6), (7, 8), (9, 10) SELECT * FROM bar WHERE 0 <= baz AND baz <= 5 ORDER BY id ASC SELECT * FROM bar WHERE 10 <= baz AND baz <= 15 ORDER BY id SELECT * FROM bar WHERE 20 <= baz AND baz <= 25 ORDER BY id
  6. こう SELECT * FROM hoge WHERE foo = 123 SELECT

    * FROM hoge WHERE foo = 456 SELECT * FROM hoge WHERE foo = 789 INSERT INTO hoge (fuga, foo) VALUES (1, 2), (3, 4) INSERT INTO hoge (fuga, foo) VALUES (5, 6), (7, 8), (9, 10) SELECT * FROM bar WHERE 0 <= baz AND baz <= 5 ORDER BY id ASC SELECT * FROM bar WHERE 10 <= baz AND baz <= 15 ORDER BY id SELECT * FROM bar WHERE 20 <= baz AND baz <= 25 ORDER BY id QPS: 100 Avg Time: 200us Total Time: 200ms QPS: 50 Avg Time: 10us Total Time: 500us QPS: 1000 Avg Time: 2ms Total Time: 2s
  7. pt-query-digestのやること 大量のクエリログ 似てるやつを グルーピング 集計 Slow Log, Tcpdump, etc... pt-query-digest

  8. pt-query-digest 超便利!

  9. とはいえ

  10. いくつか欠点が……

  11. 欠点その1

  12. バッチ処理しかできない

  13. pt-query-digestのやっていること 大量のクエリログ 似てるやつを グルーピング 集計

  14. これはできない

  15. 欠点その2

  16. 予めログを取っておかないといけない

  17. 今日はたくさん 負荷来てるな〜 あとでクエリ 分析しないと

  18. そもそも さっき誰も tcpdump 取って無くない?

  19. あっ……

  20. …………

  21. こうなりかねない

  22. 欠点その3

  23. 入力となるクエリログの形式が 限られてる

  24. クエリと実行時間さえ分かれば 原理的にはどんなログでもOK

  25. これを解決するために

  26. 大量のクエリログ 似てるやつを グルーピング 集計

  27. 常にこれがリアルタイムで 動いている状態にしたい!!

  28. 代替のソフトウェアは?

  29. 大量のクエリログ 似てるやつを グルーピング 集計

  30. 大量のクエリログ 似てるやつを グルーピング 集計 Slow Log, Tcpdump, etc... pt-query-digest

  31. 大量のクエリログ 似てるやつを グルーピング 集計 ProxySQL

  32. 大量のクエリログ 似てるやつを グルーピング 集計 InfluxDB, Elasticsearch, etc.

  33. 大量のクエリログ 似てるやつを グルーピング 集計 pt-fingerprint

  34. 代替になりそうなソフトウェア • ProxySQL ◦ 現在検討はしてるけどスッと入るようなものではない • InfluxDB, Elasticsearch, etc. ◦

    現在モンストで使ってるし、こいつらで集計できると楽 • pt-fingerprint ◦ シンプルなコマンドすぎて使い勝手が悪い ◦ 大量のクエリを変換するのに向いてない
  35. ではどうするか

  36. 大量のクエリログ 似てるやつを グルーピング 集計

  37. 前から似たような機能があったので 流用

  38. None
  39. 大量のクエリログ 似てるやつを グルーピング 集計

  40. Elasticsearchなりに突っ込めば 十分そう

  41. 大量のクエリログ 似てるやつを グルーピング 集計

  42. ここだけ代替が無い…

  43. というわけで

  44. 作りました

  45. None
  46. もちろん

  47. None
  48. GitHub Actions 対応

  49. fluent-plugin-query-fingerprint • pt-fingerprintとほぼ同じことをやるfluentd plugin • クエリ中のリテラル等、詳細部分を削除する • モンストのサーバーのログは基本fluentdに流れるので組み込むのが楽 • fluentdなのでElasticsearchやInfluxDBに流すのも楽

  50. 使い方

  51. 起動 $ fluentd -c example.conf -p lib/fluent/plugin … 2019-11-26 12:37:39

    +0900 [info]: #0 fluentd worker is now running worker=0
  52. ログを入れてみる echo -e 'query:SELECT * FROM hoge where fuga =

    1' >> /path/to/query.log echo -e 'query:SELECT * FROM hoge where fuga = 2' >> /path/to/query.log echo -e 'query:SELECT * FROM hoge where fuga = 3' >> /path/to/query.log
  53. fluentdの出力 2019-11-26 12:38:03.060290000 +0900 example.input: {"query":"select * from hoge where

    fuga = ?","fingerprint":"select * from hoge where fuga = ?"} 2019-11-26 12:40:21.063140000 +0900 example.input: {"query":"select * from hoge where fuga = ?","fingerprint":"select * from hoge where fuga = ?"} 2019-11-26 12:40:27.060001000 +0900 example.input: {"query":"select * from hoge where fuga = ?","fingerprint":"select * from hoge where fuga = ?"}
  54. fluentdの出力 2019-11-26 12:38:03.060290000 +0900 example.input: {"query":"select * from hoge where

    fuga = ?","fingerprint":"select * from hoge where fuga = ?"} 2019-11-26 12:40:21.063140000 +0900 example.input: {"query":"select * from hoge where fuga = ?","fingerprint":"select * from hoge where fuga = ?"} 2019-11-26 12:40:27.060001000 +0900 example.input: {"query":"select * from hoge where fuga = ?","fingerprint":"select * from hoge where fuga = ?"}
  55. そのうち本番稼働させたい

  56. おわり