PostgreSQL の性能監視 を行なう「pg_monz」

統合監視ソフトウェア Zabbix で PostgreSQL を監視しよう

pg_monz logo

本記事では、pg_monz のインストールと基本的な設定方法をご紹介します。

  1. はじめに
  2. 統合監視ソフトウェアとは
  3. Zabbix について
  4. pg_monz について
  5. インストール・設定方法
    1. pg_monz 入手ファイルの紹介
    2. 設定ファイル、スクリプトのインストール
    3. テンプレートのインポート
    4. テンプレートマクロの確認
    5. 監視対象ホストの設定
    6. 監視データの確認
    7. 監視項目の追加
  6. 最後に

(1) はじめに

本記事では、OSS 統合監視ソフトウェア Zabbix を利用した PostgreSQL の監視方法を紹介します。

(2) 統合監視ソフトウェアとは

システム監視は、ハードウェアの稼働監視、CPUなどのリソース監視や アプリケーション監視など多岐にわたります。 監視を自前スクリプトで作り込むのではなく、監視や監視データの保存、 障害が発生したときの通知設定を一元的に行ってシステム監視を自動化するソフトウェアを 統合監視ソフトウェアと呼びます。

統合監視ソフトウェアを用いると、内部状態が刻々と変化するデータベースの稼働状況と OS の状態を容易に蓄積できるので、障害発生時の通知だけでなく、 データベースが停止する前にデータベース状態を把握することで 対策を取ることもできるようになります。 また過去に取得したデータを元に問題発生後に原因を追究したり将来を予想するなどにも 役立てることができます。

オープンソースで利用できる統合監視ソフトウェアとして Zabbix、Hinemos、Nagios、Hobbit などがあります。
どのソフトウェアもメリット・デメリットがありますが、監視設定を行うためには、 経験やノウハウが必要となり、細かい監視を行うためにはコストがかかってしまいます。 しかし Zabbixは、他の統合監視ソフトウェアと比べると監視設定を 効率良く設定できる機能が備わっていることが特徴となります。

(3) Zabbixについて

Zabbix は Zabbix 社によって開発されている統合監視ソフトウェアで オープンソースとして公開されています。

Zabbix サーバは監視対象ホストやネットワーク機器に対して 定期的に監視を行って取得したデータを RDBMS に保存します。 収集したデータに閾値を設定し、閾値を超えたらユーザにメール通知を行ったり、 ブラウザを通して収集データをグラフ表示することもできます。

監視対象ホストにはZabbixエージェントを導入することで、 リソース監視やログ監視を容易に行うことができます。 また、独自のアプリケーションを監視するためにスクリプトによる監視も可能です。

図1 Zabbix システム概念図

また効率良く監視設定できるように次のような機能もあります。

  • 監視設定のテンプレート化

    監視設定をテンプレートとして定義し、同じ設定が必要なホストに監視設定を再利用できる機能。 テンプレートを xml ファイルでエクスポートしたりインポートも可能です。

  • 監視対象ホストの自動登録

    特定の IPアドレスレンジを定期的に探索して、新規に増設されたサーバ、 ネットワーク機器を自動登録、監視設定(テンプレートの自動適用)ができる機能 (ディスカバリ機能)。

  • サーバの固有情報の自動取得、設定

    サーバの内部情報(NIC の数やマウントポイント)を自動取得して、 サーバの固有情報に合わせた設定を行う機能(ローレベルディスカバリ機能)。

(4) pg_monz について

pg_monz logo

pg_monz は Zabbix 用の PostgreSQL 監視テンプレートとなります。 pg_monz では、Zabbix のローレベルディスバリの機能を用いることで、 システム毎に異なるデータベース名やテーブル名を取得し、 PostgreSQL の稼働統計情報に定期的にアクセスを行い情報を収集します。

pg_monz は GitHub にて ライセンス Apache License Version 2.0 で配布されており、非商用・商用を問わず利用できます。

pg_monz を利用するためには、次のソフトウェアが必要になります。

ソフトウェア名 バージョン
Zabbix 2.0 以上
PostgreSQL 9.2 以上

(注) PostgreSQL のバージョンは監視対象の PostgreSQL のバージョンを意味します。 Zabbix のデータベースとしての制限ではありません。

