[pgpool-general-jp: 949] レプリケーションモードでのデータ差異チェック方法

松崎 学 matsumana @ gmail.com
2011年 6月 20日 (月) 14:30:10 JST


松崎です。

いつもお世話になっております。

pgpoolをレプリケーションモードで使用しています。
ノードは2台です。

例えば、以下の様なデータがあるテーブルがあるとします。
TBL1
┌────┬────┬────┐
│  COL1  │  COL2  │ COL3   │
├────┼────┼────┤
│ 1      │ 2      │ b      │
├────┼────┼────┤
│ 1      │ 1      │ a      │
├────┼────┼────┤
│ 2      │ 3      │ c      │
└────┴────┴────┘

そのテーブルからデータをTBL2というテーブルに
INSERT SELECTでデータを移す時に、

INSERT INTO TBL2
SELECT NEXTVAL('SEQ_TBL2')
     , COL1
     , COL2
     , COL3
  FROM TBL1
 ORDER BY COL1

というSQLを実行すると、

ノードAでは以下の様な並びになり、
┌────┬────┬────┐
│  COL1  │  COL2  │ COL3   │
├────┼────┼────┤
│ 1      │ 2      │ b      │
├────┼────┼────┤
│ 1      │ 1      │ a      │
├────┼────┼────┤
│ 2      │ 3      │ c      │
└────┴────┴────┘

ノードBでは以下の様な並びになり、
ノード毎にデータ差異が発生してしまう可能性があります。
(この例の場合、ORDER BY COL1では並び順が確定されないので。)
┌────┬────┬────┐
│  COL1  │  COL2  │ COL3   │
├────┼────┼────┤
│ 1      │ 1      │ a      │
├────┼────┼────┤
│ 1      │ 2      │ b      │
├────┼────┼────┤
│ 2      │ 3      │ c      │
└────┴────┴────┘

必ず全てのノードでデータが一致する状態を保つ必要があるのですが、
pgpoolにはデータが一致しなくなった事を検知できるオプションがなさそうなので、
ソースレビューを行う事と、定期的に全てのノードで
データをダンプしてdiffするくらいしか今のところ思いつきません。

レプリケーションモードで開発・運用されている方々はこの様なバグをどのような方法で
テスト・検出されていますか?

使用しているバージョンは
pgpool-II-3.0.1
postgresql-9.0.3

です。

以上、よろしくお願いします。

-- 
松崎 学 <matsumana @ gmail.com>


pgpool-general-jp メーリングリストの案内