#author("2017-11-23T16:10:53+09:00","default:haikikyou","haikikyou")
[[PostgreSQL/Pgpool-II]]

* フェイルオーバー[#geff8edc]

* フェイルオーバーのタイミング [#wd6a49a5]

* フェイルオーバーの内部動作 [#w52db569]

- フェイルオーバー契機が与えられると、フェイルオーバーリクエストが共有メモリ上の待ち行列に書き込まれる。続いて、フェイルオーバー処理依頼のシグナル(SIGUSR1)が親プロセスに送信される。~
&label(warn){参考};[[register_node_operation_request()>https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob;f=src/main/pgpool_main.c;h=a7a6b32f35b487af5ecd9726b6353d380318f7e7;hb=refs/heads/V3_6_STABLE#l620]] - &size(11){&color(gray){on https://git.postgresql.org/gitweb/?p=pgpool2.git};};
- フェイルオーバー処理はPgpoolの親プロセスで実行され、以下の関数で行われる。~
&label(warn){参考};[[failover()>https://git.postgresql.org/gitweb/?p=pgpool2.git;a=blob;f=src/main/pgpool_main.c;h=a7a6b32f35b487af5ecd9726b6353d380318f7e7;hb=refs/heads/V3_6_STABLE#l1595]] - &size(11){&color(gray){on https://git.postgresql.org/gitweb/?p=pgpool2.git};};

** failoverプロセス概要 [#f5e25664]
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かつバックエンドが全てダウンしていない場合~
&code(need_to_restart_children = false、partial_restart = false);
---ストリーミングレプリケーションかつ(NODE_DOWN_REQUESTまたはNODE_QUARANTINE_REQUEST)かつREQ_DETAIL_SWITCHOVERでプライマリノードでない場合~
&code(need_to_restart_children = true、partial_restart = true );
---それ以外(''プライマリノードダウンはここ'')~
すべての子プロセスにシグナルSIGQUITが送信される(すべての子プロセスは終了する)。子プロセス再起動のフラグを立てる。~
&code(need_to_restart_children = true、partial_restart = false );
++ 待ち行列のリクエストがNODE_DOWN_REQUESTの場合、failover_commandに指定されたスクリプトを実行する。新しいプライマリノード候補のpromoteが実行される。
++ 新しいプライマリノードを決める。
++ ストリーミングレプリケーションモードの場合、follow_master_commandを実行する。この動作は、プロセスをforkして子プロセスで実行される。
++ need_to_restart_childrenがtrueであれば、子プロセスの再起動を行なう。
* 参考リンク [#v65d9c9a]

- [[Pgpool-II内部情報セミナー 第1回>http://www.pgpool.net/pgpool-web/contrib_docs/pgpool-II-internal-1.pdf]] - &size(11){&color(gray){ http://www.pgpool.net/pgpool-web/contrib_docs/pgpool-II-internal-1.pdf };};

トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
目次
ダブルクリックで閉じるTOP | 閉じる
GO TO TOP