Tech Sketch Bucket of Technical Chips by TIS Inc.

新しくなったpg_monzでPostgreSQLのクラスタを監視する

Pocket

pg_monzは統合監視ツールZabbixでPostgreSQLを監視するツールで、2015年3月にリリースされたバージョン2.0からは複数のPostgreSQLサーバによるクラスタ構成を監視できるようになっています。本記事ではバージョン2.0で追加されたクラスタ監視の機能を中心にpg_monzがPostgreSQLの運用にどのように活用できるかを紹介します。

pg_monzとは

pg_monz(ぴーじーもんずと読みます)はPostgreSQL monitoring template for Zabbixの略称で、OSSの統合監視ツールであるZabbixからOSSのデータベースであるPostgreSQLを監視するツールとして、SRA OSS,Inc.日本支社とTIS株式会社が共同で開発しています。2015年3月31日にリリースされたバージョン2.0では監視処理の性能が改善されるとともにPostgreSQLのストリーミングレプリケーションやpgpool-IIの監視設定が盛り込まれ、複数のPostgreSQLサーバによるクラスタ構成の監視運用に使えるようになっています。

pg_monzはOSSで公開されておりこちらのサイトからダウンロードが可能です。また、インストール手順や監視項目等を解説したドキュメントも掲載されているので確認してみてください。

pg_monzを導入してみる

pg_monzを理解するには実際に動作させてみるのが一番ですので、今回は仮想環境上に以下の様な試行環境を構築する手順をこちらのページにまとめました。本記事でもこの試行環境に登場するサーバ名やIPアドレスを使います。

試行環境構成図

pg_monzのクラスタ監視機能を使ってみる

複数のPostgreSQLサーバから構成されるクラスタの監視対象としては以下が挙げられます。

  1. 個々のPostgeSQLサーバの稼働状況
  2. PostgreSQLサーバ内に作成されたデータベース、テーブル単位の稼働状況
  3. PostgreSQLサーバ間のストリーミングレプリケーションの稼働状況
  4. PostgreSQLサーバへの負荷分散を行うpgpool-IIの稼働状況
  5. クラスタ全体としてのサービス提供状況

上記の1.〜2.は単体のPostgreSQLサーバに対する監視機能でバージョン1.0で実現していました。以前、本ブログ:PostgreSQLを監視するZabbixテンプレート pg_monzThinkIT連載:PostgreSQLの運用監視をスマートに -Zabbix監視テンプレート pg_monz-で紹介していますので本記事とあわせて読んでいただければと思います。

バージョン2.0では上記の3.〜5.の機能が追加されていますが、本記事では5.に絞って実例を交えて紹介していきます。

クラスタ全体としてのサービス提供状況

複数のサーバで構成されるクラスタ構成を運用する場合、個々のサーバ単体は正常に稼働していてもクラスタ全体のサービスとしては異常が発生しているケースがあり、このようなクラスタ特有の障害事象にも対応する必要があります。今回のpgpool-II,PostgreSQLで構成するクラスタ環境では具体的に以下の事象が想定されます。

  • アクティブなpgpool-IIが複数存在する/1つも存在しない。
  • ストリーミングレプリケーションのプライマリサーバが複数存在する/1つも存在しない。
  • 同期レプリケーションのスタンバイが全てダウンしている。
  • PostgreSQLのプライマリサーバに障害が発生した。

pg_monzはこれらの障害事象も検出できますので、それぞれの障害事象を検出する様子を紹介します。

アクティブなpgpool-IIが複数存在する/1つも存在しない。

pgpool-IIをwatchdog機能で冗長化する場合、稼働する2台のpgpool-IIサーバのうち1台がアクティブサーバとなりクライアントからのアクセスに使う仮想IPが割り当てられます。以下の例ではpgpool01,pgpool02がともに稼働しており、仮想IPがアクティブなpgpool01のみに割当られている(delegate_ip is existsがUP)ことがわかります。

仮想IP保持状況_正常

つまり「仮想IPを保有するpgpool-IIはクラスタ全体で1つ」が正常な状態ですので、仮想IPを保有するpgpool-IIが2つ以上存在する、あるいは1つも存在しない状態は異常として検出し、仮想IPの再割当て等の対応を早急に行う必要があります。

今回はpgpool02のサーバで「ifconfig eth1:0 192.168.1.100」を実行し、仮想IPを保有するpgpool-IIが2つ以上存在する状態を意図的に発生させてみます。実行後しばらくするとpgpool02にも仮想IPが割当られている状態に変化します。

