ホットスタンバイ

ホットスタンバイは、負荷分散により性能を向上させ、障害発生時のダウンタイムを最小限に留める手法の一つです。 PowerGres を 2 系統用意してそれぞれを稼動系、待機系サーバとし、稼動系サーバではデータの更新と参照を受け付け、待機系サーバではデータの参照のみを受け付けます。

待機系サーバがデータの更新、参照ともに受け付けずに障害発生に備えて待機しているだけのウォームスタンバイに対して、待機系サーバがデータの参照を受け付けることができることからホットスタンバイと呼ばれます。

ホットスタンバイでは、正常時は稼動系と待機系サーバに参照を振り分けて性能を向上させ、障害発生時はサーバを切り替えることで耐障害性を向上させることができます。 なお、PowerGres 自体にはデータの参照と更新をサーバに振り分ける機能や、障害発生時に自動的にサーバを切り替える機能はありません。

PowerGres はこれを実現するために、待機系サーバは、稼動系サーバから定期的にデータ更新の差分を受け取って適用します。 これをストリーミングレプリケーションと呼びます。 ストリーミングレプリケーションでは、データ更新の差分をトランザクションログのレコード単位で適用します。

ネットワークの切断や稼動系サーバの停止によってストリーミングレプリケーションが中断されると、稼動系サーバのデータ更新の差分が削除されてしまう場合があります。 そうなってしまうと、ストリーミングレプリケーションを再開できず、通常、ホットスタンバイを構築しなおす必要があります。

PowerGres では、ホットスタンバイを構築しなおさなくても済むように、稼動系サーバでトランザクションログをアーカイブログとして保存しておき、ストリーミングレプリケーションが中断された場合にアーカイブログを待機系サーバに転送して適用します。 これをログシッピングと呼びます。 ログシッピングには PowerGres 独自の pwg_rcpxlog コマンド を使用します。

ストリーミングレプリケーションは非同期と同期が選択できます。 デフォルトでは非同期レプリケーションです。 同期レプリケーションに変更したい場合にはホットスタンバイの構築後にレプリケーションの設定を行う必要があります。 レプリケーションの設定については「レプリケーション」を参照してください。

注意

稼動系と待機系サーバの PowerGres は、同一プラットフォームかつ同一バージョンである必要があります。

稼動系から待機系サーバへのフェイルオーバや参照の負荷分散は、自動では行われません。 アプリケーション側の作り込みで対応するか、pgpool-II などのミドルウェアを導入する必要があります。

待機系サーバは常にリカバリを実施しているため、データの参照しか行うことができません。 更新はエラーになります。 待機系サーバで実行可能な SQL は「PostgreSQL ドキュメント」の「25.5. ホットスタンバイ」を参照してください。

非同期レプリケーションの場合には、稼動系サーバの障害発生時に待機系サーバへのフェイルオーバを行うと、待機系サーバに未反映の更新内容は失われる可能性があります。

注意

稼働系サーバのアーカイブログは自動的には削除されません。 アーカイブログが溜りつづける現象を回避するには、以下のようなバッチファイルやシェルスクリプトを作成して定期的に実行するようにします。

Windows の場合
@echo off

rem # WALファイル保存ディレクトリ
set xlogpath=C:\pg_data\pg_archive
rem # 残すファイル数
set restfile=10

cd %xlogpath%
for /f "skip=10" %%A in ('dir /b /o-n ^| find /v "archive" ^| ^
find /v "backup"') do (
 del %%A
)
Linux の場合
#!/bin/sh

# WALファイル保存ディレクトリ
xlogpath=/opt/pg_data/pg_archive
# 残すファイル数
restfile=10

cd $xlogpath
ls -t | grep -v backup | grep -v archive_status | \
sed -e "1,${restfile}d"| xargs rm -f

稼動系サーバの設定