PostgreSQL の情報取得をするために、PostgreSQL を導入しているホスト上に Zabbix エージェントの導入が必要となります。

[代表的な監視項目]

  • PostgreSQL サーバーの死活監視

    PostgreSQL サーバーのプロセス稼働確認、PostgreSQL サーバーの SQL 応答確認

  • PostgreSQL のログ監視

    サーバーログで PANIC, FATAL, ERROR を含むメッセージ

  • データベースサイズの監視
  • バックエンドプロセスの監視

    バックエンドプロセス数(合計、SQL 処理中、idle、idle in transaction、lock 待ち)

  • DB内部状態の監視

    checkpoint_segments 超過・checlpoint_timeout 時間超過によるチェックポイント実行回数 対象データベースのキャッシュヒット率、COMMIT 回数/s、一時ファイルに書き込んだデータのバイト数、 一定時間経過したバックエンドプロセス数(処理中)

などなど

(5) インストール・設定方法

ここでは、Zabbix サーバのインストール、設定、および監視対象ホストに Zabbix エージェントが既にインストールされており、 監視対象の PostgreSQL が起動していることを前提とします。

Zabbix のインストール、セットアップについては次を参照ください。

Zabbix 社:Zabbix 2.0 のマニュアル(rpm からのインストール)
https://www.zabbix.com/documentation/jp/2.0/manual/installation/install_from_packages

SRA OSS, Inc. 日本支社: Zabbix 2.0 (ソースからのインストール、データベースは PostgreSQL を利用)
https://www.sraoss.co.jp/technology/zabbix/introduction/01-firststep.php

1. pg_monz 入手ファイルの紹介

GitHub から pg_monz 一式が入った pg_monz-1.0.zip がダウンロードできます。 展開すると次の 4 つのファイルが確認できます。ファイル名と役割は次の通りです。

find_dbname.sh
監視対象のホストに配置するスクリプト
監視対象の PostgreSQL に接続を行ってデータベース名をディスカバリするスクリプト
fine_dbname_table.sh
監視対象のホストに配置するスクリプト
監視対象の PostgreSQL に接続を行ってデータベース名と データベース内のテーブル名をディスバリするスクリプト
userparameter_pgsql.conf
監視対象のホストに配置する設定ファイル
監視対象の PostgreSQL に接続を行って具体的な監視項目が記載されているスクリプト
pg_monz_template.xml
ブラウザを利用して Zabbix の管理画面からインポートするテンプレート

2. 設定ファイル、スクリプトのインストール

ここでは監視を行いたい PostgreSQL が稼働しているホストに設定ファイルとスクリプトを配置します。

Zabbix エージェントが /usr/local/zabbix にインストールされている場合は、 以下の場所に userparameter_pgsql.conf ファイルをコピーします。

/usr/local/zabbix/etc/zabbix_agentd.conf.d/userparameter_pgsql.conf

上記ファイルが Zabbix エージェント起動時に読み込まれるように設定ファイル
/usr/local/zabbix/etc/zabbix_agentd.confにinclude設定を追記します。

Include=/usr/local/zabbix/etc/zabbix_agentd.conf.d/

次にディスカバリで使用するスクリプトをコピーし、実行権限を付加します。 Zabbix エージェントから実行されるので、Zabbix エージェントを起動させたユーザが スクリプトを実行できる権限が必要です。 デフォルトでは /usr/local/bin 以下にインストールされることを想定しています。

cp find_dbname.sh find_dbname_table.sh /usr/local/bin
chmod +x /usr/local/bin/find_dbname.sh
chmod +x /usr/local/bin/find_dbname_table.sh

3. テンプレートのインポート

最初に、ブラウザを開く端末にテンプレート (pg_monz_template.xml) をコピーします。

ブラウザより Zabbix の Web 管理画面にログインして、次の手順にてテンプレート (pg_monz_template.xml)をインポートします。

タブの「設定」 - 「テンプレート」を選択し、テンプレート一覧を表示します。(図2)

図2 テンプレート一覧

右上の「インポート」をクリックして表示される画面で、「インポートするファイル」に pg_monz_template.xml を選択して「インポート」をクリックします。(図3)

図3 インポート画面

インポートに成功すると、テンプレート一覧に「PostgreSQL Check」が追加されます。(図4)

図4 インポート後のテンプレート一覧

4. テンプレートマクロの確認

