• 検索結果がありません。

10. ストリーミング・レプリケーション

10.3 フェイルオーバーとスイッチオーバー

マスター・インスタンスに異常が発生し、スレーブ・インスタンスを昇格させることをフ ェイルオーバーと呼び、マスター・インスタンスとスレーブ・インスタンスの役割を交換す る動作をスイッチオーバーと呼びます。

10.3.1 スイッチオーバー

スイッチオーバーを実施するためには、以下の手順で実行します。

① マスター・インスタンスを正常停止

② スレーブ。インスタンスを正常停止

③ 必要であれば両インスタンスのパラメーターを変更

④ 旧スレーブ・インスタンスのrecovery.confファイルを削除

⑤ 旧マスター・インスタンスのrecovery.confファイルを作成

⑥ 両インスタンスの起動

10.3.2 pg_ctl promote コマンド

スレーブ・インスタンスからマスター・インスタンスへ昇格するためには、スレーブ・イ ンスタンスに対してpg_ctl promoteコマンドを実行します。コマンドを実行した直後から スレーブ・インスタンスはマスター・インスタンスとして活動します。下記例ではマスター

側でpg_ctl promoteコマンドを実行していますが、スタンバイ・モードではないためエラ

ーになっています。スレーブ・インスタンスに対するコマンドの実行では「server promoting」

メッセージが出力されて昇格が行われたことがわかります。

例 144 pg_ctl promote

スレーブ・インスタンスが昇格した後でも、これまでマスターだったインスタンスはその まま稼働を続けます。

$ pg_ctl -D data.master promote

pg_ctl: cannot promote server; server is not in standby mode

$ echo $?

1

$

$ pg_ctl -D data.slave promote server promoting

10.3.3 pg_ctl promote コマンドの動作

PostgreSQLのフェイルオーバーは、スレーブ・インスタンスに対するpg_ctl promoteコ

マンドにより実行されます。pg_ctl promoteコマンドは以下の処理を実行しています。

 postmasterのプロセスID取得とチェック

o postmaster.pidファイルの解析を行うことで取得

 Single-Userサーバーでないかのチェック

 recovery.confファイルの存在チェック

 {PGDATA}/promote ファイルの作成

 postmasterプロセスに対してSIGUSR1シグナルの送信

 「server promoting」メッセージ出力

この操作は「src/bin/pg_ctl/pg_ctl.c」ファイルの do_promote 関数内で実行しています。

postmasterプロセスはSIGUSR1を受信するとstartupプロセスに対してSIGUSR2シグ

ナルを送信します。

10.3.4 障害発生時のログ

レプリケーション環境で、マスターまたはスレーブ・インスタンスが停止した場合のログ 出力について検証しました。

□ スレーブ・インスタンスの停止

スレーブ・インスタンスをsmartまたはfastモードで停止した場合、マスター・インス タンスのログには何も出力されません。スレーブ・インスタンスが異常終了した場合には、

以下のログが出力されます。

例 145 スレーブ・インスタンスの異常終了を検知

スレーブ・インスタンスが再起動した場合には以下のログが出力されます(同期レプリケ ーションの場合のみ)。

例 146 同期レプリケーションの再開ログ

□ マスター・インスタンスの停止

マスター・インスタンスが停止した場合、スレーブ・インスタンスには以下のログが出力 されます。

LOG: standby "stdby_1 " is now the synchronous standby with priority 1 LOG: unexpected EOF on standby connection

例 147 マスター・インスタンス停止ログ

マスター・インスタンスが再開すると、以下のログが出力されます。

例 148 同期レプリケーションの再開ログ

FATAL: could not send data to WAL stream: server closed the connection unexpectedly

This probably means the server terminated abnormally before or while processing the request.

LOG: started streaming WAL from primary at 0/5000000 on timeline 1