[pgpool-general-jp: 56] Re: pgpoolの縮退運転について

ktj @ mrj.biglobe.ne.jp ktj @ mrj.biglobe.ne.jp
2006年 12月 14日 (木) 01:32:00 JST


浅羽さん

山崎と申します。
返答が遅くなり申し訳ございません。

> load_balance_mode = true の場合は考えられますが、通常はそのような挙動
> にはなりません。node2 で実行された SQL が pgpool のログには残っていま
> せんが、直接実行していないでしょうか?

すみません、あまりに同じようなSQLが多かったので見過ごしていましたが
よく見比べてみますと、node2 のみに出力されている、と言っていた
> Dec  5 16:21:57 postgres[19030]: [69709-1] LOG:  statement: SELECT troubleId FROM troubleinfo 
このSQLが pgpoolのログでは 16:21:49、node1のpostgresqlのログでも 16:21:49 に
記録されていました。

ということで、数十秒さかのぼってログを整理してみたところ、
以下のようになっておりました。

	  pgpool	 	node1: postgresql	node2: postgresql
time	  PID	 statement	pid	statement	pid	statement
16:21:34  24658	 SELECT(1)	25579	SELECT(1)	19030	SELECT(1)
16:21:34  24658	 SELECT(2)	25579	SELECT(2)	19030	SELECT(2)
16:21:34  24658	 SELECT(3)	25579	SELECT(3)	19030	SELECT(3)
16:21:34  24658	 SELECT(4)	25579	SELECT(4)	19030	SELECT(4)
16:21:34  24658	 SELECT(5)	25579	SELECT(5)	19030	SELECT(5)
16:21:34  24658	 SELECT(6)	25579	SELECT(6)	19030	SELECT(6)
16:21:34  24658	 SELECT(7)	25579	SELECT(7)	-	ログ記録無し
16:21:35  24714	 SELECT		25354	SELECT		18864	SELECT
16:21:35  24714	 UPDATE		25354	UPDATE		18864	UPDATE
16:21:40  24714	 SELECT		25354	SELECT		18864	SELECT
16:21:40  24714	 UPDATE		25354	UPDATE		18864	UPDATE
16:21:40  24714	 SELECT		25354	SELECT		18864	SELECT
16:21:40  24714	 SELECT		25354	SELECT		18864	SELECT
16:21:42  -	 -		-	-		19030	SELECT(7)    ←16:21:34のSQL
16:21:46  24714	 SELECT		25354	SELECT		18864	SELECT
16:21:46  24714	 UPDATE		25354	UPDATE		18864	UPDATE
16:21:46  24714	 SELECT		25354	SELECT		18864	SELECT
16:21:49  24658	 SELECT(8)	25579	SELECT(8)	-	ログ記録無し
16:21:53  24714	 SELECT		25354	SELECT		18864	SELECT
16:21:53  24714	 UPDATE		25354	UPDATE		18864	UPDATE
16:21:53  24715	 SELECT		25432	SELECT		18946	SELECT
16:21:53  24715	 begin;		25432	begin;		18946	begin;
16:21:53  24714	 SELECT		25354	SELECT		18864	SELECT
16:21:53  21034	 SELECT		22479	SELECT		11717	SELECT
16:21:53  24714	 SELECT		25354	SELECT		18864	SELECT
16:21:53  24715	 SELECT		25432	SELECT		18946	SELECT
16:21:53  24715	 UPDATE		25432	UPDATE		18946	UPDATE
16:21:53  24715	 INSERT(1)	25432	INSERT(1)	18946	INSERT(1)
16:21:53  24715	 INSERT(2)	25432	INSERT(2)	18946	INSERT(2)
16:21:53  24715	 INSERT(3)	25432	INSERT(3)	18946	INSERT(3)
16:21:53  24715	 INSERT(4)	25432	INSERT(4)	18946	INSERT(4)
16:21:53  24715	 DELETE		25432	DELETE		18946	DELETE
16:21:53  24715	 INSERT(5)	25432	INSERT(5)	18946	INSERT(5)
16:21:53  24715	 INSERT(6)	25432	INSERT(6)	18946	INSERT(6)
16:21:53  24715	 INSERT(7)	25432	INSERT(7)	18946	INSERT(7)
16:21:53  24715	 commit;begin;	25432	commit; begin;	18946	commit; begin;
16:21:53  24715	 rollback;begin;25432	rollback; begin;18946	rollback; begin;
16:21:53  24715	 end		25432	end		18946	end
16:21:57  -	 -		-	-		19030	SELECT(8)    ←16:21:49のSQL
16:22:04  24658	 pool_process_query: kind does not match between backends master(C) secondary(D)
16:22:04  24658	 notice_backend_error: master: 1 fail over request from pid 24658		
16:22:04  24586	 starting degeneration. shutdown master host tmm1(5431)				
16:22:04  24586	 degeneration done. shutdown master host tmm1(5431)				
16:22:04  -	 -		-	-	19030	unexpected EOF on client connection
16:22:04  -	 -		25432	unexpected EOF on client connection		
16:22:04  -	 -		-	-	18946	unexpected EOF on client connection
16:22:04  -	 -		25354	unexpected EOF on client connection		
16:22:04  -	 -		-	-	18864	unexpected EOF on client connection
16:22:04  -	 -		22479	unexpected EOF on client connection		
16:22:04  -	 -		-	-	11717	unexpected EOF on client connection

