CactiでAmazon RDS for MySQLの性能監視

AWSでRDS for MySQLの性能を監視する場合、

  • CPU使用率やメモリ、ディスク使用率の監視はCloudWatch
  • MySQLシステム情報の監視は、New Relic MySQL Plugin

を使用していました。
ですが、どちらも監視データの保存期間が限られていて、CloudWatchは直近2週間分、New Relicは無償のAWSパートナープランを利用しても直近3日間分しか監視データを参照できません。

今回は、監視ツールCactiのプラグインを使用して長期的に監視データを保存し、過去の任意の時点の監視データを参照できるようにします。

プラグインは、
CloudWatchのデータを収集する Percona Amazon RDS Monitoring Template for Cacti
と、
MySQLシステム情報を収集する Percona MySQL Monitoring Template for Cacti
を使用します。

Zabbixにも同じようなプラグインがあるのですが、個人的にZabbixになじみがないことと、Percona MySQL Monitoring Template for Cactiの監視項目が強力なので、今回はCactiを使用してみました。

以下、コマンドはrootユーザーもしくはsudo権限のあるユーザーで実行します。

isdサーバー構成

EC2サーバー(Amazon Linux 2016.03)にCactiをインストールし、RDS for MySQL(5.6)のDBインスタンスを監視します。
また、RDSにはCacti監視アプリケーションのデータも保存します。

セキュリティグループの設定で、EC2のMySQLクライアントからRDSにアクセスできるようにしておきます。
また、Cacti Webページにアクセスできるよう、EC2インスタンスに外部からHTTPアクセスできるようにしておきます。

isdCactiの設定

Cactiそのものの設定やCacti Webページについては、以下の記事がとても参考になります。

・Cactiのインストールと設定方法
http://changineer.info/server/monitoring/monitoring_cacti.html

Cactiのインストール

Apache, PHP, MySQLクライアント, net-snmp-utils もあわせてインストールします。
なお、EC2サーバー自身の詳細な監視が不要であれば、SNMPは使用しませんので、net-snmp-utilsのインストールも不要です。

 # yum install httpd php mysql56 cacti net-snmp-utils

Cacti用データベース、ユーザーの作成

  • DBホスト名: <RDS Endpoint>
  • Cacti用DB名: cacti
  • Cacti用DBユーザー: cactiuser
  • Cacti用DBパスワード: <cactiuserのDBパスワード>

とします。

EC2からRDS fro MySQLに管理ユーザーでログインし、データベース、ユーザーを作成します。
cactiuserのアクセス元ホストは、特定のIPアドレス、サブネット、VPCアドレス範囲に限定してもよいでしょう。

 # mysql -h <RDS Endpoint> -u <RDS管理ユーザー名> -p

 mysql> CREATE DATABASE cacti;

 mysql> GRANT ALL PRIVILEGES ON cacti.* TO cactiuser@`%`
         IDENTIFIED BY '<cactiuserのDBパスワード>';

 mysql> SELECT user,password, host FROM mysql.user;

+---------------------+-------------------------------+------------+
| user                | password                      | host       |
+---------------------+-------------------------------+------------+
| rdsadmin            | xxxxxxxxxxxxxxxxxxxxxxxxxxxxx | localhost  |
| <RDS管理ユーザー名> | xxxxxxxxxxxxxxxxxxxxxxxxxxxxx | %          |
| cactiuser           | xxxxxxxxxxxxxxxxxxxxxxxxxxxxx | %          |
+-----------------------------------------------------+------------+
3 rows in set (0.01 sec)

CactiのDB接続設定

DBホスト名、DBユーザー、DBパスワードを指定します。
また、Cacti WebページのURLパスを ‘/cacti’ から変更する場合は、$url_path を修正します。

 # vi /etc/cacti/db.php

--
$database_type = "mysql";
$database_default = "cacti";
$database_hostname = "<RDS Endpoint>";
$database_username = "cactiuser";
$database_password = "<cactiuserのDBパスワード>";
$database_port = "3306";
$database_ssl = false;

$url_path = "/cacti/";
--

ApacheのCacti Webページアクセス設定

URLパスやアクセス制限を設定します。
以下は、Apache 2.2でBASIC認証とした場合の設定です。

 # vi /etc/httpd/conf.d/cacti.conf

--
Alias /cacti    /usr/share/cacti