ホットスタンバイを構築するには、まず、稼動系サーバを設定するサーバ上で PowerGres Manager を起動して以下の手順に従って設定を行います。

  1. サーバ管理ツリーメニューからサーバを選択し、サービスが開始されていることを確認します。

    サーバの登録が完了していない場合には、「サーバ」の「サーバの登録」を参照してデータベースクラスタを作成し、「サービス」の「サービスの開始」を参照してサービスを開始してください。

  2. 「サーバ」の「ホットスタンバイを構築」を選択し、ホットスタンバイ構築ウィザードを起動します。

    ホットスタンバイ構築ウィザードの指示に従って稼動系サーバの設定を行っていきます。

  3. 「稼動系サーバの設定」を選択し、「進む」ボタンをクリックします。

  4. 稼動系サーバの情報を確認し、「待機系サーバの数」を入力します。

    複数の待機系サーバを設定する場合や、今後、待機系サーバの数を増やすことを計画している場合には、その数に応じて待機系サーバの数を入力してください。 待機系サーバの数は後から変更することもできますが、変更を反映するにはサービスの再起動が必要になります。

    ヒント

    待機系サーバの数をホットスタンバイ構築ウィザードの終了後に変更する場合には、稼動系サーバで、サーバ管理ツリーメニューの「設定」から「基本 (postgresql.conf)」を選択し、「WAL」カテゴリ内の「ストリーミングレプリケーション」を開き、「max_wal_senders」パラメータの値を変更します。 その後、稼動系サーバ、待機系サーバの順にサービスを再起動します。

    パラメータの設定について詳しくは、「設定」の「基本 (postgresql.conf)」を参照してください。

  5. レプリケーション用にクライアント認証の設定を行います。

    ホットスタンバイでは、稼動系サーバでのデータ更新の差分を待機系サーバに適用してレプリケーションを行うため、待機系サーバから稼動系サーバへの接続が行われます。 そこで、稼動系サーバで、待機系サーバからの接続を受け付けるようにクライアント認証の設定を行います。

    ホットスタンバイ構築ウィザードでは、レプリケーション用のスーパーユーザ「repli」が特定の IP アドレスから接続した場合にパスワード認証を行うように設定します。 repli ユーザが存在しない場合には自動的に作成されます。

    「パスワード」、「パスワード (再確認)」には、repli ユーザのパスワードを入力します。 repli ユーザのパスワードは待機系サーバの設定時に必要になります。

    「IP アドレスの範囲」には、稼動系サーバへの接続を受け付ける IP アドレスの範囲を CIDR 形式 (例: 192.0.2.0/24) で入力します。 「samenet」と入力すると、稼動系サーバのサブネット内からの接続を受け付けます。

    ヒント

    レプリケーション用のクライアント認証をホットスタンバイ構築ウィザードの終了後に設定する場合には、サーバ管理ツリーメニューの「設定」から「接続認証 (pg_hba.conf)」を選択し、データベース名にレプリケーションを表す replication と指定して設定を行います。

    クライアント認証の設定について詳しくは、「設定」の「接続認証 (pg_hba.conf)」を参照してください。

  6. 「OK」ボタンをクリックしてホットスタンバイ構築ウィザードを閉じます。

    これで稼動系サーバの設定は完了です。 続いて、待機系サーバの設定を行います。

待機系サーバの設定

稼動系サーバの設定が完了したら、続いて、待機系サーバを設定するサーバ上で PowerGres Manager を起動して以下の手順に従って設定を行います。

  1. 「サーバ」の「ホットスタンバイを構築」を選択し、ホットスタンバイ構築ウィザードを起動します。

    ホットスタンバイ構築ウィザードの指示に従って待機系サーバの設定を行っていきます。

    待機系サーバは、稼動系サーバからデータをダウンロードして設定するため、あらかじめサーバの登録やサービスの開始を行う必要はありません。

  2. 「待機系サーバの設定」を選択し、「進む」ボタンをクリックします。

  3. 待機系サーバの情報と「作業ディレクトリ」を入力します。

    待機サーバの「ラベル」、「ポート」、「データディレクトリ」には、稼働系サーバからデータをダウンロードして待機系サーバとして登録するための情報を入力します。 それぞれの情報はサーバの登録時に入力するものと同じ意味になります。 サーバの登録について詳しくは、「サーバ」の「サーバの登録」を参照してください。

    「作業ディレクトリ」には、稼動系サーバからダウンロードしたデータを一時的に保存するディレクトリを指定します。 少なくとも稼動系サーバのデータベースディレクトリが収まる程度のディスクの空き容量が必要となります。

