MySQL監視ベストプラクティス

技術本部 サービスリライアビリティグループ(SRG)の鬼海(@fat47)です。
#SRG(Service Reliability Group)は、主に弊社メディアサービスのインフラ周りを横断的にサポートしており、既存サービスの改善や新規立ち上げ、OSS貢献などを行っているグループです。
本記事は、SRG 内にある DBWG(DBワーキンググループ)が全社内向けに提供しているデータベースに関する資料を公開します。
なにかの役に立てば幸いです。
 

このドキュメントの目的


MySQLを運用していく上での監視の勘所をまとめています。
メトリクスを取得する方法とそれぞれの項目についても解説します。
 

アラートトリガーにすべき値


MySQLで障害が起きた際にいち早く気がつけるようなアラートトリガーを設定しましょう。
直ちに確認・対応したほうがよい値は 、翌営業日の確認でよいものは にするなどのレベル分けをして、アラート通知が多すぎてつらいということにならないようにしましょう。
 

MySQLプロセス死活監視

MySQLのプロセス自体が生きているかの監視です。
OOM Killerなどの理由でプロセスが突然死した場合に検知できるようにします
 

MySQLプロセスの起動時間監視

下記のコマンドを利用するとMySQLが起動してからの時間を確認できます。
ここの時間が短いということはMySQLが再起動が発生したということがわかります。
 

レプリケーションステータスの監視

スレーブが正常にレプリケーションを組めているかの監視です
が両方Yesであること
が0であることを監視しましょう
 

コネクション数の監視

(現在の接続数)÷(上限接続数)の割合で監視しましょう。
上限を超えてしまうとMySQL接続エラーであるToo many connectionsがでてしまいます
余裕を持った上限設定にしておきましょう
 

ディスク残容量の監視

OSの監視になりますがデータベースはデータ使用量が増え続けていく事が多いので、適切に監視しましょう。
ディスク使用率がギリギリになりすぎるとできる対応も限られてきてしまうので、7割ぐらいの使用率を超えたらアラートで気がつけるようにしたほうがよいです。
 

スレーブでread_onlyがONになっているか

スレーブ側のDBで間違えてUPDATEなどの更新を実行しないための設定です。
MySQLのrootユーザの場合はこのread_onlyが無視されてUPDATEなども実行されてしまうので、普段の運用オペレーションではrootユーザを使わないようにしましょう
💡
MySQL5.7以降からはrootでの更新も禁止する`super_read_only`という設定も追加されています
 

注目すべきメトリクスと取得方法


リソースのメトリクスは障害の原因調査に役立ちます
障害発生前、障害発生中、障害収束後の3つの時点のメトリクスを比較することで、
原因の特定に繋げやすくなります。
 
MySQLのリソースのメトリクスはSHOW GLOBAL STATUSなどの結果を元にグラフ化することが多いです。SHOW GLOBAL STATUSの各項目の値はその時点での値(瞬間値)とMySQLが起動してから現在までの累計値(累積値)の2種類が存在しています。
それぞれの値がどちらの値なのかは明文化されていないため、予め用意されているソリューションを用いて取得するのをおすすめしています
 

スローログ件数

実行に指定した閾値以上の時間がかかったクエリが記録されています
 

現在のスレッド数

MySQLが現在実行中のスレッドの数です
💡
このメトリクスが平時より突出して高い場合は、アプリケーションの不具合でコネクションを異常に張っているか、DBが他の理由でスローダウンしているせいでアプリケーションが再接続をしつづけているかなどの理由が多いです
 

クエリの秒間発行件数

これの取得は下記の章で紹介してるソリューションで可能で
秒間でどれぐらいのSELECT、UPDATEが来ているのかを確認します。
💡
これらが以前と比べて大幅に跳ねている場合は想定以上のアクセスが来ているか、 アプリケーションのバグでクエリ数が増えているかを疑います。 逆に、クエリ数は増えていないのにレイテンシが悪化している場合は単発が重いクエリが増えている可能性を疑いましょう。
 

