このドキュメントは、PostgresForestの接続対象となっているDBサーバの環境構築および運用を行う者を対象としています。 また、読者はRDBMS(PostgreSQL)の管理やOS(Linux)に関する一般的な知識を保持することを前提としています。
このマニュアルの本文およびコード例で使用されている表記規則について説明します。
本文では、特定の項目が一目でわかるように、次の表記規則を使用しています。
固定幅フォント
コマンド、パラメータ、プログラムコード、SQLキーワード、 ファイル名などのシステム要素や、 画面出力などの入出力を表現するもの全ては、 固定幅フォントを使用します。 プログラム要素には、 大文字と小文字を組み合せて使用するものもありますが、 この場合は記載されているとおりに入力してください。
イタリック
イタリック (斜体)は、実際の値と置き換えられるプレースホルダまたは変数を示します。
コマンドの書式については、以下の規則を使用します。
大括弧( [ および ] )
オプションである部分を示します。
中括弧 ( { および } ) と縦線 ( | )
いずれか1つを選択しなければならないことを意味します。
点々 ( ... )
前にある要素が繰り返されるという意味です。
分かりやすさのために、
などのプロンプトを付ける場合があります。
オンラインリカバリツールが正常に動作することを確認した構成を以下に示します。
OS | RedHat Enterprise Linux 5 Update 1 (x86 32bit) |
PostgreSQL | 8.3.1 (./configure --prefix= PREFIX ) |
PostgresForest | 5.1.0 |
PostgresForestにより冗長化された構成において、 ソフトウェアやハードウェアの障害により、DBサーバが縮退してAPサーバから切り離されることがあります。 縮退後、システムは1台のDBサーバのみで稼動しており、さらなる障害に備えて冗長された構成に復旧する必要があります。
このツールを用いることにより、 現在稼働中のDBサーバにできる限り影響を与えることなく、 縮退した原因を取り除いたサーバ(もしくは事前に準備されていたサーバ)を稼動状態に復旧することができます。
ただし、DBクラスタ内に複数のUDBが存在しており、 一部のUDBのみが縮退していたとしても、DBクラスタ全体が復旧対象となります。 そのため、このツールを利用する上では、 事前に縮退したDBサーバ上のインスタンスを手動で停止し、 縮退したDBサーバ上にある稼働中のUDBを縮退状態とする必要があります。
PGHARecovery.sh: | |
---|---|
オンラインリカバリツール本体 | |
pgha_recovery.conf: | |
scpによるオンラインリカバリ設定ファイルのサンプル(両系の postgresql.conf が同じ場合) | |
pgha_recovery_rsync.conf: | |
rsyncによるオンラインリカバリ設定ファイルのサンプル(両系の postgresql.conf が異なる場合) | |
pgha_recovery_scp.conf: | |
scpによるオンラインリカバリ設定ファイルのサンプル(両系の postgresql.conf が異なる場合) | |
recovery_util.sh: | |
pgha_recovery_rsync.conf および pgha_recovery_scp.conf を利用する場合に必要となるサンプルスクリプト |
以降の説明では、次の構成により構成されたDBサーバを元に説明します。
ホスト名 | IPアドレス | UDB1の状態 | UDB2の状態 |
db_active | 192.168.1.101 | 稼働中(1) | 稼働中(1) |
db_fault | 192.168.1.102 | 縮退中(-1) | 稼働中(1) |
構成としては、db_activeとdb_faultの2ノードにより冗長化されたDBサーバが存在し、 各々2つのユーザDB(UDB1、UDB2)を保持しています。 しかし、PostgresForestがdb_faultのUDB1に対する処理を行う中で、 何らかの障害を検知して、db_fault上のUDB1を縮退状態となっている状態です。
オンラインリカバリツールを動作させるための前提条件を以下に示します。
pgha_recovery.conf.sample を元に、各種パラメータを環境に合わせて設定します。 すべての設定が完了したら、PostgreSQLインスタンスの起動ユーザが読み込み可能なファイルパスに配置します。
なお、
PostgreSQLのインストールディレクトリを絶対パスで指定します。
DBクラスタを作成したディレクトリを絶対パスで指定します。
WALアーカイブ先となるディレクトリを絶対パスで指定します。 すでにWALアーカイブモードでトランザクションログの保管をしている場合は、 その保管先のディレクトリとなります。
冗長構成の両DBサーバにログインするスーパーユーザを指定します。
上記のスーパーユーザが接続する際に使用するデータベース名を指定します。 復旧対象のDBクラスタ内に存在する任意のデータベース名で十分であり、基本的に設定例から変更する必要はありません。
上記のスーパーユーザが接続する際に使用するポート番号を指定します。 復旧対象のDBクラスタを構成している postgresql.conf 内の接続設定 port の設定値と同値になります。
リストア元となるデータベースサーバのIPアドレスを指定します。 サーバが複数のIPアドレスを保持する場合は、管理情報データベースの作成時に指定したIPアドレスとしてください。
リストア先となるデータベースサーバのIPアドレスを指定します。 サーバが複数のIPアドレスを保持する場合は、管理情報データベースの作成時に指定したIPアドレスとしてください。
オンラインリカバリ中に再設定されるWAL格納設定 archive_command を指定します。 すでにWALアーカイブモードでトランザクションログの保管をしている場合は、WAL格納設定 archive_command の設定値と同値となります。
復旧対象のサーバに対して、オンラインリカバリ実行中に発生したトランザクションログを適用する際に使用する 保管済みセグメントを取り出すために実行するシェルコマンド restore_command を指定します。 (http://www.postgresql.jp/document/pg831doc/html/continuous-archiving.html#RECOVERY-CONFIG-SETTINGS)
全てのUDBの状態を待ち状態(0)とし、PostgresForestからの問い合わせを抑制した後、活動中のトランザクションが存在しなくなるまでの最大待ち時間[sec]を指定します。 正確には、UDBの状態更新した後、「PostgresForestの管理情報更新間隔の最大値 + この設定値」を超えても活動中のトランザクションが存在する場合、タイムアウトとなります。
オンラインリカバリ実行中に保管される最後のトランザクションログ(pg_stop_backup()実行後の保管されるトランザクションログ)が正常に格納されるまでの最大待ち時間[sec]を指定します。
稼働中のDBサーバから復旧対象のDBサーバに対して、DBクラスタディレクトリを転送する際に使用するコマンドを指定します。 転送完了後にコマンドが終了する必要があり、コマンドの返り値は転送に成功した場合が0、それ以外の場合は0以外である必要があります。 一般的に、DBクラスタのファイルサイズに比例した時間が実行時間と考えられ、ベースリカバリフェーズの所用時間に影響します。
稼働中のDBサーバから復旧対象のDBサーバに対して、保管されたトランザクションログを転送する際に使用するコマンドを指定します。 転送完了後にコマンドが終了する必要があり、コマンドの返り値は転送に成功した場合が0、それ以外の場合は0以外である必要があります。 一般的に、 DBクラスタのファイルサイズおよびDBの更新頻度に比例した時間が実行時間と考えられ、差分リカバリフェーズの所要時間に影響します。
稼働中のDBサーバから、復旧対象のPostgreSQLインスタンスを起動するコマンドを指定します。 起動完了後にコマンドが終了する必要があり、コマンドの返り値は起動に成功した場合が0、それ以外の場合は0以外である必要があります。
オンラインリカバリツールのコマンドは稼働中のDBサーバにおいて、PostgreSQLインスタンスの起動ユーザで実行します。 前述の構成の場合、db_activeにて実行することになります。
稼働中および復旧対象のDBサーバにおけるPostgreSQL実行ユーザのホームディレクトリ内に .pgpass ファイル(http://www.postgresql.jp/document/pg831doc/html/libpq-pgpass.html)を作成します。 内容としては、``psql`` コマンドにより稼働中および復旧対象のDBサーバにログイン可能なスーパーユーザーを記載します。 ただし、UNIXドメインソケットによるアクセスも行いますので、localhostに対するパスワードも記述してください。
前述の構成における記載例を以下に示します。
localhost:5432:*:postgres:pw_postgres 192.168.1.101:5432:*:postgres:pw_postgres 192.168.1.102:5432:*:postgres:pw_postgres
稼働中の管理DBの状態を更新して、 すでに停止している復旧対象のPostgreSQLに含まれる UDB で稼働中のものが存在すれば、すべて縮退中とする。
前述の構成では db_fault サーバに含まれる UDB2 を縮退中に更新する。
設定ファイルが妥当であることを確認後、以下のコマンドを実行します。 また、ベースリカバリフェーズから個別のフェーズを順次実行してもリカバリは可能です。
postgres $ ./PGHARecovery.sh -all pgha_recovery.confのファイルパス
以下のメッセージが表示されれば、正常に終了しています。 復旧対象のDBサーバで運用状態復旧フェーズを実行してください。
execute -cleanup for recovery node
稼働中のDBサーバにPostgreSQLインスタンスの起動ユーザでログインし、以下のコマンドを実行します。
postgres $ ./PGHARecovery.sh -base pgha_recovery.confのファイルパス
以下のメッセージが表示されれば、正常に終了しています。
online recovery (base) successful
稼働中のDBサーバにPostgreSQLインスタンスの起動ユーザでログインし、以下のコマンドを実行します。 APから発行されるトランザクションはJDBCドライバ内で待ち状態となり、 トランザクション開放フェーズが完了した後、トランザクションが再開されます。
postgres $ ./PGHARecovery.sh -closevm pgha_recovery.confのファイルパス
以下のメッセージが表示されれば、正常に終了しています。
online recovery (closevm) successful
稼働中のDBサーバにPostgreSQLインスタンスの起動ユーザでログインし、以下のコマンドを実行します。
postgres $ ./PGHARecovery.sh -sync pgha_recovery.confのファイルパス
以下のメッセージが表示されれば、正常に終了しています。
online recovery (sync) successful
稼働中のDBサーバにPostgreSQLインスタンスの起動ユーザでログインし、以下のコマンドを実行します。
postgres $ ./PGHARecovery.sh -recovery pgha_recovery.confのファイルパス
以下のメッセージが表示されれば、正常に終了しています。
online recovery (recovery) successful
稼働中のDBサーバにPostgreSQLインスタンスの起動ユーザでログインし、以下のコマンドを実行します。
postgres $ ./PGHARecovery.sh -openvm pgha_recovery.confのファイルパス
以下のメッセージが表示されれば、正常に終了しています。
online recovery (openvm) started
稼働中および復旧対象のDBサーバにPostgreSQLインスタンスの起動ユーザでログインし、以下のコマンドを実行します。
postgres $ ./PGHARecovery.sh -cleanup pgha_recovery.confのファイルパス
以下のメッセージが表示されれば、正常に終了しています。
online recovery (cleanup) successful
セキュリティ上の問題が考えられるため、開始時に設置した .pgpass ファイルを削除します。
以下のコマンドを実行後、復旧対象のPostgreSQLインスタンスが起動している場合は停止してください。
postgres $ ./PGHARecovery.sh -cancel pgha_recovery.confのファイルパス
ただし、復旧対象のPostgreSQLインスタンスに含まれるUDBはすべて縮退状態となります。
実行中に出力される可能性のあるエラーメッセージおよび対処方法について、記載します。
引数に指定したオンラインリカバリ構成ファイルパス上にファイルにアクセスできなかった場合に出力されます。
ツールの実行ユーザがアクセス可能なファイルパスにオンラインリカバリ構成ファイルを設置して、異常終了したフェーズを再実行してください。
ベースリカバリフェーズが正常終了しなかった場合に出力されます。
他の出力メッセージを元に障害箇所を特定し、障害に基づいた対処方法を実行してください。
トランザクション閉塞フェーズが正常終了しなかった場合に出力されます。
他の出力メッセージを元に障害箇所を特定し、障害に基づいた対処方法を実行してください。
何らかの原因により差分リカバリフェーズが正常終了しなかった場合に出力されます。
他の出力メッセージを元に障害箇所を特定し、障害に基づいた対処方法を実行してください。
何らかの原因により復旧対象起動フェーズが正常終了しなかった場合に出力されます。
他の出力メッセージを元に障害箇所を特定し、障害に基づいた対処方法を実行してください。
何らかの原因によりトランザクション開放フェーズが正常終了しなかった場合に出力されます。
他の出力メッセージを元に障害箇所を特定し、障害に基づいた対処方法を実行してください。
何らかの原因により運用状態復旧フェーズが正常終了しなかった場合に出力されます。
他の出力メッセージを元に障害箇所を特定し、障害に基づいた対処方法を実行してください。
稼働中のDBサーバから復旧対象のDBサーバへのファイル転送コマンドが正常終了しなかった場合に出力されます。
base_recovery_command で指定されたコマンドが正常終了しなかった原因を取り除き、ベースリカバリフェーズを実行してください。
稼働中のDBサーバから復旧対象のDBサーバへのファイル転送コマンドが正常終了しなかった場合に出力されます。
sync_recovery_command で指定されたコマンドが正常終了しなかった原因を取り除き、差分バックアップフェーズを実行してください。
稼働中のDBサーバで実行された復旧対象のPostgreSQLインスタンスを起動するコマンドが正常終了しなかった場合に出力されます。
instance_startup_command で指定されたコマンドが正常終了しなかった原因を取り除き、復旧対象起動フェーズを実行してください。
稼働中のDBサーバにおいて、ベースバックアップの開始が正常終了しなかった場合に出力されます。
WALアーカイブモードでトランザクションログの保管をしており、定期的にPostgreSQLのオンラインバックアップを実施している場合はその時間帯と重複していないかどうか、ご確認ください。 失敗した原因を取り除いた後、ベースリカバリフェーズを再実行してください。
稼働中のDBサーバにおいて、ベースバックアップの終了が正常終了しなかった場合に出力されます。
WALアーカイブモードでトランザクションログの保管をしており、定期的にPostgreSQLのオンラインバックアップを実施している場合はその時間帯と重複していないかどうか、ご確認ください。 失敗した原因を取り除いた後、差分バックアップフェーズを再実行してください。
idle_wait_timeout で設定された時間が経過したにも関わらず、活動中のトランザクションが存在する場合に出力されます。
その場合、統計情報コレクタの情報( pg_stat_activity ビューなど)から活動中のトランザクションを特定する必要があります。 DBサーバに対する新たなトランザクションがJDBC側で待ち状態となっているため、活動が長時間続くことが想定される場合は、 差分バックアップフェーズ、トランザクション開放フェーズ、サーバ再設定フェーズ(稼動中のみ)の順で実行し、別の時間帯にオンラインリカバリツールを実行してください。 一方、短時間で活動中のトランザクションが終了する場合は再度トランザクション閉塞フェーズを実行してください。
保管されるべきトランザクションログ(pg_stop_backup()実行後の保管されるトランザクションログ)が archive_wait_timeout で指定された時間内に生成されなかった場合に出力されます。
稼働中のDBサーバのディスク空き容量を確認し、``stop wal location`` メッセージにて出力されたファイルが archivexlog_dir ディレクトリ内に生成されていないかどうか、確認してください。 もし生成されていることを確認できたら、差分バックアップフェーズを再実行してください。
PostgreSQLインスタンスのサーバ構成を再設定できなかった場合に出力されます。
実行ユーザとPostgreSQLインスタンスの起動ユーザが一致しているかどうか、ご確認ください。 失敗した原因を取り除いた後、ベースリカバリフェーズを再実行してください。
稼働中のDBサーバに対して、CHECKPOINTが実行できなかった場合に出力されます。
pgha_recovery.conf の設定項目 pg_user 、 pg_db 、 pg_port が適切であるかどうか、ご確認ください。 また、 .pgpass の設定が適切であるかどうかもご確認ください。 失敗した原因を取り除いた後、ベースリカバリフェーズを再実行してください。
postgresql.conf を運用時設定への復旧に失敗した場合に出力されます。
ツールの実行ユーザとPostgreSQLインスタンスの起動ユーザが一致しているかどうか、ご確認ください。 失敗した原因を取り除いた後、運用状態復旧フェーズを再実行してください。
recovery.conf もしくは不要となったアーカイブWALファイルの削除に失敗した場合に出力されます。
ツールの実行ユーザとPostgreSQLインスタンスの起動ユーザが一致しているかどうか、ご確認ください。 失敗の原因が取り除かれたら、異常終了したフェーズを再実行してください。
postgresql.conf 、 recovery.conf の配置に失敗した場合に出力されます。
DBCLUSTERDIR /postgresql.conf.online が生成されているかどうか、 PREFIX /share/recovery.conf.sample が適切に配置されているかどうか、ご確認ください。 失敗した原因を取り除いた後、ベースリカバリフェーズを再実行してください。
管理DBの一覧取得に失敗した場合に出力されます。
pgha_recovery.conf の設定項目 pg_user 、 pg_db 、 pg_port が適切であるかどうか、ご確認ください。 また、 .pgpass の設定が適切であるかどうかもご確認ください。 失敗した原因を取り除いた後、異常終了したフェーズを再実行してください。
管理DB内のUDB状態の変更に失敗した場合に出力されます。
pgha_recovery.conf の設定項目 pg_user 、 pg_db 、 pg_port が適切であるかどうか、ご確認ください。 また、 .pgpass の設定が適切であるかどうかもご確認ください。 失敗した原因を取り除いた後、異常終了したフェーズを再実行してください。
JDBCによる管理DBの読み込み間隔の取得に失敗した場合に出力されます。
pgha_recovery.conf の設定項目 pg_user 、 pg_db 、 pg_port が適切であるかどうか、ご確認ください。 また、 .pgpass の設定が適切であるかどうかもご確認ください。 失敗した原因を取り除いた後、トランザクション閉塞フェーズを再実行してください。
予期せぬ環境で実行された場合に出力されます。
env_check_command で指定されたコマンドが正常終了しなかった原因を取り除き、異常終了したフェーズを再実行してください。
何らかの原因により、不正なファイルが残っている場合に出力されます。
前回、正常に完了していない可能性があるため、どのフェーズまで処理が完了していたかご確認ください。
複数のインスタンスが稼動しているUDBが存在する場合に出力されます。
本スクリプトを実行する上での前提条件をご確認ください。
実行しているサーバが稼働中でない場合に出力されます。
本スクリプトを実行する上での前提条件をご確認ください。