[pgsql-jp: 36709] Re: pgpool使用時のSERIAL型の取り扱いについて

Tatsuo Ishii ishii @ sraoss.co.jp
2006年 2月 9日 (木) 22:48:46 JST


石井です.

> 伊藤と申します。
> 
> pgpool 2.6にてSERIAL型を含むテーブルの同期を取ることができるようになった
> と認識しておりますが、下記SQLを発行した場合同期がとれず困っております。
> select nextval('hoge_seq')
> 環境としてはDBサーバAをマスタとし(PostgreSql+pgpool)でDBサーバ
> B(PostgreSqlのみ)をセカンダリとしています。
>
> いろいろ試した結果以下の2つの方法ではPHPプログラムからでも、psql上からで
> も同期がとれました。SQL発行はDBサーバAのport5432に見えるPostgreSqlです。
> 成功例1
> begin
> select nextval('hoge_seq')
> commit
> 
> 成功例2
> /*INSERT LOCK*/ select nextval('hoge_seq')
> 
> 例2の記述=insert_lockディレクティブがtrueと認識していましたが間違ってい
> るのでしょうか?
> 可能であれば、明示的にトランザクションを掛けたり/*INSERT LOCK*/を記述し
> たくなく、いい解決があればと思っています。
> また、成功例1についてはトランザクション内ですがロックを掛けておりません。
> これでもうまくいってしまうのもよくわかりませんでした。
> 
> pgpoolの設定ミスかも知れませんが、ご存知の方がいらっしゃいましたら、ご教
> 授ください。

同期が取れない原因は,load_balance_modeが有効になっていて,

select nextval('hoge_seq')

がmasterかsecondaryのどちらか一方にしか発行されないからです.

load balance modeは,明示的なトランザクションブロックになっている(成功
例1)か,select文が正確に"SELECT"(大文字小文字の違いは無視)で始まってい
ない(成功例2)では無効になるので,いまくいくわけです.

ちなみに,insert_lockは,INSERT文でないと効かないので,ここではうまく
働いていません(insert_lockは,sequenceではなく,SERIAL型と一緒に使うこ
とを想定しています).

ところで,「成功例」ということですが,select nextval('hoge_seq')を発行
するセッションが同時に複数あるとうまくいかないと思います.複数同時セッ
ションでもうまくいくようにするためには,たかだか一つのセッションしか同
時にはselect nextval('hoge_seq')を実行できないように制御しなければなり
ません.一番いいのは,テーブルロックを使って,

BEGIN;
LOCK TABLE t1; <-- どんなテーブルでもいい
select nextval('hoge_seq')
:
:
END;

とすることです.

そうではなくて,同時セッションがないのであれば,上記成功例で問題ありま
せん.その場合,SQL文に手を入れずに目的を達成したいのであれば,
load_balance_modeを無効にするしかないでしょう.
--
Tatsuo Ishii
SRA OSS, Inc. Japan

> 
> ちなみにpgpoolの設定は下記のようになります。
> (以下はpool_statusで表示された中から関係なさそうなのを省いた物です。)
>  port                         | 5432          
>  socket_dir                   | /tmp          
>  backend_host_name            | 192.168.0.201 
>  backend_port                 | 5431          
>  secondary_backend_host_name  | 192.168.0.202 
>  secondary_backend_port       | 5431          
>  connection_life_time         | 0             
>  replication_mode             | 1             
>  replication_strict           | 1             
>  replication_timeout          | 5000          
>  load_balance_mode            | 1             
>  replication_stop_on_mismatch | 0             
>  print_timestamp              | 1             
>  master_slave_mode            | 0             
>  connection_cache             | 1             
>  insert_lock                  | 1             
>  current_backend_host_name    | 192.168.0.201 
>  current_backend_port         | 5431          
>  replication_enabled          | 1             
>  master_slave_enabled         | 0             
> 
> --------------------------------------
> GANBARE! NIPPON!
> Yahoo! JAPAN JOC OFFICIAL INTERNET PORTAL SITE PARTNER
> http://pr.mail.yahoo.co.jp/ganbare-nippon/
> 



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