注意

Windows版では、稼働系サーバからダウンロードできるサイズは、2GB までです。ベースバックアップのサイズが 2GB 以上ある場合には、手動で「作業ディレクトリ」内にベースバックアップファイルをコピーしておく必要があります。

  1. 待機系から稼動系サーバに接続するための情報を入力します。

    稼動系サーバの「ホスト」、「ポート」には、稼動系サーバのホスト名、ポート番号を入力します。 ホスト名は IP アドレスでなくても問題ありません。

    「パスワード」には、レプリケーション用のスーパーユーザ「repli」のパスワードを入力します。 ここで入力するパスワードは稼動系サーバの設定時に入力したものです。

  2. 「OK」ボタンをクリックしてホットスタンバイ構築ウィザードを閉じます。

    これで待機系サーバの設定は完了です。 続いて、待機系サーバのサービスを開始します。

  3. サーバ管理ツリーメニューからサービスを選択し、「スタンバイ開始」ボタンをクリックします。

    Windows の場合には、まず、「PowerGres を Windows サービスとして登録」ボタンをクリックし、待機系サーバを Windows サービスとして登録する必要があります。

    待機系サーバの設定が正常に完了していれば、「サービスを起動」ボタンの代わりに「スタンバイ開始」ボタンが表示されます。

  4. 待機系サーバとしてサービスが開始されていることを確認します。

    画面下のサーバ状態に「サーバ ラベル名 (localhost: ポート番号) はスタンバイ中です。」と表示されていれば、待機系サーバとして正常にサービスが開始されています。

動作確認

ホットスタンバイの構築が完了したら、以下の手順に従ってホットスタンバイが正常に動作していることを確認します (任意)。

  1. 稼動系サーバでデータの更新を行います。

    1. 稼動系サーバ上で PowerGres Manager を起動し、「その他ツール」から psql を起動します。

    2. テーブルを作成してデータを挿入します。

      =# CREATE TABLE t (c int);
      CREATE TABLE
      =# \d t
           Table "public.t"
       Column |  Type   | Modifiers
      --------+---------+-----------
       c      | integer |
      
      =# INSERT INTO t VALUES (1);
      INSERT 0 1
      
    3. テーブルにデータが挿入されていることを確認します。

      =# SELECT * FROM t;
       c
      ---
       1
      (1 row)
      
  2. 稼動系サーバに対するデータの更新が待機系サーバに反映されていることを確認します。

    1. 待機系サーバ上で PowerGres Manager を起動し、「その他ツール」から psql を起動します。

    2. 稼動系サーバで作成したテーブルが存在し、データが挿入されていることを確認します。

      =# \d t
           Table "public.t"
       Column |  Type   | Modifiers
      --------+---------+-----------
       c      | integer |
      
      =# SELECT * FROM t;
       c
      ---
       1
      (1 row)
      
    3. 待機系サーバではデータの更新がエラーになることを確認します。

      =# INSERT INTO t VALUES (2);
      ERROR:  cannot execute INSERT in a read-only transaction
      

フェイルオーバ

稼動系サーバに障害が発生して停止した場合でも、待機系サーバではデータの参照のみを受け付けることができます。 データの参照のみでなく更新も受け付けるには、障害の発生した稼動系サーバを復旧させるか、待機系サーバを稼動系に切り替える必要があります。 待機系サーバを稼動系に切り替えることをフェイルオーバと呼びます。

注意

非同期レプリケーションの場合には、稼動系サーバの障害発生時に待機系サーバへのフェイルオーバを行うと、待機系サーバに未反映の更新内容は失われる可能性があります。

