SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

近未来の技術トレンドを先取り! 「Tech-Sketch」出張所

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

近未来の技術トレンドを先取り! 「Tech-Sketch」出張所 第20回

  • X ポスト
  • このエントリーをはてなブックマークに追加

クラスタの状態

 複数のサーバで構成されるクラスタ構成を運用する場合、個々のサーバ単体は正常に稼働しているが、クラスタ全体のサービス状態としては異常が発生しているケースが考えられ、このようなクラスタ特有の障害事象に対応する必要があります。

 今回のpgpool-II、PostgreSQLで構成するクラスタ環境では、具体的に以下の事象が想定されます。

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

 pg_monzは、これらの障害事象を検出できるように実装されています。それぞれの障害事象を検出する様子を以下に紹介していきます。

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

 pgpool-IIをwatchdog機能で冗長化する場合、稼働する2台のpgpool-IIサーバのうち1台がアクティブサーバとなりクライアントからのアクセスに使う仮想IPが割り当てられます。

図11 pgpool watchdog機能利用時のサーバ構成(※pgpool-IIユーザマニュアルより引用)
図11 pgpool watchdog機能利用時のサーバ構成(※pgpool-IIユーザマニュアルより引用)

 以下の例ではpgpool01、pgpool02がともに稼働しており、仮想IPがアクティブなpgpool01のみに割り当てられている(delegate_ip is existsがUP)ことが分かります。

図12 正常時のpgpool-IIの仮想IP保有状況
図12 正常時のpgpool-IIの仮想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が割当られている状態に変化します。

図13 異常時のpgpool-IIの仮想IP保有状況
図13 異常時のpgpool-IIの仮想IP保有状況

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

図14 仮想IPの重複が発覚した際に発生したイベント
図14 仮想IPの重複が発覚した際に発生したイベント

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

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

図15 正常時のストリーミングレプリケーションにおける各サーバの役割
図15 正常時のストリーミングレプリケーションにおける各サーバの役割

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

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

図16 プライマリサーバ重複時の各サーバの役割
図16 プライマリサーバ重複時の各サーバの役割

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

図17 プライマリサーバの重複が発覚した際に発生したイベント
図17 プライマリサーバの重複が発覚した際に発生したイベント

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

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

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

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

図18 同期スタンバイサーバの不在が発覚した際に発生したイベント
図18 同期スタンバイサーバの不在が発覚した際に発生したイベント

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

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

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

図19 プライマリサーバ停止後の各サーバの役割
図19 プライマリサーバ停止後の各サーバの役割

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

図20 フェイルオーバが発生を通知するイベント
図20 フェイルオーバが発生を通知するイベント

最後に

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

 お問い合わせやフィードバックは以下のメーリングリストやGitHubのissueで受け付けています。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
近未来の技術トレンドを先取り! 「Tech-Sketch」出張所連載記事一覧

もっと読む

この記事の著者

中西 剛紀(TIS株式会社)(ナカニシ ヨシノリ)

TIS株式会社 IT基盤技術本部 OSS推進室所属。 OSS推奨ミドルウェアスタック「ISHIGAKI Template」の開発とともに、OSSのプロダクトサポートや技術支援を提供するサービスに従事している。過去の業務で様々なDBMSと苦楽を共にした後、現在はPostgreSQLに心酔。日本Pos...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8885 2015/08/12 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング