[pgpool-general-jp: 582] オンラインリカバリを実施するとノード間のシーケンスがずれる

kamisima @ vips.co.jp kamisima @ vips.co.jp
2009年 8月 3日 (月) 18:39:36 JST


お世話になっております。神島と申します。

[環境]
pgpool-2:2.2.2
postgreSql:8.3.7
OS:CentOS5
2ノードのレプリケーションモード


オンラインリカバリで困っていることがあるのでアドバイスしていただきたいです。

2ノードのレプリケーションモードで、INSERT_LOCKはTRUEで運用しています。
縮退運転になった時オンラインリカバリを実施すると、
データの内容は同期されるのですが、シーケンスがずれてしまいます。

たとえば、以下のようなテーブルを作成します。
test_tab(
  col1  bigserial,
  col2  varchar2(10) )
そうすると、test_tab_col1_seqというシーケンスが自動的に作成されて、
col1にはtest_tab_col1_seqから連番が振られていきます。
縮退運転中、正常ノードのcol1が500まで進んで、障害ノードのほうは400で止まっているとします。
この状態でインサートを継続したままオンラインリカバリを実行します。
リカバリ完了後テーブルを確認すると、
途中まで(たとえば600まで)は期待通り同期されているのに、
途中から障害ノードのシーケンスが中抜きされるというような現象が発生します。
(同じデータでも正常ノードでは601、障害ノードでは610が振られる)

それ以降ずっと同じデータでもcol1には違う番号が振られていきます。
この現象はインサート処理とオンラインリカバリを同時に実行した場合にのみ発生します。
アプリケーションの特性として常にインサートが発生しています。

INSERT_LOCK=TRUEにしてもテーブルはロックされるけどシーケンスはロックされないのか、
強制的に同期させる方法はないか、
確実に連番が振られるような代替策はないかなどいろいろ考えていますが、いい方法が見つかりません。

よろしくお願いいたします。



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