フェイルオーバ時に更新内容が失われるのを回避するには、同期レプリケーションの設定を行う必要があります。 レプリケーションの設定については「レプリケーション」を参照してください。

待機系サーバを稼動系に切り替えるには、以下の手順に従って操作を行います。

  1. サーバ管理ツリーメニューからサービスを選択し、「稼動系に切り替える」ボタンをクリックします。

  2. 稼動系サーバとしてサービスが開始されていることを確認します。

    画面下のサーバ状態に「サーバ ラベル名 (localhost: ポート番号) は稼働中です。」と表示されていれば、稼動系サーバとして正常にサービスが開始されています。

  3. データの更新を受け付けるようになったことを確認します (任意)。

    1. 「その他ツール」から psql を起動します。

    2. テーブルにデータを挿入し、エラーにならないことを確認します。

      =# INSERT INTO t VALUES (3);
      INSERT 0 1
      =# SELECT * FROM t;
       c
      ---
       1
       3
      (2 rows)
      

pwg_rcpxlog コマンド

pwg_rcpxlog コマンドは、ログシッピングを行うための PowerGres 独自のコマンドです。

ログシッピングではサーバ間でファイルの転送を行います。 それには、Windows では共有フォルダ、Linux では NFS や SSH の設定を行う必要があります。 pwg_rcpxlog コマンドは、PowerGres を通じてトランザクションログを転送することにより、PowerGres のみでログシッピングの設定を行うことができます。

pwg_rcpxlog コマンドは、PowerGres Manager でホットスタンバイを構築する場合に内部的に使用されます。 そのため、ユーザが pwg_rcpxlog コマンドを直接実行することは基本的にありません。

PowerGres Manager でホットスタンバイを構築すると、待機系サーバのデータベースクラスタディレクトリ内に以下のようなリカバリの設定ファイル recovery.conf が作成されます。 pwg_rcpxlog コマンドは restore_command パラメータに設定されるアーカイブログを取得するためのコマンドとして使用されます。

standby_mode = 'on'
primary_conninfo = 'host=primary.example.com port=5432 user=repli password=password application_name=powergres-standby'
restore_command = '"/opt/powergres91/bin/pwg_rcpxlog" -h "primary.example.com" -p "5432" -U "repli" -P "password" "pwg_archive" "%f" "%p"'
trigger_file = '/var/lib/pgsql/data/powergres.trigger'

使用方法

pwg_rcpxlog [option...] archivelocation nextwalfile xlogfilepath

オプション

archivelocation

稼動系サーバ上のアーカイブログの格納先のディレクトリのパスを指定します。 パスは以下のディレクトリ以下である必要があります。 絶対パス、またはデータベースクラスタディレクトリに対する相対パスを指定できます。

  • データベースクラスタディレクトリ
  • log_directory パラメータに設定されたログファイルの格納先のディレクトリ

nextwalfile

アーカイブログのファイル名を指定します。 restore_command パラメータでは、アーカイブログのファイル名を表す %f を指定します。

xlogfilepath

待機系サーバ上のアーカイブログのコピー先のファイルのパスを指定します。 restore_command パラメータでは、アーカイブログのコピー先のファイルのパスを表す %p を指定します。

-h hostname

稼動系サーバのホスト名を指定します。 デフォルトは Windows では localhost、Linux では Unix ドメインソケットです。 環境変数 PGHOST でも指定できます。

-p port

稼動系サーバが接続を監視するポート番号を指定します。 デフォルトは 5432 ポートです。 環境変数 PGPORT では指定できません。

-P password

稼動系サーバへの接続に使用するユーザのパスワードを指定します。

-U username

稼動系サーバへの接続に使用するユーザ名を指定します。 ユーザはスーパーユーザ権限をもっている必要があります。 デフォルトは postgres ユーザです。 環境変数 PGUSER では指定できません。

--help

コマンドライン引数の使用方法を表示して終了します。

--version

バージョンを表示して終了します。