仮想IP保持状態_異常

仮想IPが割当てられたpgpool-IIが複数存在することを検出すると、pg_monzでは以下の様に重度の障害として通知されます。アクティブな(仮想IPが割当てられた)pgpool-IIが複数存在する事象はクライアントから正常にSQLを実行できてしまうため発見が遅れがちになりますが、pg_monzを使えば早期に発見と対処が可能となります。

仮想IP重複イベント

ストリーミングレプリケーションのプライマリサーバが複数存在する/1つも存在しない。

PostgreSQLのストリーミングレプリケーションを利用する場合、1台がプライマリサーバとなり、その他はスタンバイサーバとなります。以下の例ではpgsql01がプライマリサーバ、pgsql02,pgsql03がスタンバイサーバとして起動していることがわかります。

SRにおけるサーバの役割_正常時

つまり「プライマリサーバがクラスタ全体で1つ」が正常な状態ですので、プライマリサーバが2つ以上存在する、あるいは1つも存在しない状態は異常として検出し、対処する必要があります。

今回はpgsql03のPostgreSQLサーバのrecovery.confを削除して再起動し、プライマリサーバが2つ存在する状態を意図的に発生させてみます。実行後しばらくするとpgsql03がプライマリサーバとして認識された状態に変化します。

SRにおけるサーバの役割_異常時

プライマリサーバが複数存在することを検出すると、pg_monzでは以下の様に重度の障害として通知されます。

SRプライマリサーバ重複イベント

ストリーミングレプリケーションのプライマリサーバが複数存在する場合、それぞれのプライマリサーバが個別に更新を受け付けることができ、レプリケーションで担保されるべきデータベースの整合性が崩れてしまうため、できるだけ早期に解消させる必要がありますが、それぞれのPostgreSQLサーバに対しては正常にSQLが実行できるため発見が遅れがちになります。pg_monzを使えば早期に発見し対処することが可能となります。

同期レプリケーションのスタンバイが全てダウンしている。

PostgreSQLで同期レプリケーションを利用する場合、1台がプライマリサーバ、1台が同期スタンバイサーバ、残りが非同期スタンバイサーバとなります。PostgreSQLの同期レプリケーションは同期スタンバイサーバが存在しないとプライマリサーバに対する更新をブロックする仕様となっていますが、この状態でもプライマリサーバは正常に稼働しているように見えるため、発見しづらい事象と言えます。

今回はpgsql02,pgsql03のPostgreSQLサーバを手動で停止し、同期スタンバイサーバが存在しない状態を意図的に発生させてみます。実行後しばらくするとpgsql02,pgsql03が停止した事象と同期スタンバイ不在のために更新処理がブロックされている事象が検出され、重度の障害として通知されます。

同期SR_スタンバイ全停止

プライマリサーバに障害が発生した。

pgpool-IIをマスタスレーブモードでPostgreSQLのストリーミングレプリケーションと組み合わせて運用する場合、PostgreSQLのプライマリサーバ、スタンバイサーバ停止時のフェイルオーバ操作をpgpool-IIで自動化することができます。そのためプライマリサーバに障害が発生しても即座にクラスタのサービスが停止することはありませんが、フェイルオーバが発生して縮退運転になっている状況は早めに把握して、障害サーバの復旧作業を開始したいところです。

今回はpgsql01のPostgreSQLサーバを手動で停止し、プライマリサーバの障害を意図的に発生させてみます。実行後しばらくするとpgsql01が停止していることとpgsql02がプライマリサーバに昇格していることがわかります。

SRプライマリサーバ停止

またフェイルオーバによりスタンバイサーバがプライマリサーバに昇格したことを検出すると、pg_monzでは以下の様にステータスが障害、深刻度は情報レベルとして通知されるので、この通知をきっかけにサーバ管理者はサーバの復旧作業を開始することが可能となります。

フェイルオーバ時イベント

最後に

本記事ではpg_monzに備わったPostgreSQLのクラスタ監視機能を中心に紹介しました。細かい機能については今回紹介した試行環境を使って是非ご自身で動作を確認してみてください。また、実際に運用で使う場合に不都合な点や追加機能のアイデアなどのフィードバックをお待ちしています。pg_monzの様な運用ツールが拡充されることで、PostgreSQLがより使いやすくなり、適用される範囲がより広がっていることを期待しています。

お問い合わせやフィードバックはpg_monzユーザーグループpg_monz開発GitHubのissueで受け付けています。

エンジニア採用中!私たちと一緒に働いてみませんか?