[pgcluster: 297] リカバリ中のサービス継続について

fukushima fukushima @ verf.co.jp
2004年 5月 26日 (水) 01:14:50 JST


三谷様

はじめまして、PGClusterを検証させて頂いております、
福島と申します。

レプリケーション機能について、いつくか質問(ご相談)させていただきたく、
宜しくお願いします。

【環境】
バージョン:pgcluster-1.0.6cv14
実機:Solaris9(sparc) 4台
構成:レプリケーション1台、クラスタ3台
	wt001152(マスタクラスタ)
	wt001153(クラスタ)
	wt001154(クラスタ)
	wt001156(レプリケータ)
	wt001159(検証機)

【状況】
・検証機より、insertクエリを1000件(Perlスクリプトにて)wt001153に発行しレプリケーション確認
	→クラスタ3台全てにレプリケーションOK
・上記クエリ中3台目(wt001154)クラスタサーバのpostmasterをkillし、リカバリテスト
	→2台目(wt001153)クラスタは全て連続1000件レプリケーションされるものの、
	 1台目(wt001152)マスタクラスタと3台目(wt001154)クラスタは、
	 rsync後のキューイングが復旧されず

【質問】
上記現象ですが,DEBUGログとソースコードを追いかけてみた結果を以下に示します.
(replicaterのみですが)

  なお,'自プロセスID'と'ファイル:行数'を表示するよう,pgrp/show.c
  (とpgrp/replicate.c, recovery.c, main.cのshow_debugコール部)に
  手を入れています.


【1】 recoveryプロセスのsecond_setup_recoveryまで正常に進行

 DEBUG(16045) send_recovery_packet [recovery.c:706] 2nd master wt001152 - 5432
 DEBUG(16045) send_recovery_packet [recovery.c:708] 2nd target wt001154 - 5432
 DEBUG(16045) send_recovery_packet [recovery.c:710] second_setup_recovery end :1 
 DEBUG(16045) send_recovery_packet [recovery.c:810] wait recovery


【2】 直後の更新クエリから,replicateプロセスでキューイングを開始.
 
 DEBUG(16048) PGRread_packet [replicate.c:2614] read[89] query[                 
                                    insert into id_list values(  '748' )]
 DEBUG(16048) PGRread_packet [replicate.c:1976] query ::                        
                             insert into id_list values(  '748' )
 DEBUG(16048) PGRset_queue [replicate.c:1509] msgsnd header rtn:0
 DEBUG(16048) PGRset_queue [replicate.c:1516] msgsnd query rtn:0
    ※ queryの先頭に53byte程度の空白が入っているのが,少し気になります.動作上
       問題はないと思いますが,メッセージキューの領域が飽和しやすくなるのでは,と...


【3】 rsync終了の通知をリカバリプロセスが受信.

 DEBUG(16045) send_recovery_packet [recovery.c:814] recovery main: selected
 DEBUG(16045) pgrecovery_loop [recovery.c:645] recovery accept port 7778
 DEBUG(16045) read_packet [recovery.c:143] receive packet
 DEBUG(16045) read_packet [recovery.c:823] no = 9
 DEBUG(16045) read_packet [recovery.c:824] max_connect = 256
 DEBUG(16045) read_packet [recovery.c:825] port = 5432
 DEBUG(16045) read_packet [recovery.c:826] recoveryPort = 7779
 DEBUG(16045) read_packet [recovery.c:828] hostName = wt001154
 DEBUG(16045) read_packet [recovery.c:830] pg_data = /data/pgcluster/data
 DEBUG(16045) read_packet [recovery.c:685] receive packet no:9
 DEBUG(16045) read_packet [recovery.c:720] last master wt001152 - 5432
 DEBUG(16045) read_packet [recovery.c:722] last target wt001154 - 5432


【4】 master,targetクラスタ名を正しく認識.

 DEBUG(16045) PGRsend_queue [recovery.c:544] master wt001152 - 5432
 DEBUG(16045) PGRget_HostTbl [recovery.c:553] target wt001154 - 5432


【5】 getDBServerTblでmasterが見つからないため,setDBServerTblでmasterとコネクション確立

 DEBUG(16045) PGRsend_replicate_packet_to_server [replicate.c:1161] host(wt001152) : port(5432)
 DEBUG(16045) getDBServerTbl [replicate.c:148] search host is (wt001152)
 DEBUG(16045) getDBServerTbl [replicate.c:164] not found
 DEBUG(16045) setDBServerTbl [replicate.c:185] host:wt001152 dbName:pgctest
 DEBUG(16045) getDBServerTbl [replicate.c:148] search host is (wt001152)
 DEBUG(16045) getDBServerTbl [replicate.c:164] not found
 DEBUG:  InitPostgres
 DEBUG:  StartTransactionCommand
 DEBUG:  ProcessUtility
 DEBUG:  CommitTransactionCommand
 DEBUG:  StartTransactionCommand
 DEBUG:  ProcessQuery
 DEBUG:  ProcessUtility
 DEBUG:  CommitTransactionCommand
 DEBUG(16045) pgr_createConn [replicate.c:330] PQsetdbLogin ok!!