テンプレートを環境に合わせて変更できるように、マクロ変数が使われております。 以下の手順にてテンプレートに設定されているマクロ変数を確認することができます。

タブの「設定」 - 「テンプレート」を選択して表示された テンプレート一覧から 「PostgreSQL Check」をクリックし、「マクロ」タブを選択します。(図5)

図5 テンプレートマクロ変数一覧

変更できるマクロ変数と設定内容は次のとおりです。

マクロ名 設定内容
{$PGDATABASE} 監視データを取得するときに利用する接続データベース名を指定します。
{$PGHOST} Zabbix エージェントから接続する PostgreSQL ホストのホスト名またはIPアドレス (通常では監視対象の PostgreSQL には Zabbix エージェントがインストールされているので 127.0.0.1 を指定)
{$PGLOGDIR} PostgreSQL のログファイルが格納されているディレクトリ
{$PGPORT} 監視データを取得するときに利用される PostgreSQL ポート番号
{$PGROLE} 監視データを取得するときに利用される PostgreSQL 接続ユーザ名
{$PGSCRIPTDIR} find_dbname.sh と find_dbname_table.sh を配置したディレクトリ
{$PGCACHEHIT_THRESHOLD} 指定した数値以下にキャッシュヒット率が下がるとアクション(注)が実行されます。
{$PGCHECKPOINTS_THRESHOLD} 更新間隔(デフォルト5分)あたり指定した数値回数以上 checkpoint_segments 超過による チェックポイントが行われるとアクション(注)が実行されます。
{$PGCONNECTIONS_THRESHOLD} 指定本数以上の同時接続数があるとアクションが実行されます。
{$PGDBSIZE_THRESHOLD} データベース容量が指定したバイト数以上になるとアクションが実行されます。
{$PGDEADLOCK_THRESHOLD} デッドロック発生回数が閾値を超えるとアクションが実行されませす。
{$PGSLOWQUERY_THRESHOLD} 指定した秒以上遅いクエリが見つかった場合にアクションが実行されます。
{$PGTEMPBYTES_THRESHOLD} 指定したバイト数以上の一時ファイルが見つかった場合には、アクションが実行されます。

(注) Zabbix ではアクションの設置で障害時にメール送信を行ったり、 スクリプトの実行を定義することができます。

テンプレートのマクロ変数を環境に合わせて編集することもできますが、 テンプレートのマクロ変数をホスト環境に合わせると、他のホストでテンプレートの再利用ができなくなるので、 マクロ変数の調整は次の監視対象ホストの設定で行います。

5. 監視対象ホストの設定

ここでは PostgreSQL が起動しているホストを監視対象として新規に登録します。

タブの「設定」 - 「ホスト」を選択し、ホスト一覧を表示します。(図6)

図6 ホスト一覧

画面右上の「ホストの作成」をクリックすると「ホストの設定」画面が表示されます。(図7)

最初に監視対象のホスト名、グループ等を設定します。 下図ではホスト名として「PostgreSQL Server」、グループ名として「PostgreSQL Group」と設定しました。 エージェントのインターフェースには IPアドレスを環境に合わせて設定します。

図7 ホストの設定

引き続き「ホストの設定」画面にて「マクロ」タブをクリックします。 ここでは、このホストで有効なマクロ変数の定義ができます。 テンプレートの設定から確認できるマクロ変数とホストの設定から確認できるマクロ変数で 同名のマクロ変数がある場合には、ホストのマクロ変数の値が利用されるようになっております。(図8)

図8 ホストマクロ変数設定

環境に合わせて、通常修正する必要があるマクロ変数と設定値は次のとおりです。(図9)

図9 ホストマクロ変数設定例

ここで、PostgreSQL のログ出力場所を指定するマクロ変数 {$PGLOGDIR} を /usr/local/pgsql/log に設定しました。

PostgreSQL のログコレクタが有効な場合にはデフォルトでは データベースクラスタの直下の pg_log ディレクトリにログが出力されます。 データベースクラスタは PostgreSQL の管理ユーザしかアクセスできないため Zabbix エージェントの起動ユーザと PostgreSQL の管理ユーザが異なる場合には、 ログにアクセスできず監視ができなくなってしまいます。

そこで、PostgreSQL の設定ファイル (postgresql.conf) で次のようにログ出力の設定を行います。

