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