<Directory /usr/share/cacti/>
    <IfModule mod_authz_core.c>
        # httpd 2.4
        Require host localhost
    </IfModule>
    <IfModule !mod_authz_core.c>
        # httpd 2.2
        #Order deny,allow
        #Deny from all
        #Allow from localhost
        AuthType Basic
        AuthUserFile /etc/httpd/conf/.htpasswd_cacti
        AuthName "cacti user"
        require valid-user
    </IfModule>
</Directory>
--

 

BASIC認証のユーザーエントリーを作成しパスワードを設定します。

 # htpasswd -c -m /etc/httpd/conf/.htpasswd_cacti cacti
New password: <パスワードを指定>
Re-type new password: <パスワードを指定>

 

Apacheの起動

 # /etc/init.d/httpd configtest
 # /etc/init.d/httpd start

 

Cacti初期データの投入

RDS for MySQLは、ストレージエンジンInnoDBの使用を推奨しているので、初期データのストレージエンジンをMyISAMからInnoDBに変更します。

 # sed -i.bak -e 's/MyISAM/InnoDB/' /usr/share/doc/cacti-0.8.8g/cacti.sql

 # view /usr/share/doc/cacti-0.8.8g/cacti.sql

--
CREATE TABLE cdef (
  id mediumint(8) unsigned NOT NULL auto_increment,
  hash varchar(32) NOT NULL default '',
  name varchar(255) NOT NULL default '',
  PRIMARY KEY  (id)
) ENGINE=InnoDB;

...
--

 

データベースに初期データを投入します。

 # mysql -h <RDS Endpoint> cacti \
    -u cactiuser -p < /usr/share/doc/cacti-0.8.8g/cacti.sql

 

Cactiの初期設定

WebブラウザでCacti Webページにアクセスします。
http://<EC2のホスト名またはIPアドレス>/cacti/

 Next
 New Install
 Finish

と進み、ログイン画面で初期ユーザー、初期パスワード admin,admin でログインします。
初回ログイン時はパスワードの変更が求められるので変更します。

データ保存期間の変更

デフォルトでは「Daily」のデータ保存期間が50時間など短いので、増やします。

(参考)CentOS7 Cactiのデータ取得間隔と保存期間
http://www.unix-power.net/centos7/cacti_rows.html

Cacti Webページにログインし、

  Console > Management > Data Sources > RRAs

に進みます。

例えば、Rows を以下のとおり変更します。

項目 参照単位 Rows 保存期間 計算式
Daily  5 Minute Average  315360  3年 5分 x 315360 = 1576800分 = 3年
Weekly  30 Minute Average  78840  4.5年 30分 x 78840 = 2365200分 = 4.5年
Monthly  2 Hour Average  29565  6.75年 2時間 x 29565 = 59130時間 = 6.75年
Yearly  1 Day Average  3695  10.125年 1日 x 3695 = 3695日 = 10.125年

 
 
 
 
 
 

※監視結果データはEC2インスタンスの/usr/share/cacti/rra/ に保存されます。すでに作成済みのRRDファイルは上記のように保存期間を変更しても反映されないため、別途rrdtoolコマンドでRRDファイルを修正する必要があります。このため、監視対象を追加する前に保存期間を延ばしておくとよいでしょう。

Cacti監視を開始

Cactiのcronエントリーのコメントアウトを外し、監視を開始します。

 # vi /etc/cron.d/cacti

--
*/5 * * * *    cacti   /usr/bin/php /usr/share/cacti/poller.php > /dev/null 2>&1
--

これで、5分に一度監視データの取得を実行します。

グラフ表示の確認

WebブラウザでCacti Webページを表示します。
http://<EC2のホスト名またはIPアドレス>/cacti/

graphs で、サーバーのCPU Load Average等がグラフ表示されることを確認します。


 

isdPercona Amazon RDS Monitoring Template for Cactiの設定

・Percona Amazon RDS Monitoring Template for Cacti
https://www.percona.com/doc/percona-monitoring-plugins/1.1/cacti/rds-templates.html

Percona Amazon RDS Monitoring Template for Cactiは、CloudWatchによるRDSインスタンスの監視情報を収集するプラグインです。
CloudWatchの情報は、AWS SDKを使用して取得します。

※DBサーバーへのMySQL接続は行いません。

AWSアクセスキー情報の取得

AWS IAMで、CloudWatch, RDSのリソース情報へのアクセス権限を持つユーザーを作成し、アクセスキー情報を取得します。

AWS Management Consoleにログインし、サービス: IAM を開きます。

・グループの作成。
左メニューで「グループ」を選択。
「新しいグループの作成」ボタンをクリック。

 グループ名: cacti-monitoring

とします。