クエリのレイテンシ

クエリ自体の平均レイテンシや、閾値を超えたスロークエリの発生数で確認します。
これらも下記のソリューションで取得可能です。
重いクエリが増えている場合、クエリ数(アクセス数)の増大でDB自体が重くなって遅くなっているのか、アクセスはそこまで増えておらずクエリ自体が高コストでDBが重くなっているかを見極めましょう。
 

レプリケーション遅延秒数

レプリケーションの何秒遅延しているかの値です。
継続的にレプリケーションが遅延しつづけているのか、断続的に遅延して収束を繰り返しているのかを確認します。
前者の場合非常に重い更新クエリを実行してしまったか、デッドロックなどの理由が考えられれます。
後者の場合はクエリ数が増えていた場合はDBスレーブの性能が追い付かなくなっている可能性が考えられます。
 

メトリクス取得ソリューション


以下のソリューションでは、
の結果をパースしてグラフ化などをしています。
また一部ではperformance_schemaのテーブルから情報取得しているものもあります。

Percona Monitoring and Management(PMP)

Percona社が開発しているソリューション
情報を蓄積するPMM Serverと収集するPMM Clientがあります。
一通りのリソース情報がダッシュボードで用意されています。

SaaSでのリソース監視

MackerelはMySQLのリソースを収集するためのプラグインが提供されています
 
Datadogは標準のdatadog agentのパッケージにMySQLリソース収集機能が含まれています。
Datadogを始めてみましょう
Datadog Agent は MySQL データベースから、次のような多数のメトリクスを収集できます (一例)。 クエリスループット 平均クエリ実行時間や遅いクエリなどのクエリのパフォーマンス 現在開いている接続、中断された接続、エラーなどの接続 バッファプールメトリクスなどの InnoDB カスタム SQL クエリを使用して、独自のメトリクスを作成することもできます。 注: MariaDB は MySQL の "互換製品" なので、このインテグレーションは MariaDB とも互換性があります。 MySQL チェックは Datadog Agent パッケージに含まれています。MySQL サーバーに追加でインストールする必要はありません。 MySQL の準備 各 MySQL サーバーで、Datadog Agent 用のデータベースユーザーを作成します。 次の手順では、 datadog@'%' を使用して任意のホストからログインするアクセス許可を Agent に付与します。 datadog@'localhost' を使用して、 datadog ユーザーが localhost からのみログインできるように制限できます。詳細については、 MySQL アカウントの追加、特権の割り当て、アカウントの削除 を参照してください。 mySQL 8.0+ の場合は、ネイティブのパスワードハッシュ化メソッドを使用して datadog ユーザーを作成します。 次のコマンドを使用して、ユーザーが問題なく作成されたことを検証します。 は上記で作成したパスワードに置き換えます。 Agent がメトリクスを収集するには、いくつかの権限が必要です。次のように、限られた権限のみをユーザーに付与してください。 MySQL 8.0 以降の場合は、 max_user_connections を次のように設定します。 有効になると、追加の権限を付与することで、 performance_schema データベースからメトリクスを収集できます。 ホストで実行されている Agent 用にこのチェックを構成する場合は、以下の手順に従ってください。コンテナ環境の場合は、 Docker、 Kubernetes、または ECS セクションを参照してください。 ホストで実行中の Agent に対してこのチェックを構成するには: Agent バージョン 6.0 以降で利用可能 Agent の status サブコマンドを実行し、Checks セクションで mysql を探します。 mysql.performance.user_connections (gauge) The number of user connections.
 
AWSのRDS(Aurora)を利用する場合はパフォーマンスインサイトを有効にしましょう。

終わりに


SRG では一緒に働く仲間を募集しています。 ご興味ありましたらぜひこちらからご連絡ください。
 
このエントリーをはてなブックマークに追加