[pgsql-jp: 36755] Re: pgpoolの障害時の動作と、その後の対応方法について
Tatsuo Ishii
ishii @ sraoss.co.jp
2006年 2月 22日 (水) 11:13:48 JST
石井です.
> 松本と申します。
> DBの負荷分散と障害対策を目的とし、pgpoolを負荷分散モードで
> 稼動させる事を計画しています。それに伴い、DB本体では無く
> pgpoolに障害が発生した場合の対応方法についてお聞きしたいと
> 思います。よろしくお願いします。
>
> 想定している構成は以下の通りです
>
> WEB-A
> apache+phpで稼動。localhost:9999でpgpoolに接続
> pgpoolはDB-A、DB-Bに接続している
>
> WEB-B
> apache+phpで稼動。localhost:9999でpgpoolに接続
> WEB-Aとは違うサービスを提供するが、アクセス
> するデータベースはWEB-Aと同じ。
> pgpoolはDB-A、DB-Bに接続している
>
> DB-A,DB-B
> postgresqlが稼動している。WEB-A、WEB-Bからpgpool
> を通してアクセスされる。
> DB-Aがpgpoolのマスタ、DB-Bがセカンダリとする。
>
> この構成において、WEB-Aがメモリのハードウェアエラー等、致命的
> なエラーで動作を停止してしまったとします。この場合、WEB-Aで稼
> 動しているpgpoolも当然停止します。
> pgpoolはマスタに出力してからセカンダリに出力しますが、もし、
> マスタへはコマンドを発行し、セカンダリには発行していないタイ
> ミングでWEB-Aが停止したとしたら、DB-A、DB-Bの整合性はどうなる
> でしょうか。単純に考えると、DB-Aにのみコマンドが発行されてし
> まうような気がします。最後のコマンドが更新系のコマンドだとし
> たら、DB-AとDB-Bの整合性が取れなくなってしまうという事は無い
> でしょうか。
ご指摘の通り,整合性が取れなくなります.
> WEB-Bが存在しないとしたら、WEB-Aが突然終了した場合には、マスタ
> のデータをセカンダリにコピーしてから運用を再開するという運用ル
> ールで乗り切れると思います。しかし、実際にはWEB-Aが停止してか
> らも、WEB-Bのサービスを継続しなければなりません。また、将来的
> にはWEB-A自身もロードバランサー等で冗長化する可能性があります。
>
> このような事故が発生した後でも、WEB-Bのサービスを安全に継続す
> る事は可能でしょうか。
> また予想する通りの問題が起こるとしたら、考えられうる対処方法を
> ご教示頂けましたら幸いです。
明示的なトランザクションを使うと多少危険性は減りそうです.
(M: master, S: secondary)
1-M) BEGIN;
1-S) BEGIN;
2-M) INSERT INTO t1 VALUES(1);
2-S) INSERT INTO t1 VALUES(1);
3-M) COMMIT;
3-S) COMMIT;
1-Mから2-S)のどこでWEB-Aが死んでもOK. 3-Mと3-Sの間にWEB-Aが死ぬとアウ
トですが,それはあきらめるしかないのですが,INSERTよりはCOMMITの方が実
行時間が短いので多少はましかと.
ところで,2相コミットとテーブルロックを使うと,WEB-Aが突然死したことを
検知できるような気がします.
1-M) BEGIN;
1-S) BEGIN;
2-M) LOCK TABLE t1;
2-S) LOCK TABLE t1;
3-M) INSERT INTO t1 VALUES(1);
3-S) INSERT INTO t1 VALUES(1);
4-M) PREPARE TRANSACTION 'foo';
4-S) PREPARE TRANSACTION 'foo';
5-M) COMMIT PREPARED 'foo';
5-S) COMMIT PREPARED 'foo';
1-Mから3-SのどこでWEB-Aが死んでもOKなのは同じ.4-Mと4-Sの間で死んだ場
合は,WEB-Bが待たされるのでわかります.
どうでしょう?
--
Tatsuo Ishii
SRA OSS, Inc. Japan
pgsql-jp メーリングリストの案内