はじめに
OCIチュートリアルに Prometheus Node Exporter を利用して Computeインスタンスの管理エージェントでメトリックを収集する方法が紹介されています。
これができるなら、mysqld_exporter を使用して、MySQLのメトリックも同様に収集できるのではと思い、今回は確認してみた備忘録となります。
前提条件
- サーバは OCI のComputeインスタンスであることを前提としています。
(検証時は、OracleLinux 8.7 のComputeインスタンスを使用しています。) - Computeインスタンスで管理エージェントプラグインを有効にし、必要な権限が割り当てられていること。
(詳細は上記、チュートリアルをご参照下さい。) - 検証サーバに MySQL Server がインストール済みであること。
(検証時は、最新バージョンとなる MySQL Server Ver 8.0.33 をインストールしています。)
手順
mysqld_exporter のインストール
まずは、mysqld_exporter をインストールします。
1 2 |
# wget --content-disposition https://packagecloud.io/prometheus-rpm/release/packages/el/8/mysqld_exporter-0.14.0-1.el8.x86_64.rpm/download.rpm # rpm -ivh mysqld_exporter-0.14.0-1.el8.x86_64.rpm |
MySQLユーザの作成と権限設定
MySQLサーバにログインし、メトリックを収集する為のユーザを作成し、権限設定を行います。
1 2 |
mysql> CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'MySQL8.0'; mysql> GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost'; |
接続情報の設定
メトリックを収集する為のユーザ情報を定義します。
MySQLサーバ側でソケットファイルをデフォルトから変更されている場合は、 socket
パス情報を変更したファイルパスに変更する必要があります。
1 2 3 4 5 6 |
# cat <<EOF > /var/lib/prometheus/.my.cnf [client] user=exporter password=MySQL8.0 socket=/var/lib/mysql/mysql.sock EOF |
mysqld_exporter 起動オプションの編集
mysqld_exporter は、デフォルトで多くのメトリックが収集されます。
例えば、多数のテーブルが存在するような環境で、information_schema
から多くの情報を収集すると、mysqld_exporter の情報収集によって MySQL Server に負荷が生じてしまう可能性があります。
https://github.com/prometheus/mysqld_exporter/issues/133
今回の検証では、SHOW GLOBAL STATUS;
の結果のみを参照できればよいので、/etc/default/mysqld_exporter
で、デフォルトで有効になっている不要なオプションを無効化します。
1 2 3 4 5 6 7 |
# cat <<EOF > /etc/default/mysqld_exporter MYSQLD_EXPORTER_OPTS="--no-collect.global_variables \ --no-collect.info_schema.innodb_cmp \ --no-collect.info_schema.innodb_cmpmem \ --no-collect.info_schema.query_response_time \ --no-collect.slave_status" EOF |
オプションについての詳細は、以下を参照して下さい。
mysqld_exporter の起動とサービス自動起動の有効化
mysqld_exporter を起動し、サービス自動起動を有効にします。
1 2 |
# systemctl start mysqld_exporter # systemctl enable mysqld_exporter |
起動後、curl コマンドで http://localhost:9104/metrics
にアクセスし、以下のような出力があることを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# curl -s http://localhost:9104/metrics ・・・(略) # HELP mysql_exporter_collector_duration_seconds Collector time duration. # TYPE mysql_exporter_collector_duration_seconds gauge mysql_exporter_collector_duration_seconds{collector="collect.global_status"} 0.005810251 mysql_exporter_collector_duration_seconds{collector="connection"} 0.000591922 # HELP mysql_exporter_last_scrape_error Whether the last scrape of metrics from MySQL resulted in an error (1 for error, 0 for success). # TYPE mysql_exporter_last_scrape_error gauge mysql_exporter_last_scrape_error 0 # HELP mysql_exporter_scrapes_total Total number of times MySQL was scraped for metrics. # TYPE mysql_exporter_scrapes_total counter mysql_exporter_scrapes_total 1 ・・・(略) |
管理エージェントの構成ファイルの作成
mysqld_exporter でメトリックの出力が確認した後、管理エージェントの構成ファイルを作成します。
1 2 3 4 5 6 |
# cat <<EOF > /var/lib/oracle-cloud-agent/plugins/oci-managementagent/polaris/agent_inst/discovery/PrometheusEmitter/mysql.properties url= http://localhost:9104/metrics namespace= mysql compartmentId= ocid1.compartment.oc1..aaaaaaaavec・・・(略) allowMetrics=mysql_up,mysql_global_status_aborted_clients,mysql_global_status_aborted_connects EOF |
各項目に設定する値は、以下のようになります。
項目 | 説明 |
---|---|
url | mysqld_exporter のメトリックを表示するURL |
namespace | メトリックのネームスペース |
compartmentId | メトリックを格納するコンパートメントのOCID |
allowMetrics | 収集するメトリック |
構成ファイルについての詳細は、以下のリファレンスをご参照下さい。
また、allowMetrics
で指定しているメトリックは、以下になります。
メトリック | 説明 |
---|---|
mysql_up | MySQLへ接続可能であるかを表す(0:接続不可 / 1:接続可能) |
mysql_global_status_aborted_clients | クライアントが接続を適切に閉じずに終了した接続の数 |
mysql_global_status_aborted_connects | サーバへの接続に失敗した回数 |
mysqld_exporter の起動オプションで収集する情報を限定したものの、SHOW GLOBAL STATUS;
の出力項目には多くの項目が存在します。
カスタムメトリックのInjectionは課金対象となる為、収集するメトリックは必要なもののみに限定した方がよいでしょう。
メトリックの確認
構成ファイルを作成した後、しばらく時間を置いてからコンソール画面でメトリックを確認してみます。
メニューから「監視および管理」-「メトリック・エクスプローラ」を選択します。
「問い合せ1」の「コンパートメント」に構成ファイルで指定したコンパートメントOCIDのコンパートメントを指定すると、「メトリック・ネームスペース」には、構成ファイルで指定したネームスペースの「mysql」が表示されています。
そのまま、「メトリック・ネームスペース」で「mysql」を選択し、「メトリック名」で「mysql_up」を選択した後、「チャートの更新」ボタンを押下します。
すると、画面上部のグラフに、5分間隔で、MySQLへの接続が可能であったことを示す「1」でメトリックが収集されていることが分かります。
続いて、「メトリック名」で「mysql_global_status_aborted_clients」を選択し、「チャートの更新」ボタンを押下すると、以下のように5分間隔で、0を記録していることが分かります。
「mysql_global_status_aborted_clients」は、クライアントが接続を適切に閉じずに終了した接続の数となりますので、MySQLサーバ側で KILL ステートメントで、既存の接続を終了させてみます。
1 |
mysql> KILL {接続ID}; |
5分程待ってから、再度、「mysql_global_status_aborted_clients」のチャートを確認すると、カウントされていることが分かります。
「クイック選択」で「過去12時間」と少し長めに指定すると、見やすいグラフになります。
次は、「mysql_global_status_aborted_connects」をカウントさせる為に、ログイン失敗を5回実行します。
1 2 3 4 5 6 7 8 9 10 11 |
# for i in {1..5}; do mysql -uroot -ptest; done mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) |
実行後に、「mysql_global_status_aborted_connects」のチャートを確認すると、5回カウントされていることが分かります。
最後に、「mysql_up」も確認しておきます。
MySQLをサービス停止します。
1 |
# systemctl stop mysqld |
その後、しばらくして「mysql_up」のチャートを確認すると、mysqld_exporter から接続できなかったことを示す「0」が記録されています。
まとめ
今回取得したメトリックとアラームを組み合わせれば、何かをトリガーにメール通知したりする事も可能となります。
但し、収集間隔が5分間隔となっていて、この間隔を狭める手法が公開されている情報では見当たりませんでした。
また、そのまま mysqld_exporter の値をPOSTするだけでは確認できない項目、例えばInnoDBバッファプールのヒット率を確認したい場合等、SHOW GLOBAL STATUS;
の出力項目を組み合わせて確認したい時に、こちらのように、別途スクリプトを実装してカスタム・メトリックを収集する形式にする必要がありそうです。
このような手間を考えると、詳細な監視を必要とする場合には、弊ブログでも何度か紹介している Percona Monitoring and Management を使用することを検討頂ければと思います。