【6】 以下のメッセージが出て,insert失敗(Solaris環境のみ発現).

 DEBUG(16045) insertDBServerTbl [replicate.c:1257] send_replicate_packet_to_server query=                   
                                  insert into id_list values(  '748' )Mode
 DEBUG(16045) insertDBServerTbl [replicate.c:1270] db:pgctest port:5432 user:postgres host:wt001152 query:                   
                                  insert into id_list values(  '748' )Mode
 DEBUG(16045) insertDBServerTbl [replicate.c:1280] sync_command(SELECT PGR_SYSTEM_COMMAND_FUNCTION(3,1085048789,0) )
 cmd type[I]
 DEBUG:  StartTransactionCommand
 DEBUG:  CommitTransactionCommand
 DEBUG:  StartTransactionCommand
 DEBUG:  AbortCurrentTransaction
 type[I]
 DEBUG(16045) insertDBServerTbl [replicate.c:1344] PQexec send :                    
                                  insert into id_list values(  '748' )Mode
 DEBUG(16045) insertDBServerTbl [replicate.c:1422] PQexec end

  ※ insert文の最後に'Mode'という文字列がついているようです.
     Linux環境では,'Mode'はついておらず,masterへのinsertが成功しています.
       ちなみに,1byte長いinsert文で実験したら,'ode'がinsert文の最後につきました.
       'ode'の後がNull終端されていると推測し,更に3byte長いinsert文で実験したら
       masterへのinsertが成功しました.


【7】 AbortCurrentTransactionが出力されているが,リカバリ処理は
      続行している模様(targetへinsert発行).

 DEBUG(16045) PGRsend_replicate_packet_to_server [replicate.c:1161] host(wt001154) : port(5432)


【8】 targetのアドレス取得に失敗し,コネクションを確立できず
      リカバリ処理が異常終了している模様.(Solaris,Linux共に発現)

 DEBUG(16045) getDBServerTbl [replicate.c:148] search host is (wt001154)
 DEBUG(16045) getDBServerTbl [replicate.c:153] search host(-1744721728):port(5432):db(pgctest)
 DEBUG(16045) getDBServerTbl [replicate.c:164] not found
 DEBUG(16045) setDBServerTbl [replicate.c:185] host:wt001154 dbName:pgctest
 DEBUG(16045) getDBServerTbl [replicate.c:148] search host is (wt001154)
 DEBUG(16045) getDBServerTbl [replicate.c:153] search host(-1744721728):port(5432):db(pgctest)
 DEBUG(16045) getDBServerTbl [replicate.c:164] not found
 ERROR(16045) pgr_createConn [replicate.c:313] PQsetdbLogin failed. close socket!!
 ERROR(16045) pgr_createConn [replicate.c:313] PQsetdbLogin failed. close socket!!
 ERROR(16045) pgr_createConn [replicate.c:313] PQsetdbLogin failed. close socket!!
 ERROR(16045) pgr_createConn [replicate.c:313] PQsetdbLogin failed. close socket!!
 ERROR(16045) pgr_createConn [replicate.c:313] PQsetdbLogin failed. close socket!!
 ERROR(16045) pgr_createConn [replicate.c:325] dbPersistLogin  timeout
 ERROR(16045) pgr_createConn [replicate.c:215] pgr_createConn failed
 ERROR(16045) write_log_file [replicate.c:1233] setDBServerTbl failed
 ERROR(16045) write_log_file [recovery.c:606] PGRsend_replicate_packet_to_server to target error
 DEBUG(16045) write_log_file [recovery.c:624] send_queue return status -1
 ERROR(16045) write_log_file [recovery.c:737] PGRsend_queue failed
 DEBUG(16045) PGRsend_load_balance_packet [recovery.c:810] wait recovery

    ※ pgrp/replicate.c:153行目 のデバッグログに出力されるsearch対象のtargetアドレスが
       master[wt001152]のアドレスになっていますが,target[wt001154]を
       特定できない現象と関連があるでしょうか?


Linux(Redhat8)環境でも同様な環境にて検証いたしましたが、上記のような類似した
現象が発生しております。
更新系の連続運用(対障害性)について重きをおき検証していますが、三谷様の方でも
このような検証実績はございますでしょうか。。。

以上、長くなりましたが宜しくお願い致します。






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