PostgreSQLを監視するZabbixテンプレート pg_monz とは

2013年11月5日にTIS株式会社(以下TIS)とSRA OSS, Inc. 日本支社(以下SRA OSS)はPostgreSQLを監視するためのZabbixテンプレート「pg_monz(ぴーじーもんず)」をオープンソースソフトウェア(以下OSS)として公開しました。
この連載では、現在普及が進むPostgreSQLとZabbixの現状や課題を紹介しながら、監視テンプレートであるpg_monzに焦点を当て、導入するメリットや特長、また実際の導入手順などについて詳しく解説していきます。
第1回となる今回は、pg_monz開発の背景とpg_monzが提供する機能について紹介します。
PostgreSQLを取り巻く現状と課題
現在、さまざまな領域でOSSの活用が進んでおり、データベース管理システム(DBMS)においても利用ノウハウや導入事例が知られるようになるにつれ、OSSを導入するケースが増加しています。
OSSのデータベース管理システム(DBMS)で人気を二分しているのがPostgreSQLとMySQLです。以前は「OSSのDBMSといえばMySQL」という印象がありましたが、ここ数年で企業システムや商用サービスにPostgreSQLが導入されるケースが増えています。これはPostgreSQLの商用サポートが複数のベンダーから提供されるようになったことや、日本PostgreSQLユーザ会(http://www.postgresql.jp/)といったコミュニティ、PostgreSQLエンタープライズコンソーシアム(https://www.pgecons.org/)といった企業団体の活動を通じて「DBMSの機能や性能が商用製品にも引けをとらない」という理解が広まっていることも背景にあると思います。
また、2013年11月にはAmazon Web ServiceのRelational Database Service(RDS)でもPostgreSQLの利用が可能となりました。PostgreSQLはライセンス等の制約がないことからクラウドサービスでも利用しやすく、今後ますます適用範囲が広がっていくものと期待されます。
一方、運用面ではまだPostgreSQLに物足りない点があるように感じます。例えば、DBMS自体が備える運用機能やサードパーティ製の運用ツールの充実度といった部分は商用のDBMSに後れをとっていますし、どのように運用すればよいかというノウハウもまだまだ整備されていないのが現状です。
Zabbixを取り巻く現状と課題
データベースだけでなく、OSSの統合監視ツールとして知られるZabbixも利用範囲が拡大しており、日本国内でも導入事例を聞くことが多くなってきました。これはZabbixが監視ツールに必要な機能をほぼ実現しており、一般的なシステム監視のニーズに応えられるツールと理解されつつあることが背景にあると考えられます。PostgreSQLと同様、今後も普及が進んでいくものと期待されます。
しかし、Zabbixを使って一定レベル以上のシステム監視を実現しようとした場合、監視項目を設定するコストがかかります。具体的には、Zabbixで監視項目を設定するには、監視で使うアイテムのキーや障害通知に使うトリガ条件式の書き方、関数の使い方といったZabbixに関する知識を身につける必要があり、一定の学習コストが必要になります。また他にも、DBMSやアプリケーションサーバーといった、Zabbixが標準でアイテムを用意していないレイヤを監視する場合は、自分で監視アイテムを取得するスクリプトを作りこまなければならず、この部分にもコストとノウハウが必要となります。
なお、Zabbixにはテンプレートという仕組みが用意されており、よく使われる監視のパターンをテンプレート化すれば監視項目を設定するコストを削減できます。ただし、Zabbix導入後の標準状態で用意されているテンプレートのバリエーションはまだまだ少ないのが現状で、残念ながらPostgreSQLを監視するためのテンプレートは標準で用意されていません。
pg_monz を開発したきっかけ
TISとSRA OSSはともに自社のビジネスに活用しているPostgreSQL、Zabbixの利用を広めたいという意識がありました。また、それぞれのコミュニティで顔を合わせる機会も多く、「PostgreSQL用のZabbix監視テンプレートがあるといいよね」と意気投合したのがpg_monzを開発するきっかけでした。
pg_monzとは
pg_monzはZabbixでPostgreSQLを監視するためのテンプレートで以下のサイトからダウンロードが可能です。
> ダウンロードサイト: https://github.com/pg-monz/pg_monz/releases
> ドキュメントサイト: http://pg-monz.github.io/pg_monz/
pg_monzにはPostgreSQLを運用する際に必要な監視設定があらかじめ設定されていますので、Zabbixにおける監視設定の手間を大幅に削減できます。また、pg_monzに設定された監視項目はPostgreSQLの利用経験が豊富なTIS、SRA OSSのエンジニアが設計しており、PostgreSQLにさほど詳しくない運用者でも高度な監視運用を実現できます。
pg_monz の特徴
導入が容易
監視対象のサーバーに対して3つのファイル(userparameter_pgsql.conf, find_dbname.sh, find_dbname_table.sh)をコピーし、Zabbixサーバーに対してはテンプレートファイル(pg_monz_template.xml)のインポートと、監視対象サーバーを指定するだけでPostgreSQLの監視がスタートします。また、pg_monzはZabbixの標準機能を利用しているため、特別なモジュールの導入や複雑な設定変更といった作業が不要です。pg_monzの導入手順は次回詳しく解説します。
データベースの増減に監視項目が自動で追随
pg_monz にはデータベース容量やキャッシュヒット率などデータベース単位で情報取得する監視項目があります。PostgreSQLのデータベースは1つのサーバーに複数作成できますが、データベースを追加した場合は通常そのデータベースに対する監視項目を新たに設定する必要があります。pg_monz は Zabbix 2.0以降で搭載されるようになったローレベルディスカバリ(LLD)機能を応用してデータベースの最新状態から監視項目を自動生成する仕組みを用意していますので、データベースの増減に伴う設定作業を削減することができます。
pg_monzでできること
pg_monzが提供する監視機能を紹介します。
死活監視
PostgreSQLサーバーが正常に稼働しているかを定期的に確認し、稼働していない場合は通知します。
Zabbix上の表示名 | 取得する情報 |
---|---|
number of postgres process | PostgreSQLサーバーのプロセス数 |
PostgreSQL service is running | PostgreSQLサーバーのSQL応答確認結果 |
【アイテム】 |
Zabbix上の表示名 | 発生条件 |
---|---|
PostgreSQL process is not running. | PostgreSQLサーバーのプロセス数が0 |
PostgreSQL service is not running. | PostgreSQLサーバーへのSQL実行に失敗 |
【トリガ】 |
ログ監視
PostgreSQLサーバーのログを常時確認し、監視したいメッセージが出力された場合に通知します。
Zabbix上の表示名 | 取得する情報 |
---|---|
Log of (ログファイル名) | PANIC,FATAL,ERRORを含むログメッセージ文字列 |
【アイテム】 |
データベース容量監視
データベース毎の容量を定期的に監視し、あらかじめ設定した閾値を超過した場合に通知します。また、データベース容量の遷移を以下の様なグラフで表示することができます。
Zabbix上の表示名 | 取得する情報 |
---|---|
[DB名] DB Size | 対象データベースの容量 |
【アイテム】 |
Zabbix上の表示名 | 発生条件 |
---|---|
[DB名] DB Size is too large | データベース容量が閾値を超過 |
【トリガ】 |
Zabbix上の表示名 | 表示する情報 |
---|---|
[DB名] DB Size | 対象データベースの容量遷移 |
【グラフ】 |
データベース接続数監視
クライアントからPostgreSQLサーバーへの接続数をSQL処理中、アイドル状態、ロック待ちといったステータス別に取得し、接続数の内訳を以下の様なグラフで表示することができます。PostgreSQLサーバーのパラメータや多数の接続を占有するアプリケーションのチューニングに利用します。
Zabbix上の表示名 | 取得する情報 |
---|---|
Connections | バックエンドプロセス数(合計) |
Active (SQL processing) connections | パックエンドプロセス数(SQL処理中) |
Idle connections | バックエンドプロセス数 (クライアントからの問い合わせ待ち) |
Idle in transaction connections | バックエンドプロセス数 (トランザクション内でコマンド待ち状態) |
Lock waiting connections | バックエンドプロセス数 (トランザクション内でロック待ち状態) |
【アイテム】 |
Zabbix上の表示名 | 発生条件 |
---|---|
Many connections are forked. | バックエンドプロセス数が閾値を超過 |
【トリガ】 |
Zabbix上の表示名 | 表示する情報 |
---|---|
Connection count | バックエンドプロセス数の遷移 |
【グラフ】 |
チェックポイント実行回数の監視
PostgreSQLサーバー内部でチェックポイント処理が実行された回数を定期的に取得し、実行回数の遷移をグラフで表示できます。PostgreSQLサーバーのチェックポイント関連パラメータのチューニングに利用します。
Zabbix上の表示名 | 取得する情報 |
---|---|
Checkpoint count (by checkpoint_segments) | checkpoint_segments超過によるチェックポイント実行回数 |
Checkpoint count (by checkpoint_timeout) | checkpoint_timeout時間経過によるチェックポイント実行回数 |
【アイテム】 |
Zabbix上の表示名 | 発生条件 |
---|---|
Checkpoints are occurring too frequently | 一定期間のチェックポイント発生回数が閾値を超過 |
【トリガ】 |
Zabbix上の表示名 | 表示する情報 |
---|---|
Checkpoint count | チェックポイント発生回数の遷移 |
【グラフ】 |
データベースキャッシュヒット率の監視
データベース毎のキャッシュヒット率を定期的に確認し、あらかじめ設定した閾値を下回った場合に通知します。
また、キャッシュヒット率の遷移をグラフでも表示します。PostgreSQLサーバーのメモリ関連のパラメータやチューニング対象とするSQLの特定に利用します。
Zabbix上の表示名 | 表示する情報 |
---|---|
[DB名] Cache Hit Ratio | 対象データベースのキャッシュヒット率 |
【アイテム】 |
Zabbix上の表示名 | 発生条件 |
---|---|
[DB名] Cache hit ratio is too low | 対象データベースのキャッシュヒット率が閾値以下に低下 |
【トリガ】 |
Zabbix上の表示名 | 表示する情報 |
---|---|
[DB名] Cache Hit Ratio | 対象データベースのキャッシュヒット率の遷移 |
【グラフ】 |
デッドロック発生状況の監視
データベース毎のデッドロック発生回数を定期的に確認し、あらかじめ設定した閾値を超過した場合に通知します。また、デッドロック発生回数の遷移をグラフでも表示します。デッドロックが多発する時間帯を特定し、原因となるSQLやアプリケーションの特定に結びつけます。
Zabbix上の表示名 | 取得する情報 |
---|---|
[DB名] Deadlocks | 対象データベースでのデッドロック発生回数 |
【アイテム】 |
Zabbix上の表示名 | 発生条件 |
---|---|
[DB名] Deadlocks occurred too frequently | 対象データベースで閾値以上のデッドロックが発生 |
【トリガ】 |
Zabbix上の表示名 | 表示する情報 |
---|---|
[DB名] Deadlocks | 対象データベースでのデッドロック発生回数の遷移 |
【グラフ】 |
トランザクション処理状況の監視
データベース毎のCOMMIT/ROLLBACK処理の実行回数を定期的に取得し、実行回数の遷移をグラフで表示します。データベース毎のスループットを調査する目的で利用します。
Zabbix上の表示名 | 取得する情報 |
---|---|
[DB名] Commited transactions | 対象データベースでのCOMMIT回数 |
[DB名] Rolled back transactions | 対象データベースでのROLLBACK回数 |
【アイテム】 |
Zabbix上の表示名 | 表示する情報 |
---|---|
[DB名] Number of commited/rolled back transactions | 対象データベースでのCOMMIT/ROLLBACK回数の遷移 |
【グラフ】 |
一時ファイル発生状況の監視
データベース毎に一時ファイルとして出力されたデータ量を定期的に確認し、あらかじめ設定した閾値を超過した場合に通知します。また、一時ファイルの出力量の遷移をグラフでも表示します。PostgreSQLサーバーのメモリ関連のパラメータチューニングに利用します。
Zabbix上の表示名 | 取得する情報 |
---|---|
[DB名] Temp bytes | 対象データベースで一時ファイルに書き込んだデータのバイト数 |
【アイテム】 |
Zabbix上の表示名 | 発生条件 |
---|---|
[DB名] Too many temp bytes | 対象データベースでの一時ファイル出力が閾値を超過 |
【トリガ】 |
Zabbix上の表示名 | 発生条件 |
---|---|
[DB名] Temp file size | 対象データベースでの一時ファイル出力データ量の遷移 |
【グラフ】 |
滞留バックエンド処理の監視
PostgreSQLサーバー上のバックエンドプロセスの中から一定時間以上経過したプロセス数を確認し、あらかじめ設定した閾値を超過した場合に通知します。SQLのチューニングに利用します。
Zabbix上の表示名 | 取得する情報 |
---|---|
Slow queries | 一定時間経過したバックエンドプロセス数(処理中) |
Slow DML queries | 一定時間経過したバックエンドプロセス数(DML処理中) |
Slow select queries | 一定時間経過したバックエンドプロセス数(SELECT処理中) |
【アイテム】 |
Zabbix上の表示名 | 発生条件 |
---|---|
Too many slow queries | 一定時間経過したバックエンドプロセス数が閾値を超過 |
【トリガ】 |
今回はpg_monz開発の背景とpg_monzが提供する機能について紹介しました。次回はpg_monzを導入する手順とpg_monzの動作の仕組みについて解説します。
【関連リンク】
(リンク先最終アクセス:2014.01)