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