これは、なにをしたくて書いたもの?
- Prometheus+Grafanaで、メトリクスの取得と可視化をSpring Bootを使ったアプリケーション以外にも試しておきたい
- MySQLのメトリクスを取得して、表示してみてはどうか
というわけで、MySQLで取得できるメトリクスを、Prometheusで収集してGrafanaで表示してみようというチャレンジです。
お題と環境
登場する要素は、以下となります。
- MySQL(メトリクス収集対象) / 8.0.13 … 172.17.0.2
- MySQL Server Exporter / 0.11.0 … 172.17.0.3
- sysbenchを実行するサーバー … 172.17.0.4
- Prometheus / 2.6.0 … 172.17.0.5
- Grafana / 5.4.2 … 172.17.0.6
環境は、いずれもUbuntu Linux 18.04 LTSです。
Prometheusでサードパーティ製のシステムからメトリクスをエクスポートするには、Exporterを使用します。Exporterがあると、
そこにPrometheusからメトリクスをPullしにいくため、対象のシステムのメトリクスを収集できるという流れです。
Exporters and integrations | Prometheus
Exporterには様々な種類があり、MySQLの場合はMySQL Server Exporterを使用します。
GitHub - prometheus/mysqld_exporter: Exporter for MySQL server metrics
Exporterを提供しているのは、Prometheusなこともあれば、コミュニティなこともあります。
で、今回はMySQLサーバーに対して、メトリクスをエクスポートするMySQL Server Exporterを用意し、この状態でsysbenchで
MySQLに負荷をかけます。
その様子をPrometheusで収集し、Grafanaで可視化しようというのが今回のお題です。
参考)
Prometheusでのさまざまな監視データ取得法 | さくらのナレッジ
Prometheus, Grafana を利用して MySQL の各種パフォーマンスをモニタリングする - Neinvalli
MySQL側の用意
MySQL側は、MySQL Server Exporterの手順に従い、ユーザーの作成と権限の付与を行います。
Building and running / Required Grants
mysql> CREATE USER 'exporter'@'%' IDENTIFIED BY 'password' WITH MAX_USER_CONNECTIONS 3; Query OK, 0 rows affected (0.13 sec) mysql> GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%'; Query OK, 0 rows affected (0.08 sec)
このユーザーを使用して、MySQL Server Exporterがメトリクスをエクスポートすることになります。
MySQL側の準備は、これだけです。
MySQL Server Exporterで、MySQLのメトリクスをエクスポートできるようにする
では、MySQL Server Exporterをインストールして、起動します。
MySQL Server Exporterのダウンロード。GitHubのreleasesから取得すればOKです。
$ wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.11.0/mysqld_exporter-0.11.0.linux-amd64.tar.gz $ tar xvf mysqld_exporter-0.11.0.linux-amd64.tar.gz $ cd mysqld_exporter-0.11.0.linux-amd64
Building and running / Running
$ export DATA_SOURCE_NAME='exporter:password@(172.17.0.2:3306)/' $ ./mysqld_exporter
9104ポートでListenするみたいですね。
INFO[0000] Listening on :9104 source="mysqld_exporter.go:232"
なお、今回は使いませんが、起動時にフラグを付けて収集する内容をコントロールすることもできるようです。
Building and running / Running
Building and running / Collector Flags
Building and running / Setting the MySQL server's data source name
Prometheusで、MySQL Server Exporter経由でMySQLのメトリクスを収集する
Prometheusは、scrape_configsにジョブを設定して起動します。targetsに、先ほど起動したMySQL Server Exporterを設定。
scrape_configs: - job_name: 'mysql' static_configs: - targets: ['172.17.0.3:9104']
これで、MySQLのメトリクスが収集できるようになりました。
Grafanaで取得したメトリクスを可視化する
最後は、Grafanaです。
とりあえず、Data SourceとしてPrometheusは設定されているものとします。
ダッシュボードは、すでに作成済みのものを使ってみることにしましょう。
左のメニューから「Create」→「Import」を選択します。
表示された画面で、インポートするダッシュボードのIDを入力して「Load」します。
ここでは、こちらのダッシュボードを使用しています。
Mysql - Prometheus dashboard for Grafana | Grafana Labs
下の方で、現在Data Sourceとして設定しているPrometheusを選択して、「Import」を押します。
すると、ダッシュボードができ、収集したMySQLのメトリクスが表示されることが確認できます。
ここで、sysbenchを使ってちょっと負荷をかけてみましょう。
※負荷をかけるのに使用しているMySQLのユーザーやデータベースは、あらかじめ作成済みのものです
## 準備 $ sysbench oltp_read_write \ --db-driver=mysql --table-size=1000000 \ --mysql-host=172.17.0.2 \ --mysql-db=sbtest \ --mysql-user=myuser \ --mysql-password=password \ prepare ## ベンチマーク実行 $ sysbench oltp_read_write \ --threads=8 \ --time=120 \ --db-driver=mysql \ --table-size=1000000 \ --mysql-host=172.17.0.2 \ --mysql-db=sbtest \ --mysql-user=myuser \ --mysql-password=password \ run
グラフに、変化があったことが確認できます。
ただ、このダッシュボードは表示項目が少ないようです。他のものを探してみましょう。
調べてみると、Perconaのダッシュボードが使われていそうな感じだったので、こちらで試してみましょう。
ダッシュボードの内容は、こちらのディレクトリ配下にあるJSONファイルをコピーしてImportすることにしましょう。
https://github.com/percona/grafana-dashboards/tree/v1.17.0/dashboards
先ほど、ダッシュボードをImportする際にIDを入れた箇所ではなく、その下のテキストエリアにJSONを貼り付けます。
あとは「Load」を押して、次のページで「Import」を押すと、ダッシュボードが作成されます。今回はInnoDBのメトリクスを
表示するダッシュボードを選択しました。
InnoDB関連の情報がいろいろ表示されます。
なのですが、これを実際に見てみるとわかるのですが、グラフを表示できていないパネルがけっこう目立ちます。
最新のExporterに対応していないとかでしょうか?
MySQL Overview dashboard for Grafana | Grafana Labs
もうひとつ、PerconaのダッシュボードをImportしてみます。
ですが、ここでも表示されないパネルがまあまああったり。
実際に使う時には、こちらのソースコードを見ながら必要なメトリクスを表示するようにパネルを作成していくのでしょうね。
https://github.com/prometheus/mysqld_exporter/tree/v0.11.0/collector
なお「http://[MySQL Server Exporterが動作しているサーバー]:9104/」にアクセスすると、その時の情報ですが、
エクスポートされたメトリクスを見ることができます。
※「Metrics」リンクを押すと表示されます
項目、多いですねぇ…。
あと、ダッシュボードの内容はJSONで確認することができるので、ダッシュボードの定義を保存して、別の環境で利用する
場合には、こちらを使うのでしょうね。
グラフに表示する内容などはけっこう適当でしたが、とりあえずExporterを使ってMySQLのメトリクスをエクスポートし、
それをPrometheusで収集、Grafanaで可視化、という一連の流れが確認できました。