「ポリシーのアタッチ」で、CloudWatch, RDSリソースの参照権限「CloudWatchReadOnlyAccess」と「AmazonRDSReadOnlyAccess」を選択してグループを作成します。

※「AmazonRDSReadOnlyAccess」ポリシーは、CloudWatchから取得する空きメモリ容量、空きディスク容量だけではなく、メモリ、ディスクの全容量と使用量をRDSインスタンスの情報として取得するために必要となります。

・ユーザーの作成
左メニューで「ユーザー」を選択。
「新しいユーザーの作成」ボタンをクリック。

 ユーザー名: cacti-monitoring

としてユーザーを作成し、認証情報CSVファイルをダウンロードします。

・ユーザーをグループに追加
左メニューで「ユーザー」を選択。

ユーザー cacti-monitoring を選択し、「ユーザー操作」から「グループにユーザーを追加」を選択して、cacti-monitoring グループに追加する。

botoのインストール

Percona Amazon RDS Monitoring Template for CactiプラグインはPython製なので、AWS SDK for Python(boto)をインストールします。

まず、デフォルトのpythonのバージョンを確認します。

 # python --version

--
Python 2.7.9
--

 

python2.7のpython-botoをインストールします。

 # yum install python27-boto

 

botoのConfigにアクセスキー情報を追記します。
ここでは、プロファイル名を cacti-monitoring とします。
アクセスキーID、シークレットアクセスキーは、先ほど取得したAWS IAMユーザー cacti-monitoring の認証情報CSVファイルに記載されている文字列を指定します。

 # vi /etc/boto.cfg

--
[profile cacti-monitoring]
aws_access_key_id = <アクセスキーID>
aws_secret_access_key = <シークレットアクセスキー>
--

※Perconaの公式ページに記載があるような、defaultプロファイルの設定ではなぜかうまくいきませんでした。

Python製スクリプトはcactiユーザー権限で実行するので、cactiユーザーのみ参照できるようにします。

 # chown cacti /etc/boto.cfg
 # chmod 600 /etc/boto.cfg

 

Percona Amazon RDS Monitoring Template for Cactiのインストール

プラグインは、Perconaのダウンロードページで公開されています。

・Download Percona Monitoring Plugins
https://www.percona.com/downloads/percona-monitoring-plugins/LATEST/

Cactiプラグイン、テンプレートのRPM(percona-cacti-templates-1.1.6-1.noarch.rpm)が用意されているので、ダウンロード、インストールします。

 # cd /usr/local/src/
 # wget https://www.percona.com/downloads/percona-monitoring-plugins/1.1.6/percona-cacti-templates-1.1.6-1.noarch.rpm

 # yum localinstall percona-cacti-templates-1.1.6-1.noarch.rpm

 # rpm -ql percona-cacti-templates.noarch

これで、スクリプトが /usr/share/cacti/scripts、テンプレートが /usr/share/cacti/resource/percona/templates にそれぞれインストールされます。

Cactiにテンプレートをインポート

CactiのカスタムテンプレートはWebインターフェースでインポートする必要があるため、/usr/share/cacti/resource/percona/templates の xmlファイルを、ブラウザアクセスするPCローカルにダウンロードします。

WebブラウザでCacti Webページにアクセスします。
http://<EC2のホスト名またはIPアドレス>/cacti/

ログイン後、

  Console > Import Templates > Import Template from Local File

の「ファイルを選択」で、PCローカル上の
cacti_host_template_percona_rds_server_ht_0.8.6i-sver1.1.6.xml
をインポートします。

インポート完了時に、Import Results で各項目の [success] が表示されればOKです。

※テンプレートのインポートは、import_template.phpというユーティリティを使用してコマンドラインでも実行できるそうです。

・Percona Pluginのテンプレートインポート
http://changineer.info/server/monitoring/monitoring_cacti.html#Percona_Plugin-3

Cactiに監視エントリーを追加

WebブラウザでCacti Webページにアクセスします。
http://<EC2のホスト名またはIPアドレス>/cacti/

ホストエントリーを追加します。

  Console > Create > New Graphs > Create New Host

以下を指定して「Create」します。

    Description: RDS Monitoring ※Cacti上のホスト名表示
    Hostname:
   Host Template: Percona Amazon RDS Server HT

   Availability/Reachability Options:
    Downed Device Detection: None  ※Pingで死活確認できないため。

   SNMP Options:
    SNMP Version: Not In Use    ※SNMPは使用しないため。

Hostnameは、RDS Endpointではなく、RDSのDB Identifierを指定することがポイントです。
※AWS SDKの引数がDB Identifierであるため。


 

