[pgcluster: 222] Re: 障害によるスタンドアローン構成への切替検証

mitani mitani @ sraw.co.jp
2004年 3月 30日 (火) 19:46:03 JST


三谷@広島です.

> 【結果】
> (1)クラスタサーバ1(マスタ)への擬似APによるinsert処理は、
>    pgreplicate停止直後から、1件につき10秒経過したところで
>    エラーとなる。
> (2)クラスタサーバ1(マスタ)のDBに対し、psqlで新たなConnectionを
>    張った直後、擬似APによるinsert処理が正常に行われた。
これは[pgcluster: 215]で石田さんからの報告にもあったように,コネクション
が切れるまでレプリケーションサーバの異常をとれない,という不具合です.
ロック監視の機能を追加した際に作りこんでしまいました.
この不具合については,ほぼ修正できたのですが,レプリケーションサーバを強
制停止させる試験を行っていて目に付いた問題がありまして,現在はその修正を
行っています.

実は,この問題は起こるであろうことは以前から予測されていたのですが,
2相コミットを使っても解決できないし,解決方法も思いつかず,後回しにして
きました.

どういう問題かというと,
データ更新クエリーのレプリケーション中に,レプリケーションサーバに障害が
発生した場合,レプリケーションされたクラスタDBと,されなかったクラスタDB
が出来てしまい,データの整合性が崩れる可能性がある
というものです.

レプリケーションサーバが1台だけであれば,レプリケーションサーバの障害以
降はレプリケーションされなくなりますので,あまり問題が無いのですが,
レプリケーションサーバが2台以上ある場合,予備のレプリケーションサーバに
自動的に切り替わってしまいますので,データの整合性が崩れても,そのまま動
いてしまい,どんどんデータの整合性が崩れていく可能性があります.

今回実装を試みている方法は以下の手順です.
1.レプリケーションサーバがレプリケーションする前に,予備(下位)のレプ
リケーションサーバにクエリーを投げる.
2.予備(下位)のレプリケーションサーバはクエリー(トランザクション)を
保存する.
3.マスタ(上位)のレプリケーションサーバに障害が発生した場合,
予備(下位)のレプリケーションサーバは保存しているクエリー(トランザクショ
ン)を使って再レプリケーションを行う.
4.クラスタDBは再レプリケーションされたクエリーを判定し,既に処理したも
のは無視し,未処理のクエリーのみ処理する.

この方法を使えば,レプリケーション途中にレプリケーションサーバが停止して
もデータの整合性を保証することができるようになると思っています.
とりあえず「2相リカバリー」と呼んでいますが,しっくりこないので,もっと
ぴったりの名前があったら,どなたか名前を付けてやってください.


=============================
STATUS:2相リカバリー実装中
三谷 篤<mitani @ sraw.co.jp>
=============================





pgcluster メーリングリストの案内