ということで、mismatchが発生した経緯としては、

 (1)  16:21:34 から PID: 24658 のpoolにてnode1(master)とnode2(secondary)の
      Queryの結果が返ってくるのが8秒ほどずれるようになった。
 (2)  16:21:49 に PID:24658 から発行されたSELECTがnode1からはすぐに
      返ってきたので結果を保持。node2からの結果を待つ。
 (3)  16:21:53 に PID: 24715 でテーブルが更新される。
 (4)  16:21:57 にnode2 で実行された 19030 の SELECT(8)では
      更新後のテーブルの結果を 24658 に返したところ、mismatch 発生。

というところだと推測しております。
この場合、pgpool側の設定は変えないで対処しようとするのであれば、
アプリケーション側でテーブルロックをかけないといけない、という
ことになりますでしょうか?


> PID 24658 のログをもう少し前のあたりをいただけると少し現象がわかるかも
> しれません。ログは残っていますでしょうか?

24658 についてはだいぶ遡らないとログがなかったので 16:21:34〜 からの部分を
抽出いたしました。

Dec  5 16:21:34 2006-12-05 16:21:34 LOG:   pid 24658: statement: SELECT Code, ascnt, idcnt FROM table5
Dec  5 16:21:34 LEFT OUTER JOIN ( SELECT Code, COUNT(Id) AS idcnt FROM table1 WHERE Code = '1876622124')
Dec  5 16:21:34 LEFT OUTER JOIN ( SELECT Code, opcode, COUNT(Id) AS idcnt FROM table2 WHERE assigncode = 'CLOSED')
Dec  5 16:21:34 2006-12-05 16:21:34 LOG:   pid 24658: statement: SELECT displayname, lastupdate FROM displaytable1 WHERE Code = '187622105'
Dec  5 16:21:34 2006-12-05 16:21:34 LOG:   pid 24658: statement: SELECT id, name FROM table10 ORDER BY displayorder
Dec  5 16:21:34 2006-12-05 16:21:34 LOG:   pid 24658: statement: SELECT id, name, url, width, height, type FROM table3 ORDER BY displayorder
Dec  5 16:21:34 2006-12-05 16:21:34 LOG:   pid 24658: statement: SELECT Code, id, name, inTime, OutTime, comment FROM operatorgroup WHERE Code = '188723124'
Dec  5 16:21:34 2006-12-05 16:21:34 LOG:   pid 24658: statement: SELECT count(*) FROM table1
Dec  5 16:21:34 WHERE table1.Code = '176262341' AND table1.inTime >= '2006-12-05 00:00'
Dec  5 16:21:34 node1 pgpool:
Dec  5 16:21:49 2006-12-05 16:21:49 LOG:   pid 24658: statement: SELECT Id FROM table1 
Dec  5 16:21:49 LEFT JOIN table2 ON table1.Code = table2.Code
Dec  5 16:21:49 WHERE table1.Code = '195542311' ORDER BY table2.table2dcode ASC, table1.line ASC
Dec  5 16:21:49 node1 pgpool:
Dec  5 16:22:04 ERROR: pid 24658: pool_process_query: kind does not match between backends master(C) secondary(D)
Dec  5 16:22:04  LOG:   pid 24658: notice_backend_error: master: 1 fail over request from pid 24658
Dec  5 16:22:04  LOG:   pid 24586: starting degeneration. shutdown master host node1(5431)
Dec  5 16:22:04  LOG:   pid 5724: statement: set datestyle to 'ISO'; select version(), case when pg_encoding_to_char(1) = 'SQL_ASCII' then 'UNKNOWN' else getdatabaseencoding() end;
Dec  5 16:22:04  LOG:   pid 5724: statement: set client_encoding = 'UNICODE'
Dec  5 16:22:04  LOG:   pid 5724: statement: select count(*) from table4
Dec  5 16:22:04  LOG:   pid 5724: statement: SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ COMMITTED
Dec  5 16:22:04  LOG:   pid 5724: statement: SELECT code FROM table3 WHERE sessionid = '687FE87F4ECDC1B9F6A020FA5CE1B8F8' ORDER BY lastlogindate DESC
Dec  5 16:22:04  LOG:   pid 24586: degeneration done. shutdown master host node1(5431)
Dec  5 16:22:04  LOG:   pid 5724: statement: select count(*) from table2
Dec  5 16:22:04  LOG:   pid 5724: statement: SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ COMMITTED

よろしくおねがいします。




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