[pgcluster: 457] リカバリー終了時時にシーケンスが同期されない
kazunari takahashi
kazunari.takahashi @ ctc-g.co.jp
2004年 8月 5日 (木) 22:38:49 JST
高橋です.
お世話になっております.
リカバリー検証をしております.
リカバリー中にloadbalancer経由で更新系のクエリを発行しても、
正常にリカバリできません.
クエリを発行しなければリカバリできます.
度々申し訳ありませんが、ご教授願えませんでしょうか?
####################################
現象
####################################
・リカバリーしたclusterDBのシーケンス番号が、masterDBと整合性が取れていない.
####################################
#環境
####################################
pgcluster-1.0.7av11
pglb × 1 (solaris8 sparc)
clusterDB ×3 (solaris8 sparc) host名:serverA , serverB , serverC
rgrp × 1 (solaris8 sparc)
-------------------------
1.テーブル作成
-------------------------
test=> create TABLE test(id serial , name varchar(10));
NOTICE: CREATE TABLE will create implicit sequence 'test_id_seq' for SERIAL column 'test.id'
CREATE TABLE
-------------------------
2.データをloadbalancer経由でインサート
-------------------------
test=> insert into test(name) values('a');
INSERT 33366 1
3clusterDBとも正常にインサートされる.
----------------------------
3.serverCのpostmasterを落とす
-----------------------------
test=> insert into test(name) values('b');
サーバA,Bには正常にインサート
test=> select * from test ;
id | name
----+------
1 | a
2 | b
----------------------------
3.更にインサート
----------------------------
test=> insert into test(name) values('b');
#pgreplicate.sts,pglb.stsに以下のメッセージ
Thu Aug 5 21:19:29 2004 port(5432) host:serverC error
----------------------------
4.serverCのpostmasterを起動
----------------------------
$ pg_ctl start -D /usr/local/pgsql/data -o "-i -R"
Start in recovery mode!
Please wait until a data synchronization finishes from Master DB...
postmaster successfully started
----------------------------
5.更にインサートを5件
----------------------------
test=> insert into test(name) values('c');
「OK! The data synchronization with Master DB was finished.」のメッセー
ジが出る前に上記SQLをloadblancerから5回実行
----------------------------
6.結果確認
----------------------------
OK!〜メッセージが出てからしばらくして確認.
serverA,serverB:
test=> select * from test ;
id | name
----+------
1 | a
2 | b
3 | c
4 | c
5 | c
6 | c
7 | c
(7 rows)
serverC:
test=> select * from test ;
id | name
----+------
1 | a
2 | b
3 | c
4 | c
5 | c
6 | c
35 | c
-------------------------------------------------------------
DEBUGログ
-------------------------------------------------------------
DEBUG(send_recovery_packet): 2nd master serverA - 5432
DEBUG(send_recovery_packet): 2nd target serverC - 5432
DEBUG(send_recovery_packet): second_setup_recovery end :1
DEBUG(replicate_loop): wait replicate
DEBUG(pgrecovery_loop): recovery accept port 7778
DEBUG(replicate_loop): wait replicate
DEBUG(replicate_loop): wait replicate
DEBUG(replicate_loop): wait replicate
DEBUG(read_packet): receive packet no:9
DEBUG(read_packet): last master serverA - 5432
DEBUG(read_packet): last target serverC - 5432
DEBUG(PGRsend_queue): master serverA - 5432
DEBUG(PGRget_HostTbl): target serverC - 5432
DEBUG(PGRget_HostTbl): msgrcv[INSERT INTO test (name) VALUES ('c')]
DEBUG(PGRsend_replicate_packet_to_server): host(serverA) : port(5432)
DEBUG(getTransactionTbl): hit !! transaction tbl host serverA db:test pid:1377
6
DEBUG(getTransactionTbl): db:test port:5432 user:test host:serverA query:INSERT INTO test (name) VALUES ('c')
DEBUG(getTransactionTbl): sync_command(SELECT PGR_SYSTEM_COMMAND_FUNCTION(3,1091
709812,837395,2) )
DEBUG(getTransactionTbl): PQexec send :INSERT INTO test (name) VALUES ('c')
DEBUG(getTransactionTbl): PQexec end
DEBUG(PGRsend_replicate_packet_to_server): host(serverC) : port(5432)
DEBUG(getTransactionTbl): not found in transaction tbl host serverB db:test pi
d:13776
DEBUG(getTransactionTbl): not found in getTransactionTbl
DEBUG(getTransactionTbl): not found in transaction tbl host serverB db:test pi
d:13776
DEBUG(pgr_createConn): PQsetdbLogin host[serverC] port[5432] db[test] user[test]
DEBUG(pgr_createConn): PQsetdbLogin ok!!
DEBUG(insertTransactionTbl): db:test port:5432 user:test host:serverC query:INSERT
INTO test (name) VALUES ('c')
DEBUG(insertTransactionTbl): sync_command(SELECT PGR_SYSTEM_COMMAND_FUNCTION(3,1
091709812,837395,2) )
DEBUG(insertTransactionTbl): PQexec send :INSERT INTO test (name) VALUES ('c')
DEBUG(insertTransactionTbl): PQexec end
DEBUG(delete_template): send_queue return status 0
DEBUG(delete_template): PGRsend_queue ok
高橋 一成 <kazunari.takahashi @ ctc-g.co.jp>
pgcluster メーリングリストの案内