続いて、グラフを作成します。
上部の「Create Graphs for this Host」リンクをクリックし、Graph Templateをすべてを選択して「Create」します。

Create Graphs from Data Query の画面で、各グラフ項目の Region と Profile を指定して、「Create」します。
Profileのところでは、/etc/boto.cfg で指定したプロファイル名を入力するのがポイントです。

 Region: ap-northeast-1
 Profile: cacti-monitoring


 

ホストをツリーに追加

グラフツリーにホストを追加します。

WebブラウザでCacti Webページにアクセスします。
http://<EC2のホスト名またはIPアドレス>/cacti/

Console > Management > Devices
で、先ほど作成したホスト「RDS Monitoring」を選択して、「Choose an action」から「Place on a tree (default)」を選択して「Go」。


 

※Cactiのバージョンが古いとき、ここで、「Validation error.」となりツリーへの追加に失敗することがあります。その場合は、Cactiのスクリプトを修正します。

 # vi /usr/share/cacti/host.php

--
function form_actions() {
    global $colors, $device_actions, $fields_host_edit;

    /* ================= input validation ================= */
    //input_validate_input_number(get_request_var_post('drp_action'));
    input_validate_input_regex(get_request_var_post('drp_action'), "^([a-zA-Z0-9_]+)$"); // 179行目をこのように修正
    /* ==================================================== */
--

 

グラフ表示の確認

監視データの取得が5分に一度なので、プラグインの設定後、15分ぐらい経ってからグラフ表示を確認します。

WebブラウザでCacti Webページにアクセスします。
http://<EC2のホスト名またはIPアドレス>/cacti/

graphs > Tree Mode で、Host: RDS Monitoring を選択してグラフを表示します。


 

念のため、CloudWatch(RDSのモニタリング表示)と同じような値となっていることを確認しましょう。

うまく表示されない場合は、Cactiのログを確認します。
例えば、以下のケースでは、RDS DBインスタンスの情報が正しく取得できていません。

 # less /var/log/cacti/cacti.log

-- 
04/16/2016 05:30:04 PM - CMDPHP: Poller[0] Host[5] DS[48] WARNING: Result from CMD not valid.  Partial Result: No DB instance "isdt
04/16/2016 05:30:04 PM - CMDPHP: Poller[0] Host[5] DS[50] WARNING: Result from CMD not valid.  Partial Result: No DB instance "isdt
--

CloudWatchの情報を収集するCactiプラグインスクリプトをデバッグオプションつきで直接実行してみると、その出力結果からヒントが得られるでしょう。

 # sudo -u cacti /usr/share/cacti/scripts/ss_get_rds_stats.py \
    --ident=isdtest --region=ap-northeast-1 \
    --profile=cacti-monitoring \
    --metric=FreeableMemory --debug

たいていは、AWSリソースのアクセス権設定まわりの問題(プロファイル名やIAMユーザーの設定)だと思います。

※EC2のタイムゾーンがJSTで、RDSインスタンスのタイムゾーンがUTCの場合、9時間遅れでグラフ表示されます。例えば、9時のデータは、同日18時のところに表示されます。DBパラメーターグループで、init_connect でSET SESSIONコマンドを設定するか、タイムゾーンをJSTとすれば、正しい時刻に表示されます。

(参考)
・RDS(MySQL)でJSTを使う たった1つの冴えたやり方
https://qiita.com/j3tm0t0/items/089ef96ba131df079ca4

isdPercona MySQL Monitoring Template for Cactiの設定

・Percona MySQL Monitoring Template for Cacti
https://www.percona.com/doc/percona-monitoring-plugins/1.0/cacti/mysql-templates.html

Percona MySQL Monitoring Template for Cactiは、MySQLシステム情報を収集するプラグインです。
DBサーバーにMySQL接続して、SHOW STATUS, SHOW INNODB STATUS などを実行し、値を取得します。

Cacti用DBユーザーに権限を追加

先ほどRDS fro MySQLに作成したDBユーザーcactiuserに、SHOW STATUS, SHOW INNODB STATUS などのコマンドを実行するためのPROCESS権限を追加します。。

 # mysql -h <RDS Endpoint> -u <RDS管理ユーザー名> -p

 mysql> GRANT PROCESS ON *.* TO cactiuser@`%`;

※Perconaの公式ページには、「SUPER, PROCESS権限が必要」と記載されていますが、MySQL 5.1.24以上のバージョンでは、PROCESS権限で’SHOW INNODB STATUS’コマンドの実行が可能となったため、SUPER権限は不要です。

Cactiプラグインスクリプトで、情報収集用のDBユーザー、パスワードを指定

 # vi /usr/share/cacti/scripts/ss_get_mysql_stats.php

--
$mysql_user = 'cactiuser';
$mysql_pass = '<cactiuserのDBパスワード>';
--

※DBホスト名の指定はCacti Webページで行います。

Cactiにテンプレートをインポート

Percona Amazon RDS Monitoring Template for Cactiプラグインと同様、プラグインのCacti用テンプレートをPCからアップロードします。

WebブラウザでCacti Webページにアクセスします。
http://<EC2のホスト名またはIPアドレス>/cacti/

ログイン後、

  Console > Import Templates > Import Template from Local File

の「ファイルを選択」で、PCローカル上の
cacti_host_template_percona_mysql_server_ht_0.8.6i-sver1.1.6.xml
をインポートします。

Cactiに監視エントリーを追加

WebブラウザでCacti Webページにアクセスします。
http://<EC2のホスト名またはIPアドレス>/cacti/

ホストエントリーを追加します。

  Console > Create > New Graphs > Create New Host

以下を指定して「Create」します。

    Description: MySQL Monitoring ※Cacti上のホスト名表示
    Hostname:
   Host Template: Percona Amazon RDS Server HT

   Availability/Reachability Options:
    Downed Device Detection: None  ※Pingで死活確認できないため。

   SNMP Options:
    SNMP Version: Not In Use    ※SNMPは使用しないため。

Hostnameは、RDS Endpointを指定することがポイントです。


 

続いて、グラフを作成します。
上部の「Create Graphs for this Host」リンクをクリックし、Graph Templateをすべてを選択して「Create」します。

ホストをツリーに追加

グラフツリーにホストを追加します。

WebブラウザでCacti Webページにアクセスします。
http://<EC2のホスト名またはIPアドレス>/cacti/

Console > Management > Devices
で、先ほど作成したホスト「MySQL Monitoring」を選択して、「Choose an action」から「Place on a tree (default)」を選択して「Go」。

グラフ表示の確認

監視データの取得が5分に一度なので、プラグインの設定後、15分ぐらい経ってからグラフ表示を確認します。

WebブラウザでCacti Webページにアクセスします。
http://<EC2のホスト名またはIPアドレス>/cacti/

graphs > Tree Mode で、Host: RDS Monitoring を選択してグラフを表示します。


 

うまく表示されない場合は、Cactiのログを確認します。

 # less /var/log/cacti/cacti.log

MySQLシステム情報を収集するCactiプラグインスクリプトを直接実行してみると、その出力結果からヒントが得られるでしょう。

 # php /usr/share/cacti/scripts/ss_get_mysql_stats.php \
    --host <RDS Endpoint> \
    --user cactiuser --pass <cactiuserのDBパスワード> --port 3306 \
    --items current_transactions

グラフの見方

Percona MySQL Monitoring Template for Cactiのグラフの意味や見方、この結果を利用したチューニングについては、Infinite Loop技術ブログの以下の記事がとても参考になります。

・これだけ見れば大丈夫!ーMySQLパフォーマンス監視のツボ(クエリ編)
http://www.infiniteloop.co.jp/blog/2012/03/mysql-tuning-cacti-query/

・これだけ見れば大丈夫!ーMySQLパフォーマンス監視のツボ(システム編)
https://www.infiniteloop.co.jp/blog/2013/08/mysql-tuning-cacti-system/

isdまとめ

AWS RDS for MySQLの性能監視データを長期的に保存するための、Cactiプラグインの設定手順をまとめました。
例えば、Webサービスを運用している場合、リソース使用状況などを長期的に観測し視覚化することで、アプリケーションバージョンアップリリースやユーザー増などの特定のタイミングでサーバー負荷が増えた、などの傾向を把握することができます。

なお、RDS for AuroraでこれらのCactiプラグインを試してみたところ、Percona Amazon RDS Monitoring Template for Cactiでは、スワップ使用量とディスク使用量が表示されません。
これは、Auroraではディスクサイズが自動拡張される仕様で、ディスクの全容量が取得できないからだと思われます。
Percona MySQL Monitoring Template for Cactiについては、詳しくは調べ切れてはいませんが、グラフ表示される項目と表示されない項目があります。
これは、Auroraでは ‘SHOW INNODB STATUS’ など、MySQLの状態取得コマンドのいくつかが実行できないからだと思われます。

 

Follow me!