[pgcluster: 589] Re: シーケンス番号の整合性が崩れる

kazunari takahashi kazunari.takahashi @ ctc-g.co.jp
2004年 11月 2日 (火) 12:14:46 JST


三谷様

高橋です.
お世話になっております.

> > # 多分結果は同じだと思いますが,
> > # pglbを経由しなければどうだったでしょうか?

再検証しました.
今回は、複数あるclusterDBの1つに絞って直接インサートしました.
結果は、三谷様の予想通り、以前と変わらずidがずれてしまいます.

> > クエリーが複数に分割されてしまうくらい大きなクエリーは,クラスタDB間でク
> > エリーが投げられる時間に差が生じます.このような大きなクエリーでシーケン
> > ス型データを操作する場合,トランザクションで包んで,nextvalやsetvalを使っ
> > て明示的にシーケンスを操作する必要があるのかもしれません.

最初にidをnextvalで取得して、その値をSQLに明示的に書くということでしょう
か?

それとも、

begin;
INSERT into test (id,name) values ((select nextval('test_id_seq')),'xxxxx・・・・');
commit;

ということでしょうか?
上記のSQLでテストしてみましたが、やはりidがずれてしまいます(当然か。。。)
知識不足で申し訳ございません.

今回は、データがMb単位ということで顕著に検証結果が出ましたが、
現在の検証環境では、データ量が少なくてもidがずれるという現象が発生しています.
(業務上の実データですので、提示することができませんが・・・)

これらの原因が「クラスタDB間のクエリーが投げられる時間差」ならば、
複数に分割されない大きさの更新系クエリを異なるclusterDBに同時実行した場合、
clusterDB間のシーケンス番号の整合性が崩れる可能性が、
PGCLUSTERの設計上ありえるということなのでしょうか?

何度もお聞きして申し訳ございませんが、宜しくお願いいたします.

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
検証内容

####################################
#環境
####################################
pgcluster-1.0.8rc3

pglb × 1 (solaris8 sparc)
clusterDB ×3 (solaris8 sparc)
rgrp × 2 (solaris8 sparc)
####################################
#手順
####################################


----------------------------------------
1. テーブル作成
----------------------------------------

create table test (id serial, name text);

----------------------------------------
2. SQL作成
----------------------------------------

 $ cat zzz.sql
INSERT into test (name) values ('zzz');
INSERT into test (name) values ('zzz');
INSERT into test (name) values ('zzz');
・
・
・
×1000行

$ cat xxx.sql

INSERT INTO test (name) values('
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
・
・
・
8Mb分
');


----------------------------------------
2. SQL実行(pglb上で)
----------------------------------------

$ psql -h clusterA test < zzz.sql

上記コマンド実行中に、違うターミナルで

$ psql -h clusterA test < xxx.sql

----------------------------------------
2. 実行結果(c)
----------------------------------------

clusterDB A:

test=> select id from test where name like '%x%';
 id
-----
 774
(1 row)

clusterDB B:

test=> select id from test where name like '%x%';
 id
-----
 863
(1 row)


高橋 一成 <kazunari.takahashi @ ctc-g.co.jp>




pgcluster メーリングリストの案内