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

ISHIDA Akio iakio @ mono-space.net
2009年 8月 13日 (木) 17:56:27 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
----

とすれば、シーケンスの不一致は回避できるのではないか
と思います(試してませんが)。



> --
> Tatsuo Ishii
> SRA OSS, Inc. Japan
>
>



-- 
ISHIDA Akio <iakio @ mono-space.net/ishida @ cycleof5th.com>


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