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

Tatsuo Ishii ishii @ sraoss.co.jp
2009年 8月 12日 (水) 18:49:47 JST


石井です。

> こんにちは。石田@苫小牧市です。
> 
> 2009/08/11 11:14 に Jun Kuriyama<kuriyama+ml @ s2factory.co.jp> さんは書きました:
> > 2009/08/03 18:39 に <kamisima @ vips.co.jp> さんは書きました:
> >> [環境]
> >> pgpool-2:2.2.2
> >> postgreSql:8.3.7
> >> OS:CentOS5
> >> 2ノードのレプリケーションモード
> >
> >  まだちゃんと追えていないのですが、私も最近同じような現象に遭遇しました。
> >
> > 上記との違いは OS が FreeBSD 7.1 なことくらいです。
> >
> > PostgreSQL 側で statement log を出すようにした時に、LOCK TABLE がちゃんと
> > 出ていることは確認しました。
> >
> 
> おそらく原因は、
> PostgreSQLのsequenceが、nextvalした時に毎回WALに記録される
> わけでは無いためのようです。
> 
> 例えばpsqlから直接PostgreSQLに接続し、
> 
> =# CREATE SEQUENCE s1;
> CREATE SEQUENCE
> =# SELECT nextval('s1');
>  nextval
> ---------
>        1
> (1 row)
> 
> =# SELECT nextval('s1');
>  nextval
> ---------
>        2
> (1 row)
> 
> としたところで、
> pg_ctl stop -mimmediate
> し、再起動した後に再度nextvalすると、
> 
> =# SELECT nextval('s1');
>  nextval
> ---------
>       35
> (1 row)
> 
> となります(8.4.0での実行例です)。
> 
> これはおそらく、nextvalのたびに毎回WALに記録するのは
> 効率が悪いので、(32 + CACHE)回に一度だけしか
> WALには記録しないということだと思います。

そのようですね。

> sequenceは値が連続することは保証していないので
> PostgreSQLのリカバリの仕組みとしてはこれで問題ない
> ということだと思います。
> (が、pgpoolのリカバリの仕組みとしては、
> マスタとスレーブでsequenceの値が異なってしまっては
> 困りますね)。
> 
> pgpoolで対応するとすれば、リカバリを行なった後の
> 最初の接続時に、nextval/setvalを使って
> マスタとスレーブのsequenceを同期させるような
> 仕組みを実装する、くらいしか思いつかないのですが。

単なる思いつきですが、「全シーケンスの状態を強制的にWALに書く」というC
関数を作って、リカバリのセカンドステージの頭で呼ぶというのはどうでしょ
う?

そもそも、そのような関数を現在のPostgreSQLで実装することができるのか、
という問題はありますが。
--
Tatsuo Ishii
SRA OSS, Inc. Japan


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