RDS for PostgreSQLを監視するコツ

この記事はPostgreSQL Advent Calendar 2014の12/15のエントリです。
今日15日目は、PostgreSQLといっても特にRDS for PostgreSQLをターゲットに、運用では欠かせない”監視”に焦点を当ててみます。

通常のサーバーで動作するPostgreSQLでは、サーバーのOSレベルの死活・パフォーマンスの監視に加え、RDBMSサービスとしての正常性の監視をするのが一般的かと思われます。
一方、RDS for PostgreSQLではサーバーのOSレベルのアクセスは制限されているため、RDSならではのちょっとしたコツが必要になります。
今回は、RDS for PostgreSQLならではの監視について考えていきます。


RDS for PostgreSQLの監視

RDS for PostgreSQLの監視では、次の2層の監視がポイントです。

  • DBインスタンスレイヤーの監視
  • DBエンジン・データベースレイヤーの監視

それぞれ考えてみましょう。

DBインスタンスレイヤーの監視

DBインスタンスレイヤーの監視では、次の4つのポイントがあります。

  • DBインスタンスの状態
  • DBインスタンスのイベント
  • DBインスタンスのパフォーマンス
  • DBインスタンスに関連するAPI call

DBインスタンスの状態

DBインスタンスの現在の状態は、DescribeDBInstances APIでDBInstanceStatusとして取得できます。
AWS CLIでdescribe-db-instancesコマンド経由でAPIを発行するとこんな感じになります。

$ aws rds describe-db-instances | grep DBInstanceStatus
            "DBInstanceStatus": "available",

DBInstanceStatusの一覧はこちらのページにあります。
Statusの名前だけ列挙するとこんな感じです。

  • available
  • backing-up
  • creating
  • deleting
  • failed
  • incompatible-network
  • incompatible-option-group
  • incompatible-parameters
  • incompatible-restore
  • modifying
  • rebooting
  • renaming
  • resetting-master-credentials
  • storage-full

このように、14種類の状態が定義されています。
手っ取り早く、availableであるかどうかを見るのもよいかもしれません。

DBインスタンスのイベント

次に、DBインスタンス上で発生したフェイルオーバーやバックアップなどのイベントを監視する方法を考えます。
これらは、RDSではEventという項目で記録されていきます。
Amazon RDS のイベントの表示 – Amazon Relational Database Service ユーザーガイド

RDSでは、イベントが発生した際にSNSで通知を発行することができます。
これを監視することでイベントの発生を把握することができます。
本エントリでは詳細は省きますが、詳細はこちら。
Amazon RDS イベント通知の使用 – Amazon Relational Database Service ユーザーガイド

DBインスタンスのパフォーマンス

DBインスタンスのパフォーマンスはCloudWatchで監視できます。
DB インスタンスのメトリックスの表示 – Amazon Relational Database Service ユーザーガイド

現在RDSで提供されているCloudWatch Metricsはこちら
項目だけ抜粋すると下記があります。

  • CPUUtilization
  • DatabaseConnections
  • DiskQueueDepth
  • FreeStorageSpace
  • FreeableMemory
  • NetworkReceiveThroughput
  • NetworkTransmitThroughput
  • ReadIOPS
  • ReadLatency
  • ReadThroughput
  • SwapUsage
  • WriteIOPS
  • WriteLatency
  • WriteThroughput

DBインスタンスに関連するAPI call

RDSはCloudTrailをサポートしているので、RDSに関するAPI callはCloudTrailで記録されます。
そこで、CloudTrailに記録された、DBインスタンスに関連するAPI callを監視することで、意図せぬ操作等を監視することができます。

監視方法としておすすめなのは、CloudWatch Logsですね。
CloudTrailはCloudWatch Logsに連携しているので、こちらを利用することで手間なく監視が可能です。
詳細はこちら
【AWS発表】CloudTrail と CloudWatch Logs が連携。2つのパートナーソリューションの紹介 – Amazon Web Services ブログ


DBエンジン・データベースレイヤーの監視

DBエンジン・データベースレイヤーの監視では、次の3つのポイントがあります。

  • DBエンジン・データベースの状態
  • DBエンジン・データベースのパフォーマンス
  • DBエンジン・データベースのログ

