Fantiaでエンジニアマネジメントを担当しております。JUです。
今回はブログを書くのが久々にはなるのですが、2021年に追加されたGCPの機能である「Cloud SQL Insights」に関して書いていこうと思います。
規模の大きいサービスを長年運営していって頭を悩ませるのはなんといってもデータベースの負荷です。
「Cloud SQL Insights」はデータベース負荷を簡単にモニタリングできる大変優秀な機能で、自分も大いに助けられています。
本記事にて紹介しますので、ぜひ使っていただきたいなと思います。
Cloud SQL Insights とは
2021年頃にCloud SQLへ追加されたデータベースへのクエリパフォーマンスを検出、診断できる機能です。
負荷の状態や処理が重いクエリをモニタリングすることが可能で、サービス負荷の根本原因の特定をすることが容易になります。
Cloud SQL Insights の始め方
Cloud SQLを新規で立ち上げる場合、MySQLの場合5.7以降のバージョンであればデフォルトで設定項目が存在しています。
gcloudコマンドでCloudSQLを立ち上げる場合は以下のような形となります。
gcloud sql instances create my-instance \ --tier db-f1-micro --database-version=MYSQL_8_0 \ --region=us-central --root-password=<PASSWORD> \ --insights-config-query-insights-enabled
これは最小スペックのMySQL8バージョンで新しいCloudSQLを作成する際のコマンドになります。
最下部の「--insights-config-query-insights-enabled」が Insights の機能を有効にするオプションです。
ダッシュボードの見方
グラフ
設定が有効になっていると、Insightsの画面が見れるようになっています。
そして以下画像のようなグラフがInsightsの画面上部に表示されます。
こちらで最大7日間まで、対象のCloud SQLにおける「負荷」を見ることができます。
「CPUとCPU待機」「IO待機」「ロック待機」の3種類の合計で負荷が見えるようになっており、問題の切り分けが行いやすくもなっています。
上位のクエリ
画面下部には「上位のクエリとタグ」というものがあり、上の画像は「上位のクエリ」です。
クエリは
SELECT * FROM `items` WHERE `items`.`id` = 4; SELECT * FROM `items` WHERE `items`.`id` = 35;
このようにふたつのクエリが実行されている場合、検出されるクエリとしては
SELECT * FROM `items` WHERE `items`.`id` = ?;
このように変動する値をマスキングして、一種類のクエリとして検出されます。
そうして「実行時間」と「実行回数」の両方を意識した形で、負荷の高いクエリを簡単に見分けることができます。
上位のタグ
上の画像は「上位のタグ」で、クエリ実行時にタグとなるフォーマットのコメントがあれば、更に詳細に負荷となっている箇所の特定が可能です。
一例ですが、Railsでは「activerecord-sql_commenter」というGemを追加することで、自動的にタグとなるフォーマットのコメントを追加できます。
gem "activerecord-sql_commenter", require: "active_record/sql_commenter"
これにより、どのコントローラーとメソッドで実行されたかが検出できます。
「上位のクエリ」ではクエリの種類でしか判別ができませんが、「上位のタグ」でどの処理が多く実行され、負荷になっているかも判別することが可能です。
まとめ
負荷検知においてスロークエリの調査や、大規模データを使った調査作業がこれだけで済むようになります。
どこが負荷となって危ないかも瞬時にわかるため、大規模サービスにおいては入れておいて損はない機能です。
Fantia開発採用情報
虎の穴ラボでは現在、一緒にFantiaを開発していく仲間を積極募集中です!
多くのユーザーに使っていただけるtoCサービスの開発をやってみたい方は、ぜひ弊社の採用情報をご覧ください。