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

Tatsuo Ishii ishii @ sraoss.co.jp
2009年 8月 13日 (木) 18:22:25 JST


> 石田です。
> 
> 2009/08/12 18:49 に Tatsuo Ishii<ishii @ sraoss.co.jp> さんは書きました:
> > 石井です。
> >
> >> こんにちは。石田@苫小牧市です。
> >>
> 
> (中略)
> 
> >> これはおそらく、nextvalのたびに毎回WALに記録するのは
> >> 効率が悪いので、(32 + CACHE)回に一度だけしか
> >> WALには記録しないということだと思います。
> >
> > そのようですね。
> >
> >> sequenceは値が連続することは保証していないので
> >> PostgreSQLのリカバリの仕組みとしてはこれで問題ない
> >> ということだと思います。
> >> (が、pgpoolのリカバリの仕組みとしては、
> >> マスタとスレーブでsequenceの値が異なってしまっては
> >> 困りますね)。
> >>
> >> pgpoolで対応するとすれば、リカバリを行なった後の
> >> 最初の接続時に、nextval/setvalを使って
> >> マスタとスレーブのsequenceを同期させるような
> >> 仕組みを実装する、くらいしか思いつかないのですが。
> >
> > 単なる思いつきですが、「全シーケンスの状態を強制的にWALに書く」というC
> > 関数を作って、リカバリのセカンドステージの頭で呼ぶというのはどうでしょ
> > う?
> >
> > そもそも、そのような関数を現在のPostgreSQLで実装することができるのか、
> > という問題はありますが。
> 
> nextvalだとたまにしかWALに記録されませんが、setvalだと常にWALに
> 記録されるようなので、
> 
> select setval('s1', nextval('s1'), false);
> 
> 的なことをセカンドステージの頭でやれば良さそうです。
> 
> pgpoolに手をいれなくても、pgpool_recovery_pitr
> スクリプトで、 pg_switch_xlog する前に
> ----
> #!/bin/sh
> 
> psql -c "select setval('s1', nextval('s1'), false);" db1
> psql -c "select setval('s2', nextval('s2'), false);" db1
> ...
> psql -c 'select pg_switch_xlog()' postgres
> ----
> と必要なシーケンスを列挙するか、
> 
> 
> ----
> #!/bin/sh
> 
> psql -c "select setval(oid, nextval(oid), false)
> from pg_class where relkind = 'S'" db1
> 
> psql -c 'select pg_switch_xlog()' postgres
> ----
> 
> とすれば、シーケンスの不一致は回避できるのではないか
> と思います(試してませんが)。

なるほど。

nextval()やるので、シーケンスが1個飛んでしまいますが、まあしょうがない
かな。

あとは、pg_databaseをselectして、すべてのDBについて上記処理を行なうよ
うにすれば良さそうですね。
--
Tatsuo Ishii
SRA OSS, Inc. Japan


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