DBエンジン・データベースの状態

DBエンジン・データベースの現在の死活状況を確認するのに最も手っ取り早く確実な手段は、実際にそのプロトコルで接続しSQLを実行して結果が問題ないか確認する方法です。

DBエンジン・データベースのパフォーマンス

DBインスタンスのパフォーマンスで省略されているような、個別のDBエンジン固有の値等についても、要件やユースケースに応じて監視を検討する必要があるでしょう。

DBエンジン・データベースのログ

DBエンジン・データベースのログは、トラブルシューティングのために重要です。
RDS for PostgreSQLでは、error/postgresql.log.YYYY-MM-DD-nn が該当します。


RDS for PostgreSQLを簡単に監視するためのスクリプト”aws-mon-pgsql”

これまで挙げてきた項目のうち下記の項目の監視について、CloudWatch カスタムメトリクスを使って監視するためのスクリプト”aws-mon-pgsql“を作ってみました。

  • DBインスタンスレイヤーの監視
    • DBインスタンスの状態
  • DBエンジン・データベースレイヤーの監視
    • DBエンジン・データベースの状態
    • DBエンジン・データベースのパフォーマンス

スクリプト自体は今年の4月に作ったものを改善する形で今回のエントリ用に準備しました。
詳細はGitHubのREADME.mdに書きましたが、このエントリでも簡単に説明していきます。

セットアップ

まずは、aws-mon-pgsql.shをダウンロードします。

git clone https://github.com/moomindani/aws-mon-pgsql.git
cd aws-mon-pgsql

ちなみに、今回はgit cloneしていますが、ただダウンロードするだけでもオッケーです。

次に、PostgreSQLにパスワードなしで接続できるように、.pgpassを用意します。

echo "postgres.xxx.ap-northeast-1.rds.amazonaws.com:5432:postgres:postgres:password" > ~/.pgpass
chmod 600 ~/.pgpass

あとはスクリプトを実行するだけです。

DBインスタンスのDBInstanceStatusがavailableかどうか監視する

DBInstanceStatusがavailableかどうかチェックするには、–statusオプションを指定します。

$  ~/aws-mon-pgsql/aws-mon-pgsql.sh --id postgresql -h postgresql.ca6md0qizbcz.ap-northeast-1.rds.amazonaws.com -p 5432 -U test -d test --status --verbose
status:0

“available”の場合、結果が”0″となります。

DBエンジン・データベースがクエリ実行可能な状態か監視する

DBエンジン・データベースがクエリ実行可能な状態かチェックするには、–query-executionオプションを指定します。

$  ~/aws-mon-pgsql/aws-mon-pgsql.sh --id postgresql -h postgresql.ca6md0qizbcz.ap-northeast-1.rds.amazonaws.com -p 5432 -U test -d test --query-execution --verbose
query_execution:0

SQL”SELECT 1 for UPDATE”の結果が正常に得られた場合、結果が”0″となります。

DBエンジン・データベースのキャッシュヒット率を監視する

DBエンジン・データベースのキャッシュヒット率をチェックするには、–cache-hiitオプションを指定します。

$  ~/aws-mon-pgsql/aws-mon-pgsql.sh --id postgresql -h postgresql.ca6md0qizbcz.ap-northeast-1.rds.amazonaws.com -p 5432 -U test -d test --cache-hit --verbose
cache_hit:99.000

cronで全項目を定期的に監視する

crontabを設定します。

crontab -e

全項目をチェックするには、–all-itemsオプションを指定します。

*/5 * * * *  ~/aws-mon-pgsql/aws-mon-pgsql.sh --id postgresql -h postgresql.ca6md0qizbcz.ap-northeast-1.rds.amazonaws.com -p 5432 -U test -d test --all-items --from-cron

これで、5分ごとに全項目を監視し、結果をCloudWatch カスタムメトリクスとしてアップロードするようになります。
(利用料金にはご注意を!)

関連エントリ: Amazon RDS for PostgreSQLのキャッシュヒット率, セッション数等をCloudWatchで監視するスクリプトを作ってみた

  1. トラックバックはまだありません。

コメントを残す