[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 メーリングリストの案内