[pgpool-general-jp: 1381] Re: ドキュメントバグ? Streaming Replicationでのクエリ振り分けについて

Tatsuo Ishii ishii @ sraoss.co.jp
2015年 8月 5日 (水) 10:17:18 JST


上原様

お世話になっています。SRA OSS石井です。

ノード0がプライマリだと仮定して、そもそもDECLAREがノード1に負荷分散され
ているのがおかしいですね。まずはここから調べてみます。
--
Tatsuo Ishii
SRA OSS, Inc. Japan
English: http://www.sraoss.co.jp/index_en.php
Japanese:http://www.sraoss.co.jp

> SRA OSS石井様
> 
> 上原です。
> お世話になっております。
> 
> 
> ご確認いただきありがとうございます。
> マニュアルの修正、よろしくお願いします。
> 
> 五月雨になってしまい申し訳ないのですが、「SHOW」もDECLAREと同様で
> PRIMARYに振られているようです。(pgpool-II 3.4.2)
> マニュアルではロードバランシングの対象と記載されているので、DECLARE
> と合わせて修正いただけると幸いです。
> 
> 
> 以下、確認ログです。
> 
> 念のため、src/context/pool_query_context.cに以下のデバッグログを入れて
> 確認しております。
> 
> ----------------
>         /*
>          * Other statements are sent to primary
>          */
>         ereport(LOG,(errmsg("[debug_k] Other statements")));←★追加
>         return POOL_PRIMARY;
>     }
> --------------
> 
> 
> $ psql -h 192.168.1.3 -p 9999 -U user1 testdb -c "show SERVER_VERSION"
> 
> pgpool.log
> ---------
> 2015-08-04 19:30:29: pid 15678: LOG:  [debug_k] Other statements
> 2015-08-04 19:30:29: pid 15678: LOG:  DB node id: 0 backend pid: 13625 statement: show SERVER_VERSION
> ---------
> 
> 
> 
>> ところで2.2.6のコミットログ(ed5a6338cc83fc00ffdac89025eb7a59d6024d4b)を
>> 見直してみると、"Fix is_select_query() not to allow cursor statements.
>> Close() should not allowed since hold cursor + update may cause data
>> inconsistency." とあるのですが、正直自分がコミットしたにも関わらず自分
>> でもなぜこのように考えたのか覚えていません:-)
>>
>> うーん、思い出せるかどうか頑張ってみます。
> 
> 
> <以下、余談です。>
> 
> 試しにDECLAREをロードバランシングさせてみたのですが、以下のようなエラー
> が出力されました。
> 
> 実施概要:JDBC使用(AutoCommit OFF)
>      DECLARE後にFETCHを何回か実行する
> 
> pgpool.log
> ---------------
> 2015-08-04 19:55:53: pid 16692: LOG:  DB node id: 0 backend pid: 13731 statement: Execute: BEGIN
> 2015-08-04 19:55:53: pid 16692: LOG:  DB node id: 1 backend pid: 24379 statement: Execute: BEGIN
> 2015-08-04 19:55:53: pid 16692: LOG:  DB node id: 1 backend pid: 24379 statement: Parse: DECLARE cur2 CURSOR WITH HOLD FOR SELECT * FROM bar2
> 2015-08-04 19:55:53: pid 16692: LOG:  DB node id: 1 backend pid: 24379 statement: B message
> 2015-08-04 19:55:53: pid 16692: LOG:  DB node id: 1 backend pid: 24379 statement: D message
> 2015-08-04 19:55:53: pid 16692: LOG:  DB node id: 1 backend pid: 24379 statement: Execute: DECLARE cur2 CURSOR WITH HOLD FOR SELECT * FROM bar2
> 2015-08-04 19:55:53: pid 16692: LOG:  [debug_k] Other statements
> 2015-08-04 19:55:53: pid 16692: LOG:  DB node id: 0 backend pid: 13731 statement: Parse: FETCH FIRST FROM cur2
> 2015-08-04 19:55:53: pid 16692: LOG:  DB node id: 0 backend pid: 13731 statement: B message
> 2015-08-04 19:55:53: pid 16692: LOG:  DB node id: 0 backend pid: 13731 statement: D message
> 2015-08-04 19:55:53: pid 16692: LOG:  DB node id: 0 backend pid: 13731 statement: Execute: FETCH FIRST FROM cur2
> 2015-08-04 19:55:53: pid 16692: LOG:  pool_send_and_wait: Error or notice message from backend: : DB node id: 0 backend pid: 13731 statement: "FETCH FIRST FROM cur2" message: "cursor "cur2" does not exist"
> 2015-08-04 19:55:53: pid 16692: LOG:  DB node id: 1 backend pid: 24379 statement: ABORT
> 2015-08-04 19:55:53: pid 16692: LOG:  DB node id: 0 backend pid: 13731 statement: ABORT
> ----------------
> 
> DECLAREをnode:1で実行したあとにFETCHがnode:0に向いていたのでエラーに
> なっていました。ですので、もしカーソル系を分散させたいなら全nodeに
> DECLAREをしたりするのでしょうか?
> # もともと外された理由を理解できていないので、トンチンカンなことを
>  言っていたらすみません。
> 
> 
> 以上です。
> よろしくお願いします。
> 
> 
> (2015/08/04 17:48), Tatsuo Ishii wrote:
>> 上原様
>> 
>> お世話になっています。SRA OSS石井です。
>> 
>>> 上原と申します。
>>> お世話になっております。
>>>
>>> pgpool-II 3.4.2 でロードバランシングの対象となるSQLについて確認して
>>> いたところ、マニュアルの記述に誤りと思われる箇所がありました。
>>> ご確認いただけないでしょうか。
>>>
>>> ---------
>>> ○Streaming Replicationでのクエリ振り分け
>>> ・Primary/Standbyどちらにも送ることのできる問い合わせ。
>>>  - DECLARE, FETCH, CLOSE
>>> ---------
>>> (pgpool-II マニュアルから一部抜粋)
>>>
>>> 上記のように記載されているのですが、確認したところカーソル系のSQLは
>>> ロードバランシングの対象とはなっておらず、全てPrimaryに向けられて
>>> いるようです。
>>>
>>> src/context/pool_query_context.c
>>> send_to_where()
>>> -------
>>> 1213                 /*
>>> 1214                  * Other statements are sent to primary
>>> 1215                  */
>>> 1216                 return POOL_PRIMARY;
>>> -------
>>> ここで、DeclareCursorStmtはPOOL_PRIMARYに落ちているかと思います。
>>>
>>>
>>> # 調べた後で気づきましたが、
>>>    2.2.6 のリリースノートにDECLAREをロードバランシングの対象から外した
>>>    という記述がありましたので、おそらくその時期から残っていたのかと思います。
>> 
>> 仰るとおりで、マニュアルの記述が更新されていないようです。修正いたします。
>> ご指摘ありがとうございました。
>> 
>> ところで2.2.6のコミットログ(ed5a6338cc83fc00ffdac89025eb7a59d6024d4b)を
>> 見直してみると、"Fix is_select_query() not to allow cursor statements.
>> Close() should not allowed since hold cursor + update may cause data
>> inconsistency." とあるのですが、正直自分がコミットしたにも関わらず自分
>> でもなぜこのように考えたのか覚えていません:-)
>> 
>> うーん、思い出せるかどうか頑張ってみます。
>> --
>> Tatsuo Ishii
>> SRA OSS, Inc. Japan
>> English: http://www.sraoss.co.jp/index_en.php
>> Japanese:http://www.sraoss.co.jp
> 
> 
> -- 
> 上原 一樹 (Kazuki Uehara)
> Mail : uehara.kazuki @ lab.ntt.co.jp
> Phone: 03-5860-5115
> 
> _______________________________________________
> pgpool-general-jp mailing list
> pgpool-general-jp @ sraoss.jp
> http://www.sraoss.jp/mailman/listinfo/pgpool-general-jp


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