「PMP for Cacti」でMySQLのステータスを可視化する
PMP(Percona Monitoring Plugins)とは
「PMP(Percona Monitoring Plugins)」は、本連載の第2回で紹介したpt-query-digest(Percona Tookit)でもおなじみのPercona社が開発・配布する監視プラグインです。MySQL(RDS用のものもある)以外にApache、JMX、Linxuの基本項目、MongoDB、Nginx、redis監視用のテンプレートも含まれています。
今回紹介するのはリソースをモニタリングする「PMP for Cacti」ですが、ほかにも「for Zabbix」やPercona Toolkitと連携することで単純な死活監視に留まらない監視を提供する「for Nagios」も存在します。これらの詳細はPercona Monitoring Pluginsから確認できます(2016年4月現在の最新版はPMP 1.1.6)。
ここで、Cactiについても簡単に紹介しておきましょう。Cacti(カクタイ)はRRDToolをバックエンドに利用したオープンソースのフロントエンドアプリケーションです。ホスト単位で複数のRRDファイルから作成したグラフを1画面に表示したり、RRDファイルへの入力スクリプトをWEB画面上で紐付けられたりと、リソースモニタリングを始めるにあたって便利な機能が揃っています。読者の皆さんの中にも「利用している」「名前を聞いたことはある」という方が多いのではないでしょうか(え? 「重いからやめた」……? そういう方がいらっしゃるかも)
Cactiの魅力の1つは、サードパーティー製のテンプレートが充実しているです。PMP for CactiはCactiでMySQLをモニタリングするにあたってのデファクトスタンダードのような存在となっています。
既にCactiを運用している環境であれば、PMP for Cactiを導入することで収集できる情報が一挙に増えます。リソースモニタリングでは「取っていない情報はさかのぼることができない」が原則なので、特に手間をかけずに収集するメトリックスが増えるのは嬉しいことです(ただしRRDに対する書き込みも増えることに留意)。
PMP for Cactiのインストール
それでは、まずPMP for Cactiをインストールしてみましょう。なお、今回はCactiそのもののインストール方法について詳しくは触れません。Cactiは既にセットアップ済みのものとして説明を進めます。
yum、aptリポジトリーを利用したインストール
PMP for CactiはPercona Toolkitと同様にPerconaのyum、aptリポジトリーからインストールできます。Perconaのリポジトリー登録については第2回で説明しているので割愛し、ここではコマンドのみ例示します。
なお、CentOSではCactiのセットアップ前にPerconaのリポジトリーをセットアップしてしまうと、cacti
パッケージの依存関係によりPercona-Server-client-57
、Percona-server-shared-57
、Percona-Server-shared-51
がインストールされます。Percona Server 5.7のライブラリーがインストールされてしまうため、同じサーバーにCacti用のMySQLをyumでインストールしようとした場合はPercona-Server-server-57
を利用することになります。5.7ではsql_modeのデフォルトが変更されたため、そのままではCactiを動かすことができないので注意してください。
PMP for Cactiのパッケージ名は、yum、aptリポジトリーともにpercona-cacti-templates
です。CentOSまたはUbuntuでは、以下のコマンドでインストールします。
$ sudo yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
$ sudo yum install percona-cacti-templates
Debian 8では、以下のコマンドでインストールします。
$ wget https://repo.percona.com/apt/percona-release_0.1-3.$(lsb_release -sc)_all.deb
$ sudo dpkg -i percona-release_0.1-3.$(lsb_release -sc)_all.deb
$ sudo apt-get update
$ sudo apt-get install percona-cacti-templates
その他のインストール方法
Percona Toolkit同様に、PMP for Cactiをrpmやdpkgから直接インストールしたり、ソースコードからインストールしたりすることもできます(説明は割愛)。rpm、dpkgのダウンロードページはこちらです。
MySQL監視テンプレートの登録
PMP for Cactiをインストールするだけでは監視テンプレートが有効になりません。コマンド(Cactiに同梱されているimport_template.php
)を利用してテンプレートを登録する必要があります。登録に必要なXMLファイルは/usr/share/cacti/resource/percona/templates
ディレクトリにインストールされています。
$ ls -l /usr/share/cacti/resource/percona/templates/
total 1892
-rw-r--r-- 1 root root 74554 Jan 11 10:39 cacti_host_template_percona_apache_server_ht_0.8.6i-sver1.1.6.xml
-rw-r--r-- 1 root root 104933 Jan 11 10:39 cacti_host_template_percona_galera_server_ht_0.8.6i-sver1.1.6.xml
-rw-r--r-- 1 root root 273814 Jan 11 10:39 cacti_host_template_percona_gnu_linux_server_ht_0.8.6i-sver1.1.6.xml
-rw-r--r-- 1 root root 54091 Jan 11 10:39 cacti_host_template_percona_jmx_server_ht_0.8.6i-sver1.1.6.xml
-rw-r--r-- 1 root root 76166 Jan 11 10:39 cacti_host_template_percona_memcached_server_ht_0.8.6i-sver1.1.6.xml
-rw-r--r-- 1 root root 93264 Jan 11 10:39 cacti_host_template_percona_mongodb_server_ht_0.8.6i-sver1.1.6.xml
-rw-r--r-- 1 root root 888147 Jan 11 10:39 cacti_host_template_percona_mysql_server_ht_0.8.6i-sver1.1.6.xml
-rw-r--r-- 1 root root 42607 Jan 11 10:39 cacti_host_template_percona_nginx_server_ht_0.8.6i-sver1.1.6.xml
-rw-r--r-- 1 root root 169753 Jan 11 10:39 cacti_host_template_percona_openvz_server_ht_0.8.6i-sver1.1.6.xml
-rw-r--r-- 1 root root 99944 Jan 11 10:39 cacti_host_template_percona_rds_server_ht_0.8.6i-sver1.1.6.xml
-rw-r--r-- 1 root root 37873 Jan 11 10:39 cacti_host_template_percona_redis_server_ht_0.8.6i-sver1.1.6.xml
冒頭の「PMP(Percona Monitoring Plugins)とは」の段落でも少し触れましたが、PMP for CactiにはMySQL以外の監視テンプレートも含まれています。MySQL以外の監視テンプレートをインストールしたい場合は、以下のコマンド例のXMLファイルを指定している部分を変更してください。
$ sudo php /usr/share/cacti/cli/import_template.php --filename=/usr/share/cacti/resource/percona/templates/cacti_host_template_percona_mysql_server_ht_0.8.6i-sver1.1.6.xml --with-user-rras='0:1:2:3:4'
using RRA Daily (5 Minute Average)
using RRA Weekly (30 Minute Average)
using RRA Monthly (2 Hour Average)
using RRA Yearly (1 Day Average)
Read 888147 bytes of XML data
..
** Host Template
[success] Percona MySQL Server HT [update]
"CDEF"、"GPRINT Preset"、"Data Input Method"、"Data template"、"Graph Template"、"Host Template"の全てが "[success]"で終了すれば登録完了です。テンプレート登録前の"Data Input Method"の状態が図1、テンプレート追加後の"Data Input Method"の状態が図2です。
その他にも、"Host Templates"や"Graph Templates"もMySQL用のものがインポートされたことを確認できます。
データテンプレートの調整
PMP for Cactiで追加されるデータテンプレートには「監視対象のMySQLのポート」や「監視対象のMySQLのログインアカウント、パスワード」に関する情報が設定されていないため、Web画面(図3)でデータテンプレートを編集して"Password"、"Username"を設定し(サーバーごとに違うユーザー名とパスワードを使用する場合はチェックボックスにもチェックを入れる)、"Port"の"Use Per-Data Source Value (Ignore this Value)"にチェックを入れておく必要があります("Hostname"は登録時にIPアドレスが自動で引き渡されるためそのままでOK)。
筆者はこれ(全データテンプレート分実施する必要があります)が面倒だったため、以下のようにCactiのテーブルを直接書き換えることにしました。
ステータスの収集に利用するMySQLのログインユーザー名を"pmp"、パスワードを"pmp_pass"、MySQLのデフォルトのポートを3306として、ホストごとに指定できるように"Use Per-Data Source Value (Ignore this Value)"をチェックした状態にUPDATEしています。
mysql> UPDATE data_input_fields JOIN data_input_data ON data_input_fields.id= data_input_data.data_input_field_id JOIN data_input ON data_input_fields.data_input_id = data_input.id
-> SET data_input_data.value = 'pmp' WHERE data_input.name LIKE 'Percona %' AND data_input_fields.name = 'Username';
mysql> UPDATE data_input_fields JOIN data_input_data ON data_input_fields.id= data_input_data.data_input_field_id JOIN data_input ON data_input_fields.data_input_id = data_input.id
-> SET data_input_data.value = 'pmp_pass' WHERE data_input.name LIKE 'Percona %' AND data_input_fields.name = 'Password';
mysql> UPDATE data_input_fields JOIN data_input_data ON data_input_fields.id= data_input_data.data_input_field_id JOIN data_input ON data_input_fields.data_input_id = data_input.id
-> SET data_input_data.value = '3306', data_input_data.t_value = 'on' WHERE data_input.name LIKE 'Percona %' AND data_input_fields.name = 'Port';
筆者がテスト用に作成した環境では、このクエリーでPMP for CactiのMySQLテンプレートを一括で設定できましたが、その他の環境で正しく動作するかどうかは保証できません。設定を変更する場合には十分注意してください。
監視対象ホストの登録
PMP for Cactiの準備が整ったところで、監視される側のMySQLに必要な設定を行います。具体的にはCactiのサーバーからログインできるユーザーです。今回筆者が用意したCactiサーバーのIPアドレスは"172.17.1.145" 、監視対象のMySQLは"172.17.1.144"です。監視対象のMySQLにログインし、以下のように"172.17.1.145"からアクセス可能な"pmp"ユーザーを作成しました("pmp"ユーザーと"pmp_pass"というパスワードは前段落で設定した値)。
mysql> CREATE USER pmp@172.17.1.145 IDENTIFIED BY 'pmp_pass';
Query OK, 0 rows affected (0.00 sec)
CREATE USER
のみで権限を何も割り当てていませんが、まずはこの状態でホストを登録してみます。左メニューの"Devices"を選択し、右画面右上の"Add"からデバイスの追加メニューを表示させて図4に示すように入力してみます。"Host Template" = "Percona MySQL Server HT"が今回追加したホストテンプレートで、PMP for CactiのMySQL用のグラフが一式紐付けられています。
"Create"を選択後"Create Graphs for this Host"のリンクを辿ると、ホストテンプレートに予め割り当てられたグラフテンプレートの一覧が表示されます。ひとまず全てのグラフを選択して"Create"に進みます(図5)。
遷移した画面(図6)では"Port"を入力するように表示されました。これは、前段落で"Use Per-Data Source Value (Ignore this Value)"にチェックを入れた項目だけが表示されます(クエリー上ではdata_input_data.t_value = 'on'
がこれに相当)。"User"、"Password"にもチェックを入れていれば、この段階で設定することになります。あるいはポートを可変にせずチェックを入れなかった場合、この画面は表示されません。
ポート番号を入力して画面右下の"Create"を選択すると、今度こそグラフ描画用のデータ収集が始まります。データが揃うまでグラフは描画されないので、しばらく待っている間に監視ユーザー(今回の例では"pmp"ユーザー)に必要な権限について説明しておきましょう。
監視ユーザーに必要な権限
前項で"pmp"ユーザーを作成した際は権限を何も割り当てませんでしたが、PMP for Cactiで取得できるグラフは種類が多く、ある程度グラフごとに必要な権限が分かれています。必要な権限の詳細なリストはPercona MySQL Monitoring Template PMP for Cactiに記載がありますが、ざっくり説明すると、グラフごとに以下のような権限が必要になります。
- ステータス関連(コマンドの実行回数やテンポラリーテーブル作成回数など) ⇒特別な権限は不要
- スレーブ関連(スレーブの遅延、リレーログのサイズなど)⇒
REPLICATION CLIENT
権限 - マスターのバイナリーログのサイズ⇒
SUPER
権限 - プロセスリスト関連⇒
PROCESSLIST
権限 - InnoDB内部のステータス関連⇒
PROCESSLIST
権限
スレーブ関連とプロセスリスト関連は有用な情報になるため、REPLICATION CLIENT
とPROCESSLIST
は付けておいた方が良いでしょう。バイナリーログのサイズはSUPERを付与してまで見たい情報かどうかを問われると筆者としては否です(実際にグラフを確認し、バイナリーログのサイズがSUPERを付与してまでグラフ化するべきか判断する)。InnoDB内部のステータス関連を描画するのにPROCESSLIST
権限が必要なのは少し不思議に感じるかも知れませんが、これはPMP for Cactiが内部的にSHOW ENGINE INNODB STATUS
ステートメントを利用してInnoDBの内部ステータスを取得しているためです(ステートメントが「処理中のトランザクション」を表示するためPROCESSLIST
権限が必要と内部的に制御されている)。このあたりを鑑みた上で"pmp"ユーザーに権限を追加してください。
グラフの読み取り方のポイント
個々のグラフの読み取り方は本連載のスコープから外れる(と思っている)ので説明しませんが、基本的には同じ名前のステータス変数がある(SHOW GLOBAL STATUS
ステートメントで出力される内容と似通っている)か、SHOW ENGINE INNODB STATUS
で出力される項目に似通っているため、それ程迷うことはないでしょう。
ここで、PMP for Cactiを上手く運用していくコツを紹介しておきます。
絶対値に惑わされない
グラフの縦軸には目盛りが振ってありますが、ほとんどの場合この数字を気にする必要はありません。2000 QPS(Query Per Sec)が「ギリギリの値」か「まだ十分余裕のある値」かどうかは、ハードウェアの性能にもよりますし、SELECTステートメントの内容にもよります。重要なのは、その2000 QPSが「通常時の値」なのか「サービスのボトムライン」なのか「バーストトラフィック時の値」なのか、また2000 QPSをさばいている状態で「レスポンスタイムは良好」か「スローダウンが始まっている」かなど、周囲の状況と照らし合わせてデータベースの状況を把握することです。なお、Cactiのポーリング間隔は最小でも1分で、グラフ上は毎秒の値が出るので、ごく小さい値しか返さないステータス変数は1未満の値が表示されることがあります。
問題が起きていなくてもたまには見る
MySQLが平和に動いている時はあまり気にならないものですが、たまには何も考えずにグラフ画面を開くのも良いものです。「相変わらずこのMySQLは間っ平だな」「こっちは相変わらず忙しそう……おや、昨日の16時からHandler Read Rnd Next
が跳ね上がっているぞ? 誰だこのリリースしたのは。インデックス使えてないじゃん。平和なうちに足しておこう」なんてことがあるかも知れません(フィクション)。何となく平常の動き(何時から何時くらいにかけてトラフィックが増えて、何時くらいにバッチが走って……バッチの時のINSERTのピークは200 QPSくらいかなぁ…とか)を見ておくだけでも、有事の時の判断材料になることがあります。
たまには長い期間で見る
データは日々増え続け、クエリーも日々増えたり変わったりします。1日に0.5%ずつスキャンする行数が増えていても24時間スパンのグラフでは気が付かなかったりしますが、3か月スパンで見れば気付く確率は高くなるでしょう(90日同じペースで増え続けると1.5倍以上になる)。「おや、このMySQLは毎月月初にBytes sent
ががくんと減って月末に向けてだんだん増えていくな。……これって、まさか結果セット全部転送か!?」(しつこいがフィクション)。
時間をかけ過ぎない
PMP for Cactiは色々な情報を収集してくれますが、それでも情報の粒度が荒すぎることも多々あります。Cactiは1分に1回しかポーリングしてくれないため、それよりも小さい粒度の情報が欲しい時にCactiのグラフを眺め続けても良いことはありませんし、何かの兆候を如実に表すステータス変数があったとしてもそれがPMP for Cactiによって収集されているとは限りません(あるいは、グラフ化される際に丸められている可能性もある)。筆者はPMP for Cactiの一番のメリットは「あまり手間をかけずにそれなりの情報が見やすく得られること」だと考えています。手間をかけても良い(あるいは、手間をかけてでも調べなければならない)のであれば、PMPにこだわる必要はありません。
まとめ
PMP for Cactiは既にCactiを運用している人にとっては導入しやすく、「手軽にそれなりの情報が得られるツール」となりえます。しかし万能ではありませんので、Cacti以外の何かを運用している場合には無理に導入するようなものではありません。自身に合ったツールを見つけてください。また、グラフを確認する時は、縦軸の絶対値よりも相対的な変化に目を配った方が良いでしょう。グラフ期間を長くすることで、短いスパンのグラフでは見えてこなかった大きな動きが見えることもあります。