logging_collector = on
log_directory = '/usr/local/pgsql/log'
log_file_mode = 0644

この設定により、ログコレクタを有効にして /usr/local/pgsql/log にログが出力されます。 また log_file_mode も 0644 のため、Zabbix エージェントの起動ユーザが PostgreSQL の管理ユーザと異なる場合でもアクセスできる設定となります。

準備が整いましたので「ホストの設定」画面内の「テンプレート」タブを選択して 「追加」をクリックしてテンプレート一覧より「PostgreSQL Check」を選び「選択」、 「保存」をクリックします。(図10)

図10 テンプレートの適用

6. 監視データの確認

ホストの設定、テンプレートの適用が終わると自動的に監視が開始されます。 監視で取得したデータは、「監視データ」タブから「最新データ」を選択すると、 ホストの一覧に登録したホスト単位で表示されます。 ホスト名の左の「+」をクリックすることで、取得した各項目の最新値が取得できます。(図11)

pg_monzではデータベースのディスカバリが 1 時間ごとに実行されるので、 初期設定時やデータベースを追加した場合には、監視項目が追加されるまでしばらく時間がかかります。

図11 最新データ

Zabbix では取得したデータが数値の場合には、自動的にグラフが作成されます。 例えば postgres DB Size のグラフを確認したい場合には、 「最新データ」画面の名前 [postgres] DB Size の右列にある「グラフ」をクリックします。(図12)

図12 データベースサイズの確認

また「監視データ」タブにある「グラフ」のドロップダウンリストから グラフ名「Connection count」を選択すると PostgreSQL に接続しているコネクション数が表示されます。 ここで表示されるコネクション数は、コネクションのステート別に収集した結果を 一つのグラフ画面で重ねて表示されるようになっています。(図13)

図13 コネクション数

7. 監視項目の追加

Zabbixではシステムに合わせて固有の監視項目を追加することもでますが、 Zabbix であらかじめ用意されているテンプレートを利用することもできます。 ここでは Linux 用のテンプレートを PostgreSQL Server に適用してみます。

タブの「設定」 - 「ホスト」を選択し、ホスト一覧を表示より ホスト名 PostgreSQL Serverを選択します。

「ホストの設定」画面よりテンプレート「Template OS Linux」を適用し 保存ボタンをクリックすると監視が開始されます。(図14)

図14 Template OS Linux の適用

「Template OS Linux」では Linux サーバの CPU利用率やロードアベレージ、 メモリ利用率、ディスク容量、ネットワークトラフィックなどの監視データが取得できます。

次に「Template OS Linux」から取得した CPU利用率と「pg_monz」から取得した 1 秒間あたりのトランザクション量「commited transaction」を同時に描写するグラフを作成します。

タブの「設定」-「ホスト」を選択し、ホスト名「PostgreSQL Server」のグラフを選択します。 画面右上にあります [グラフの作成] を押し次の画面の入力を行い保存します。(図15)

図15 グラフ作成画面

作成したグラフは、タブの「監視データ」-[グラフ]画面より確認することができます。(図16)

図16 グラフの確認

複数のグラフをまとめて表示すると効率よく監視ができます。 Zabbix では複数のグラフをまとめて表示したい場合にはスクリーンを利用します。

タブの[設定] [スクリーン] より [スクリーンの作成] ボタンからスクリーンを作成し、 同じスクリーンに載せたいグラフを選択します。 作成したスクリーンの確認は、タブの「監視データ」-「スクリーン」からスクリーン名を選択します。(図17)

図17 スクリーンの確認

こちらのスクリーンでは別途 Zabbix の WEB 監視機能を利用して PostgreSQL にアクセスを行うWEBページの 1 秒間あたりダウンロード量 (KBps) と PostgreSQL の 1 秒間あたりのトランザクション量「commited transaction」の比較を行うグラフを作成し 同じスクリーンに同時に表示を行いました。

(6) 最後に

ここでは、統合監視ツールとして Zabbix を用いて、PostgreSQL を効率良く監視するための Zabbix テンプレート pg_monz を利用しました。 現時点では pg_monz はシングル構成の PostgreSQL を想定しておりますが、 今後はストリーミングレプリケーション(SR) の監視や pgpool-II にも対応した クラスタ構成の監視機能の追加を行う予定となっております。