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