/ kyokomi note / blog

俺たちのスロークエリとの闘いはこれからだ!!!(完)

December 20, 2022 [blog]

この記事は クラスター Advent Calendar 2022 (1枚目) 20日目の記事です。

クラスター社で、サーバーエンジニア兼Androidアプリエンジニアをしている kyokomi です。 (ちなみに2枚目の3日目も書いてますので、よろしけばそちらもどうぞ => とある中距離通勤の基本リモート月1物理出社

昨日は 、 @Sixeight の 「クラスター株式会社」に入社しました でしたね。

古参メンバーな自分としては、入って間もないメンバーがすごい速度で馴染んでくれて成果を出しまくっててめちゃありがたいし、自分もまだまだ頑張らないとな〜と身が引き締まる思いです!

そして、“何の変哲もないWeb” そう!まさにそうなんです! 今回話す内容は、その"何の変哲もないWeb"の裏側で使ってるSQLのスロークエリとどう向き合って、どう闘っているのかを紹介したいと思います!!!

前提知識

まず、スロークエリとの闘いについて話す前にクラスター社のWeb API Serverでデータベースがどんな構成でどういう風に利用しているのかを超簡単に最低限必要な情報だけサクッと説明したいと思います。

DBについて

実装について

レビュー体制

スロークエリとの闘い

しかし、スロークエリは発生してしまう… 前述したようなレビュー体制であっても、スロークエリーの発生を完全に防ぐことできません。

発生してしまう例

例えば…(実話かもしれないし、妄想かもしれない)

推測するな、計測せよ

ということで、毎年参加しているISUCONで、よく使って手慣れているツールでもあるpt-query-digestを使ってスロークエリの分析を始めてみました。

すると…「うわっ…このSQL、遅すぎない…?」というのがチラホラ…という感じでした。 (明らかにやばいクエリは、速攻で修正PR出して対応していきました)

Image from Gyazo

〜めでたしめでたし〜

….というわけにはいかず、一時的には解消してますが継続的に見ていかないと、また同じ問題が起きてしまうので、なんとかしたいと思います。

小さく始める「俺がbotだ!!!」

最初は、人力ではじめました。

毎日Slackのリマインダーで自分をメンションし、自分自身がbotになりきって、RDSのダッシュボードからslowquery.logファイルを24時間分ダウンロードして手元で結合し、pt-query-digestに食わせた結果のサマリーをSlackに貼り付けるマンをやりました(早口)

Image from Gyazo

数日でめんどくさくなり限界を迎えてしまいJenkinsのjob化を決意します。

頑張ればaws-cliとかでも何とかできるんですが、Goで書いたほうがレビューやメンテしやすそうだな〜と思いサクッとslowquery.logをダウンロードするツールを作りました。

実装はかなりシンプルで、本番環境のRDSのslowquery.logを24時間分forで回してダウンロードして、1つのファイルにマージして出力するだけです。

※実装イメージ(抜粋です)

Image from Gyazo

あとは、これをJenkinsのjob側のshellでpt-query-digestに食わせるだけです。

Image from Gyazo

そうなってくると次は、slackへの投稿やりたくなりますよね?

Image from Gyazo

Image from Gyazo

ちなみにこのとき知ったんですが、 pt-query-digest実行時の引数に --report-format profile を指定するとランキング部分だけ出力してくれるのでめっちゃ便利です(最初はgrepして頑張ってランキング部分以外を削ってました笑)

参考) https://docs.percona.com/percona-toolkit/pt-query-digest.html#output

毎日自動で実行してSlackに通知

最後に、このjobをスケジュール実行するようにして完成です!

Image from Gyazo

最終的にはこんな感じになりました 🎉🎉🎉 (Read専用のインスタンスとかもあるので複数通知してます)

Image from Gyazo

あとはコレをデイリーで確認して、初見スロークエリはJIRAに手動で起票して関係してそうなチームをアサインして改善していくという感じの改善フローが完成です!!!

Image from Gyazo

まとめ

楽して、楽しいSQLライフをお楽しみください〜

明日は、@thara の「子育てとclusterとキャリアパス」ですね!お楽しみに!!

last modified December 29, 2022

👋 Related posts in the ClusterAdventCalendar2022 series...