- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- PostgreSQL/Pgpool-II/フェイルオーバー へ行く。
- 1 (2017-11-13 (月) 23:56:36)
- 2 (2017-11-13 (月) 23:57:45)
- 3 (2017-11-23 (木) 16:10:53)
- 4 (2017-11-23 (木) 23:34:19)
- 5 (2017-11-26 (日) 22:39:21)
- 6 (2017-11-27 (月) 00:17:33)
- 7 (2017-11-27 (月) 23:09:27)
- 8 (2017-11-29 (水) 01:26:39)
- 9 (2017-11-29 (水) 22:47:05)
- 10 (2017-12-02 (土) 21:06:08)
- 11 (2017-12-06 (水) 22:12:17)
- 12 (2017-12-08 (金) 22:47:05)
- 13 (2017-12-08 (金) 23:56:04)
- 14 (2017-12-09 (土) 11:43:37)
- 15 (2017-12-13 (水) 21:50:34)
- 16 (2017-12-15 (金) 01:14:08)
- 17 (2018-02-04 (日) 22:32:14)
フェイルオーバー †
フェイルオーバーのタイミング †
フェイルオーバーの内部動作 †
- フェイルオーバー契機が与えられると、フェイルオーバーリクエストが共有メモリ上の待ち行列に書き込まれる。続いて、フェイルオーバー処理依頼のシグナル(SIGUSR1)が親プロセスに送信される。
参考register_node_operation_request() - on https://git.postgresql.org/gitweb/?p=pgpool2.git - フェイルオーバー処理はPgpoolの親プロセスで実行され、以下の関数で行われる。
参考failover() - on https://git.postgresql.org/gitweb/?p=pgpool2.git
failoverプロセス概要 †
failover()関数の処理概要は以下の通りである。(詳細は、ソースコードを参照のこと)
- 共有メモリの待ち行列にスイッチ中のフラグを立て、待ち行列のリクエスト処理ループに入る。
- 待ち行列のセマフォのロック。待ち行列にリクエストがなければ、アンロックして終了。
- 待ち行列からリクエストを取り出し、セフォマのアンロック。
- リクエストが「CLOSE_IDLE_REQUEST」ならば、すべての子プロセスにSIGUSR1シグナルを送信する。
(子プロセスは、SIGUSR1シグナルを受信するとアイドル状態のバックエンド接続を閉じる) - watchdogが有効ならば、watchdogにフェイルオーバー処理を通知する。
- 待ち行列のリクエストごとに以下の分岐
- NODE_UP_REQUESTの場合
途中 - PROMOTE_NODE_REQUESTの場合
途中 - NODE_DOWN_REQUEST && NODE_QUARANTINE_REQUESTの場合
プライマリノードがダウンした場合など、このステップを通過する。NODE_QUARANTINE_REQUESTは、watchdogでクォラムを組んでいる時のリクエスト種別である。ここで、障害でダウンしたデータベースノードを調べる。
- NODE_UP_REQUESTの場合
- 新しいマスタノードを決める。
- 待ち行列のリクエストごとに以下の分岐
- ストリーミングレプリケーションかつNODE_UP_REQUESTかつバックエンドが全てダウンしていない場合
need_to_restart_children = false、partial_restart = false
- ストリーミングレプリケーションかつ(NODE_DOWN_REQUESTまたはNODE_QUARANTINE_REQUEST)かつREQ_DETAIL_SWITCHOVERでプライマリノードでない場合
need_to_restart_children = true、partial_restart = true
- それ以外(プライマリノードダウンはここ)
すべての子プロセスにシグナルSIGQUITが送信される(すべての子プロセスは終了する)。子プロセス再起動のフラグを立てる。
need_to_restart_children = true、partial_restart = false
- ストリーミングレプリケーションかつNODE_UP_REQUESTかつバックエンドが全てダウンしていない場合
- 待ち行列のリクエストがNODE_DOWN_REQUESTの場合、failover_commandに指定されたスクリプトを実行する。新しいプライマリノード候補のpromoteが実行される。
- 新しいプライマリノードを決める。
- ストリーミングレプリケーションモードの場合、follow_master_commandを実行する。この動作は、プロセスをforkして子プロセスで実行される。
- need_to_restart_childrenがtrueであれば、子プロセスの再起動を行なう。